"use client"; import { NotebookPen, Plus } from "lucide-react"; import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { NoteDetailSheet } from "@/components/notes/note-detail-sheet"; import { Button } from "@/components/ui/button"; import { Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, } from "@/components/ui/empty"; import { createNote, deleteNote, listNotes, type Note, updateNote, } from "@/lib/notes"; import { notify } from "@/lib/toast"; const newDraft = (): Note => ({ id: "", title: "", content: "", createdAt: "", updatedAt: "", }); export function NotesView() { const { t } = useTranslation(); const [notes, setNotes] = useState([]); // The note shown in the editor Sheet; null when the Sheet is closed. const [selected, setSelected] = useState(null); const [sheetOpen, setSheetOpen] = useState(false); const [draftKey, setDraftKey] = useState(0); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); useEffect(() => { let active = true; listNotes() .then((data) => { if (active) setNotes(data); }) .catch((err) => { if (active) { notify.error( t("notes.loadFailed"), err instanceof Error ? err.message : t("notes.tryAgain"), ); } }) .finally(() => { if (active) setLoading(false); }); return () => { active = false; }; }, []); const startNew = () => { setSelected(newDraft()); setDraftKey((k) => k + 1); setSheetOpen(true); }; const openNote = (note: Note) => { setSelected(note); setSheetOpen(true); }; const save = async (data: { title: string; content: string }) => { setSaving(true); try { const saved = selected?.id ? await updateNote(selected.id, data) : await createNote(data); const list = await listNotes(); setNotes(list); setSelected(list.find((n) => n.id === saved.id) ?? saved); notify.success(t("notes.saved")); } catch (err) { notify.error( t("notes.saveFailed"), err instanceof Error ? err.message : t("notes.tryAgain"), ); } finally { setSaving(false); } }; const remove = async (id: string) => { try { await deleteNote(id); const list = await listNotes(); setNotes(list); setSelected(null); setSheetOpen(false); notify.success(t("notes.deleted")); } catch (err) { notify.error( t("notes.deleteFailed"), err instanceof Error ? err.message : t("notes.tryAgain"), ); } }; return (

{t("notes.title")}

{t("notes.subtitle")}

{loading ? (
{t("notes.loading")}
) : notes.length === 0 ? (
{t("notes.emptyTitle")} {t("notes.emptyDescription")}
) : (
{notes.map((n) => ( ))}
)} remove(selected.id) : undefined} onOpenChange={(o) => { setSheetOpen(o); if (!o) setSelected(null); }} onSave={save} open={sheetOpen} saving={saving} />
); }