"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 && (
{/* Header */}

Edit{" "} {type === "artist" ? "Artist" : type === "album" ? "Album" : "Track"}{" "} Metadata

{/* Content */}
{/* Name/Title */}
handleChange( type === "artist" ? "name" : "title", e.target.value ) } className="w-full px-4 py-2 bg-[#181818] border border-white/10 rounded text-white focus:border-white/30 focus:outline-none" /> {type === "artist" && currentData._originalName && currentData._originalName !== (formData.name || "") && (

Original:{" "} {currentData._originalName}

)} {type !== "artist" && currentData._originalTitle && currentData._originalTitle !== (formData.title || "") && (

Original:{" "} {currentData._originalTitle}

)}
{/* Bio (Artist only) */} {type === "artist" && (