"use client"; import { useState } from "react"; import { Edit, X, Save } from "lucide-react"; import { api } from "@/lib/api"; import { toast } from "sonner"; import { GradientSpinner } from "./ui/GradientSpinner"; interface MetadataEditorProps { type: "artist" | "album" | "track"; id: string; currentData: { name?: string; title?: string; bio?: string; genres?: string[]; year?: number; mbid?: string; rgMbid?: string; coverUrl?: string; heroUrl?: string; // Original values for comparison (when user overrides exist) _originalName?: string; _originalBio?: string | null; _originalGenres?: string[]; _originalHeroUrl?: string | null; _originalTitle?: string; _originalYear?: number | null; _originalCoverUrl?: string | null; _hasUserOverrides?: boolean; }; onSave?: (updatedData: any) => void; } /** * Metadata Editor Component * Plex/Kavita-style metadata editor with pencil icon * Opens a modal for editing artist/album/track metadata */ export function MetadataEditor({ type, id, currentData, onSave, }: MetadataEditorProps) { const [isOpen, setIsOpen] = useState(false); const [isSaving, setIsSaving] = useState(false); const [isResetting, setIsResetting] = useState(false); const [formData, setFormData] = useState(currentData); const hasOverrides = currentData._hasUserOverrides ?? false; const handleOpen = () => { setFormData(currentData); setIsOpen(true); }; const handleClose = () => { setIsOpen(false); setFormData(currentData); }; const handleReset = async () => { if ( !confirm( "Reset all metadata to original values? This cannot be undone." ) ) { return; } setIsResetting(true); try { if (type === "artist") { await api.resetArtistMetadata(id); } else if (type === "album") { await api.resetAlbumMetadata(id); } else { await api.resetTrackMetadata(id); } toast.success("Metadata reset to original values"); onSave?.(null); setIsOpen(false); } catch (error: any) { toast.error(error.message || "Failed to reset metadata"); } finally { setIsResetting(false); } }; const handleSave = async () => { setIsSaving(true); try { // Call API to update metadata let response; if (type === "artist") { response = await api.updateArtistMetadata(id, formData); } else if (type === "album") { response = await api.updateAlbumMetadata(id, formData); } else { response = await api.updateTrackMetadata(id, formData); } toast.success( `${ type === "artist" ? "Artist" : type === "album" ? "Album" : "Track" } metadata updated` ); onSave?.(response); setIsOpen(false); } catch (error: any) { console.error("Failed to update metadata:", error); toast.error(error.message || "Failed to update metadata"); } finally { setIsSaving(false); } }; const handleChange = (field: string, value: any) => { setFormData((prev) => ({ ...prev, [field]: value })); }; return ( <> {/* Pencil Icon Button */} {/* Modal */} {isOpen && (
Original:{" "} {currentData._originalName}
)} {type !== "artist" && currentData._originalTitle && currentData._originalTitle !== (formData.title || "") && (Original:{" "} {currentData._originalTitle}
)}Original:{" "} {currentData._originalYear}
)}Original:{" "} {currentData._originalGenres.join( ", " )}
)}Original:{" "} {currentData._originalHeroUrl}
)} {type === "album" && currentData._originalCoverUrl && currentData._originalCoverUrl !== (formData.coverUrl || "") && (Original:{" "} {currentData._originalCoverUrl}
)} {/* Image Preview */} {(formData.heroUrl || formData.coverUrl) && (Note: Manually edited metadata will not be overwritten by automatic enrichment.