import React, { useState, useEffect } from 'react'; import type { Note } from '../types'; import { updateNote, deleteNote } from '../api'; type Props = { note: Note | null; onUpdated: () => void; onDeleted: () => void; onShowToast: (message: string) => void; contextChain?: any[]; hideEmbedded?: boolean; }; export function NoteDetailView({ note, onUpdated, onDeleted, onShowToast, contextChain, hideEmbedded = false, }: Props) { const [deleting, setDeleting] = useState(false); const [editedText, setEditedText] = useState(''); const [saving, setSaving] = useState(false); const [showDeleteConfirm, setShowDeleteConfirm] = useState(false); const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false); // Update local state when note changes useEffect(() => { if (note) { setEditedText(note.text); setHasUnsavedChanges(false); } }, [note?.id]); // Only update when note ID changes const handleTextChange = (newText: string) => { setEditedText(newText); setHasUnsavedChanges(note ? newText !== note.text : false); }; const handleSave = async () => { if (!note) return; const trimmed = editedText.trim(); if (!trimmed) { onShowToast('Note text cannot be empty'); return; } if (trimmed === note.text) { setHasUnsavedChanges(false); return; } setSaving(true); try { await updateNote(note.id, { text: trimmed }); setHasUnsavedChanges(false); onUpdated(); onShowToast('Note saved'); } catch (err) { console.error(err); onShowToast('Failed to save note'); } finally { setSaving(false); } }; const handleDeleteClick = () => { setShowDeleteConfirm(true); }; const handleConfirmDelete = async () => { if (!note) return; setShowDeleteConfirm(false); setDeleting(true); try { await deleteNote(note.id); onShowToast('Deleted'); onDeleted(); } catch (err) { console.error(err); onShowToast('Failed to delete note'); } finally { setDeleting(false); } }; // Auto-save on keyboard shortcut useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if ((e.ctrlKey || e.metaKey) && e.key === 's') { e.preventDefault(); if (hasUnsavedChanges && note) { handleSave(); } } }; window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); }, [hasUnsavedChanges, editedText, note]); if (!note) { return (
📝

No Note Selected

Select a note from the sidebar to view its details

); } return (
{/* Header */}

Note

{hasUnsavedChanges && ( )}
{/* Content Area */}
{/* Note Editor */}