"use client"; import { useEffect, useState } from "react"; import { api } from "@/lib/api"; import { Plus, Pencil, Trash2, X, ChevronUp, ChevronDown, Eye, EyeOff, GripVertical } from "lucide-react"; import { cn } from "@/lib/utils"; interface FaqItem { id: string; question: string; answer: string; order: number; showOnHomepage: boolean; } interface FaqForm { question: string; answer: string; showOnHomepage: boolean; } const emptyForm: FaqForm = { question: "", answer: "", showOnHomepage: true, }; export default function FaqAdminPage() { const [faqs, setFaqs] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(""); const [showForm, setShowForm] = useState(false); const [editingId, setEditingId] = useState(null); const [form, setForm] = useState(emptyForm); const [saving, setSaving] = useState(false); const [dragIndex, setDragIndex] = useState(null); const [dragOverIndex, setDragOverIndex] = useState(null); const loadFaqs = async () => { try { const data = await api.getAllFaqs(); setFaqs(data); } catch (err: any) { setError(err.message); } finally { setLoading(false); } }; useEffect(() => { loadFaqs(); }, []); const openCreate = () => { setForm(emptyForm); setEditingId(null); setShowForm(true); }; const openEdit = (faq: FaqItem) => { setForm({ question: faq.question, answer: faq.answer, showOnHomepage: faq.showOnHomepage, }); setEditingId(faq.id); setShowForm(true); }; const handleSave = async () => { if (!form.question.trim() || !form.answer.trim()) return; setSaving(true); setError(""); try { if (editingId) { await api.updateFaq(editingId, form); } else { await api.createFaq(form); } setShowForm(false); setEditingId(null); await loadFaqs(); } catch (err: any) { setError(err.message); } finally { setSaving(false); } }; const handleDelete = async (id: string) => { if (!confirm("Delete this FAQ?")) return; try { await api.deleteFaq(id); await loadFaqs(); } catch (err: any) { setError(err.message); } }; const handleToggleHomepage = async (faq: FaqItem) => { try { await api.updateFaq(faq.id, { showOnHomepage: !faq.showOnHomepage }); setFaqs((prev) => prev.map((f) => f.id === faq.id ? { ...f, showOnHomepage: !faq.showOnHomepage } : f ) ); } catch (err: any) { setError(err.message); } }; const moveItem = async (index: number, direction: "up" | "down") => { const newFaqs = [...faqs]; const targetIndex = direction === "up" ? index - 1 : index + 1; if (targetIndex < 0 || targetIndex >= newFaqs.length) return; [newFaqs[index], newFaqs[targetIndex]] = [newFaqs[targetIndex], newFaqs[index]]; const reordered = newFaqs.map((f, i) => ({ ...f, order: i })); setFaqs(reordered); try { await api.reorderFaqs(reordered.map((f) => ({ id: f.id, order: f.order }))); } catch (err: any) { setError(err.message); await loadFaqs(); } }; // Drag-and-drop handlers const handleDragStart = (index: number) => { setDragIndex(index); }; const handleDragEnter = (index: number) => { setDragOverIndex(index); }; const handleDragEnd = async () => { if (dragIndex === null || dragOverIndex === null || dragIndex === dragOverIndex) { setDragIndex(null); setDragOverIndex(null); return; } const newFaqs = [...faqs]; const [moved] = newFaqs.splice(dragIndex, 1); newFaqs.splice(dragOverIndex, 0, moved); const reordered = newFaqs.map((f, i) => ({ ...f, order: i })); setFaqs(reordered); setDragIndex(null); setDragOverIndex(null); try { await api.reorderFaqs(reordered.map((f) => ({ id: f.id, order: f.order }))); } catch (err: any) { setError(err.message); await loadFaqs(); } }; if (loading) { return (
Loading FAQs...
); } return (

FAQ Management

Drag to reorder ยท toggle visibility on homepage

{error &&

{error}

} {showForm && (

{editingId ? "Edit FAQ" : "Add FAQ"}

setForm({ ...form, question: e.target.value })} className="bg-surface-container-highest text-on-surface rounded-lg px-4 py-3 w-full focus:outline-none focus:ring-1 focus:ring-primary/40" />