import React, { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { Checkbox } from "@/components/ui/checkbox"; import { Shield, StickyNote, ChevronDown, ChevronUp, Save, Check, Loader2, Plus, Trash2, ListTodo, MessageSquare, } from "lucide-react"; import { isAdminLoggedIn, getNote, setNote, getStatusOverride, setStatusOverride, commitStatus, syncFromServer, getTodos, addTodo, toggleTodo, removeTodo, updateTodoRemark, type TodoItem, } from "@/lib/admin"; import type { InteractiveStatus } from "@/lib/interactives"; interface AdminBarProps { slug: string; currentStatus: InteractiveStatus; } const statusOptions: { value: InteractiveStatus; label: string; color: string }[] = [ { value: "published", label: "Published", color: "bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200" }, { value: "draft", label: "Draft", color: "bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200" }, ]; const TodoRow: React.FC<{ todo: TodoItem; slug: string; onToggle: () => void; onRemove: () => void; onRemarkChange: (remark: string) => void; }> = ({ todo, slug, onToggle, onRemove, onRemarkChange }) => { const [showRemark, setShowRemark] = useState(false); const [remarkText, setRemarkText] = useState(todo.remark || ""); const handleRemarkBlur = () => { if (remarkText !== (todo.remark || "")) { onRemarkChange(remarkText); } }; return (
  • {todo.refId} {todo.text}
    {todo.done && todo.doneDate && ( Done {todo.doneDate} )} {todo.remark && !showRemark && (

    {todo.remark}

    )} {showRemark && ( setRemarkText(e.target.value)} onBlur={handleRemarkBlur} onKeyDown={(e) => { if (e.key === "Enter") { handleRemarkBlur(); setShowRemark(false); } }} placeholder="Add a remark..." className="text-xs h-7 mt-1" autoFocus /> )}
  • ); }; const AdminBar: React.FC = ({ slug, currentStatus }) => { const [isAdmin, setIsAdmin] = useState(false); const [expanded, setExpanded] = useState(false); const [status, setStatus] = useState(currentStatus); const [noteText, setNoteText] = useState(""); const [hasOverride, setHasOverride] = useState(false); const [saving, setSaving] = useState(false); const [saved, setSaved] = useState(false); const [todos, setTodos] = useState([]); const [newTodo, setNewTodo] = useState(""); const refreshTodos = () => setTodos(getTodos(slug)); useEffect(() => { const admin = isAdminLoggedIn(); setIsAdmin(admin); if (admin) { syncFromServer().finally(() => { const override = getStatusOverride(slug); if (override) { setStatus(override); setHasOverride(true); } setNoteText(getNote(slug)); refreshTodos(); }); } }, [slug]); if (!isAdmin) return null; const handleStatusChange = (newStatus: InteractiveStatus) => { setStatus(newStatus); setStatusOverride(slug, newStatus); setHasOverride(true); setSaved(false); }; const handleNoteChange = (value: string) => { setNoteText(value); setNote(slug, value); }; const handleSave = async () => { setSaving(true); const success = await commitStatus(slug, status); setSaving(false); if (success) { setHasOverride(false); setSaved(true); setTimeout(() => setSaved(false), 2000); } }; const handleAddTodo = (e: React.FormEvent) => { e.preventDefault(); if (!newTodo.trim()) return; addTodo(slug, newTodo.trim()); setNewTodo(""); refreshTodos(); }; const handleToggleTodo = (todoId: string) => { toggleTodo(slug, todoId); refreshTodos(); }; const handleRemoveTodo = (todoId: string) => { removeTodo(slug, todoId); refreshTodos(); }; const handleRemarkChange = (todoId: string, remark: string) => { updateTodoRemark(slug, todoId, remark); refreshTodos(); }; const isDirty = hasOverride; const doneCount = todos.filter((t) => t.done).length; const hasTodos = todos.length > 0; const openTodos = todos.filter((t) => !t.done); const doneTodos = todos.filter((t) => t.done); return (
    {expanded && (
    {/* Status control */}
    {statusOptions.map((opt) => ( ))}
    {/* Todos */}
    {openTodos.length > 0 && (
      {openTodos.map((todo) => ( handleToggleTodo(todo.id)} onRemove={() => handleRemoveTodo(todo.id)} onRemarkChange={(r) => handleRemarkChange(todo.id, r)} /> ))}
    )} {doneTodos.length > 0 && (
    {doneTodos.length} completed
      {doneTodos.map((todo) => ( handleToggleTodo(todo.id)} onRemove={() => handleRemoveTodo(todo.id)} onRemarkChange={(r) => handleRemarkChange(todo.id, r)} /> ))}
    )}
    setNewTodo(e.target.value)} placeholder="Add a todo... (use T1, T2 to reference others)" className="text-sm h-8" />
    {/* Notes */}