import { useState, useEffect, type FormEvent } from "react"; import { toast } from "sonner"; import { type Client } from "../types/client"; import { updateClient } from "../api/clients"; import { useTranslation } from "../hooks/useTranslation"; import { Button } from "./ui/button"; import { Input } from "./ui/input"; import { Modal } from "./Modal"; import { TextAreaInput } from "./ui/TextAreaInput"; interface EditClientModalProps { isOpen: boolean; onClose: () => void; onSuccess: () => void; client: Client | null; } export default function EditClientModal({ isOpen, onClose, onSuccess, client }: EditClientModalProps) { const { t } = useTranslation(); const [name, setName] = useState(""); const [notes, setNotes] = useState(""); const [thumbnailFile, setThumbnailFile] = useState(null); const [thumbnailUrl, setThumbnailUrl] = useState(null); const [thumbnailPreview, setThumbnailPreview] = useState(null); const [clearThumbnail, setClearThumbnail] = useState(false); const [isLoading, setIsLoading] = useState(false); useEffect(() => { if (client) { setName(client.name); setNotes(client.notes || ""); setThumbnailUrl(client.thumbnail || null); setThumbnailFile(null); setClearThumbnail(false); } }, [client]); useEffect(() => { if (!thumbnailFile) { setThumbnailPreview(null); return; } const objectUrl = URL.createObjectURL(thumbnailFile); setThumbnailPreview(objectUrl); return () => URL.revokeObjectURL(objectUrl); }, [thumbnailFile]); const handleThumbnailChange = (file: File | null) => { if (!file) return; if (!["image/jpeg", "image/png", "image/webp"].includes(file.type)) { toast.error(t.workspace?.thumbnailInvalidType || "Unsupported image type. Use JPG, PNG, or WebP."); return; } if (file.size > 2 * 1024 * 1024) { toast.error(t.workspace?.thumbnailMaxSizeError || "Image size must be 2MB or less."); return; } setThumbnailFile(file); setClearThumbnail(false); }; const handleSubmit = async (event?: FormEvent) => { event?.preventDefault(); if (!client || !name.trim()) return; setIsLoading(true); try { await updateClient(client.id, { name, notes, thumbnail: thumbnailFile, clear_thumbnail: clearThumbnail }); toast.success(t.clients.updateSuccess); onSuccess(); onClose(); } catch (error) { console.error(t.clients.errors.updateFailed, error); toast.error(t.clients.errors.updateFailed); } finally { setIsLoading(false); } }; const footer = ( <> ); return (
{thumbnailPreview ? ( ) : !clearThumbnail && thumbnailUrl ? ( ) : ( name.trim().charAt(0).toUpperCase() || "C" )}
handleThumbnailChange(event.target.files?.[0] || null)} /> {(thumbnailFile || (!clearThumbnail && thumbnailUrl)) ? ( ) : null}
setName(e.target.value)} placeholder={t.clients.clientNamePlaceholder} />
setNotes(e.target.value)} placeholder={t.clients.notesPlaceholder} />
); }