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)}
/>
))}
)}
{/* Notes */}
)}
);
};
export default AdminBar;