/** * Private Media Edit Modal * * Edit metadata for a single media item */ import { useState, useEffect } from 'react' import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { X, Save, Calendar, Tag, FileText, Loader2, Image as ImageIcon, Video, } from 'lucide-react' import { api } from '../../lib/api' import PersonSelector from './PersonSelector' interface MediaItem { id: number filename: string description?: string | null file_type: 'image' | 'video' | 'other' person_id?: number | null media_date: string tags: Array<{ id: number; name: string; color: string }> thumbnail_url: string } interface EditModalProps { open: boolean onClose: () => void item: MediaItem | null onSuccess?: () => void } export function PrivateMediaEditModal({ open, onClose, item, onSuccess }: EditModalProps) { const queryClient = useQueryClient() const [personId, setPersonId] = useState() const [selectedTags, setSelectedTags] = useState([]) const [mediaDate, setMediaDate] = useState('') const [description, setDescription] = useState('') // Load item data when it changes useEffect(() => { if (item) { setPersonId(item.person_id ?? undefined) setSelectedTags(item.tags.map(t => t.id)) setMediaDate(item.media_date) setDescription(item.description || '') } }, [item]) const { data: tags = [] } = useQuery({ queryKey: ['private-gallery-tags'], queryFn: () => api.privateGallery.getTags(), enabled: open, }) const updateMutation = useMutation({ mutationFn: (data: { description?: string person_id?: number media_date?: string tag_ids?: number[] }) => api.privateGallery.updateMedia(item!.id, data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['private-gallery-media'] }) queryClient.invalidateQueries({ queryKey: ['private-gallery-albums'] }) handleClose() onSuccess?.() }, }) const handleClose = () => { setPersonId(undefined) setSelectedTags([]) setMediaDate('') setDescription('') updateMutation.reset() onClose() } const toggleTag = (tagId: number) => { setSelectedTags(prev => prev.includes(tagId) ? prev.filter(id => id !== tagId) : [...prev, tagId] ) } const handleSubmit = () => { if (selectedTags.length === 0) { alert('Please select at least one tag') return } updateMutation.mutate({ description: description || undefined, person_id: personId || 0, // 0 means clear media_date: mediaDate, tag_ids: selectedTags, }) } if (!open || !item) return null return (
{/* Header */}

Edit Media

{/* Content */}
{/* Preview */}
{item.file_type === 'image' ? ( {item.filename} ) : item.file_type === 'video' ? (
) : (
)}

{item.filename}

{item.file_type}

{/* Person Selector */}
setPersonId(id)} />
{/* Tags */}
{tags.map(tag => ( ))}
{/* Date */}
setMediaDate(e.target.value)} className="w-full px-4 py-2.5 rounded-lg border border-border bg-background focus:outline-none focus:ring-2 focus:ring-primary" />
{/* Description */}