import React, { useEffect, useMemo, useState } from "react"; import axios from "axios"; import { Button } from "@heroui/react"; import { useLanguageStore } from "@/stores/languageStore"; import { useTranslation } from "react-i18next"; import AdminNewsTable from "@/components/admin/news/AdminNewsTable"; import AdminNewsForm from "@/components/admin/news/AdminNewsForm"; import { type NewsItem, type NewsPayload, type FormMode } from "@/components/admin/news/adminNewsTypes"; type PaginatedResponse = { data: T[] }; export default function AdminNewsPage() { const locale = useLanguageStore((s) => s.locale); const { t } = useTranslation("common"); const [items, setItems] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [refreshKey, setRefreshKey] = useState(0); const [formMode, setFormMode] = useState("none"); const [editing, setEditing] = useState(null); const [submitting, setSubmitting] = useState(false); const [formError, setFormError] = useState(null); useEffect(() => { let active = true; (async () => { try { setLoading(true); setError(null); const res = await axios.get | NewsItem[]>("/api/news", { headers: { Accept: "application/json" }, params: { per_page: 200, include_unpublished: 1 }, withCredentials: true, }); if (!active) return; const data = Array.isArray(res.data) ? res.data : res.data.data; setItems(data); } catch { if (!active) return; setError(t("admin_news_load_failed") ?? "Nepodařilo se načíst novinky."); } finally { if (active) setLoading(false); } })(); return () => { active = false; }; }, [locale, refreshKey, t]); const visibleItems = useMemo(() => items, [items]); const resetForm = () => { setEditing(null); setFormError(null); }; const openCreate = () => { resetForm(); setFormMode("create"); }; const openEdit = (item: NewsItem) => { resetForm(); setEditing(item); setFormMode("edit"); }; const handleSubmit = async (payload: NewsPayload) => { setFormError(null); try { setSubmitting(true); await axios.get("/sanctum/csrf-cookie", { withCredentials: true }); if (formMode === "edit" && editing) { const key = editing.slug ?? editing.id; await axios.put(`/api/news/${key}`, payload, { headers: { Accept: "application/json" }, withCredentials: true, withXSRFToken: true, }); } else { await axios.post("/api/news", payload, { headers: { Accept: "application/json" }, withCredentials: true, withXSRFToken: true, }); } setFormMode("none"); resetForm(); setRefreshKey((k) => k + 1); } catch (e: any) { setFormError( e?.response?.data?.message ?? (t("admin_news_save_failed") ?? "Chyba při ukládání novinky.") ); } finally { setSubmitting(false); } }; return (

{t("admin_news_title") ?? "Novinky"}

{formMode !== "none" && ( )} {formMode !== "none" && ( { setFormMode("none"); resetForm(); }} /> )}
); }