"use client"; import Image from "next/image"; import { useTranslations } from "next-intl"; import { useRef, useState } from "react"; import { deleteFavicon, saveFavicon } from "@/actions/save-favicon"; import { useConfirmDialog } from "@/components/admin/confirm-dialog"; import { Button } from "@/components/ui/button"; import { FaviconGenerator } from "./favicon-generator"; export function FaviconForm({ currentUrl }: { currentUrl: string | null }) { const t = useTranslations("pages.admin.favicon"); const { confirm, dialog: confirmDialog } = useConfirmDialog(); const [uploading, setUploading] = useState(false); const [deleting, setDeleting] = useState(false); const [preview, setPreview] = useState(currentUrl); const [message, setMessage] = useState<{ type: "success" | "error"; text: string; } | null>(null); const formRef = useRef(null); async function handleUpload(formData: FormData) { setUploading(true); setMessage(null); const result = await saveFavicon(formData); setUploading(false); if (result.success && result.url) { setPreview(result.url); setMessage({ type: "success", text: t("saved") }); formRef.current?.reset(); } else { setMessage({ type: "error", text: result.error ?? t("error") }); } } async function handleDelete() { const ok = await confirm({ title: t("delete"), description: t("confirmDelete"), confirmLabel: t("delete"), cancelLabel: t("cancel"), }); if (!ok) return; setDeleting(true); setMessage(null); const result = await deleteFavicon(); setDeleting(false); if (result.success) { setPreview(null); setMessage({ type: "success", text: t("deleted") }); } else { setMessage({ type: "error", text: result.error ?? t("error") }); } } async function handleGenerated(blob: Blob) { setUploading(true); setMessage(null); const file = new File([blob], "favicon.png", { type: "image/png" }); const fd = new FormData(); fd.append("file", file); const result = await saveFavicon(fd); setUploading(false); if (result.success && result.url) { setPreview(result.url); setMessage({ type: "success", text: t("saved") }); } else { setMessage({ type: "error", text: result.error ?? t("error") }); } } return (
{confirmDialog}

{t("uploadLabel")}

{preview && (
Favicon preview
{preview}
)}

{t("uploadHint")}

{preview && ( )}
{message && (
{message.text}
)}
); }