import { useEffect, useMemo, useState } from "react"; import { Button, Input, Switch, Textarea } from "@heroui/react"; import { useTranslation } from "react-i18next"; import { type NewsItem, type NewsPayload, type FormMode, type NewsTranslation } from "./adminNewsTypes"; const resolveLocale = (field: NewsTranslation | null | undefined, lang: string) => { if (!field) return ""; if (typeof field === "string") return field; return field[lang] ?? field["en"] ?? Object.values(field)[0] ?? ""; }; const formatForDateTimeLocal = (value: string | null | undefined) => { if (!value) return ""; const date = new Date(value); if (Number.isNaN(date.getTime())) return ""; const pad = (num: number) => num.toString().padStart(2, "0"); const year = date.getFullYear(); const month = pad(date.getMonth() + 1); const day = pad(date.getDate()); const hours = pad(date.getHours()); const minutes = pad(date.getMinutes()); return `${year}-${month}-${day}T${hours}:${minutes}`; }; type AdminNewsFormProps = { mode: Exclude; editing: NewsItem | null; onSubmit: (payload: NewsPayload) => Promise | void; onCancel: () => void; submitting: boolean; serverError: string | null; }; export default function AdminNewsForm({ mode, editing, onSubmit, onCancel, submitting, serverError, }: AdminNewsFormProps) { const { t } = useTranslation("common"); const [titleCs, setTitleCs] = useState(""); const [titleEn, setTitleEn] = useState(""); const [contentCs, setContentCs] = useState(""); const [contentEn, setContentEn] = useState(""); const [excerptCs, setExcerptCs] = useState(""); const [excerptEn, setExcerptEn] = useState(""); const [publishedAt, setPublishedAt] = useState(""); const [isPublished, setIsPublished] = useState(false); const [localError, setLocalError] = useState(null); useEffect(() => { if (mode === "edit" && editing) { setTitleCs(resolveLocale(editing.title, "cs")); setTitleEn(resolveLocale(editing.title, "en")); setExcerptCs(resolveLocale(editing.excerpt, "cs")); setExcerptEn(resolveLocale(editing.excerpt, "en")); setContentCs(resolveLocale(editing.content, "cs")); setContentEn(resolveLocale(editing.content, "en")); setPublishedAt(formatForDateTimeLocal(editing.published_at)); setIsPublished(!!editing.is_published); setLocalError(null); return; } setTitleCs(""); setTitleEn(""); setContentCs(""); setContentEn(""); setExcerptCs(""); setExcerptEn(""); setPublishedAt(""); setIsPublished(false); setLocalError(null); }, [mode, editing]); const submitLabel = useMemo(() => { if (mode === "edit") return t("admin_news_form_save") ?? "Uložit změny"; return t("admin_news_form_create") ?? "Vytvořit novinku"; }, [mode, t]); const handleSubmit = async (event: React.FormEvent) => { event.preventDefault(); setLocalError(null); const titlePayload: Record = {}; if (titleCs.trim()) titlePayload.cs = titleCs.trim(); if (titleEn.trim()) titlePayload.en = titleEn.trim(); if (Object.keys(titlePayload).length === 0) { setLocalError(t("admin_news_title_required") ?? "Vyplň nadpis alespoň v jednom jazyce."); return; } const contentPayload: Record = {}; if (contentCs.trim()) contentPayload.cs = contentCs.trim(); if (contentEn.trim()) contentPayload.en = contentEn.trim(); if (Object.keys(contentPayload).length === 0) { setLocalError(t("admin_news_content_required") ?? "Vyplň obsah alespoň v jednom jazyce."); return; } const excerptPayload: Record = {}; if (excerptCs.trim()) excerptPayload.cs = excerptCs.trim(); if (excerptEn.trim()) excerptPayload.en = excerptEn.trim(); const payload: NewsPayload = { title: titlePayload, content: contentPayload, is_published: isPublished, }; if (Object.keys(excerptPayload).length > 0) payload.excerpt = excerptPayload; if (publishedAt.trim()) payload.published_at = publishedAt.trim(); await onSubmit(payload); }; return (
setTitleCs(e.target.value)} /> setTitleEn(e.target.value)} />