"use client"; import { useRouter } from "next/navigation"; import { Pin, PinOff, Save, Trash2 } from "lucide-react"; import { useState, useTransition } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { ShareButton } from "@/components/share-button"; import type { NoteDto } from "../server/queries"; import { createNote, deleteNote, setNotePinned, updateNote } from "../server/actions"; import { MarkdownPreview } from "./markdown-preview"; export function NoteEditor({ note }: { note?: NoteDto }) { const router = useRouter(); const [currentNote, setCurrentNote] = useState(note); const [title, setTitle] = useState(note?.title ?? ""); const [body, setBody] = useState(note?.body ?? ""); const [remindAt, setRemindAt] = useState(toLocalDateTimeValue(note?.remindAt ?? null)); const [isPending, startTransition] = useTransition(); const pinned = currentNote?.pinned ?? false; function saveNote() { startTransition(async () => { if (currentNote) { const updated = await updateNote({ id: currentNote.id, title, body, remindAt: remindAt ? new Date(remindAt) : null, }); setCurrentNote({ ...updated, createdAt: updated.createdAt.toISOString(), updatedAt: updated.updatedAt.toISOString(), remindAt: updated.remindAt?.toISOString() ?? null, }); return; } const created = await createNote({ title, body, remindAt: remindAt ? new Date(remindAt) : null, }); router.push(`/notes/${created.id}`); }); } function togglePinned() { if (!currentNote) return; startTransition(async () => { setCurrentNote(await setNotePinned({ id: currentNote.id, pinned: !pinned })); }); } function removeNote() { if (!currentNote) return; startTransition(async () => { await deleteNote({ id: currentNote.id }); router.push("/notes"); }); } return (

{currentNote ? currentNote.title : "New note"}

Markdown notes shared with the household.

{currentNote ? ( ) : null} {currentNote ? : null} {currentNote ? ( ) : null}
setTitle(event.target.value)} />