import { useEffect, useState } from "react"; import { Check, Save } from "lucide-react"; import { useAutoRefreshingBookmarkQuery, useUpdateBookmark, } from "@karakeep/shared-react/hooks/bookmarks"; import { Button } from "./ui/button"; import { Textarea } from "./ui/textarea"; export function NoteEditor({ bookmarkId }: { bookmarkId: string }) { const { data: bookmark } = useAutoRefreshingBookmarkQuery({ bookmarkId }); const [error, setError] = useState(null); const [isSaving, setIsSaving] = useState(false); const [noteValue, setNoteValue] = useState(""); const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false); // Update local state when bookmark changes, but only if there are no unsaved changes // This prevents overwriting user's edits while they're typing useEffect(() => { if (bookmark && !hasUnsavedChanges) { setNoteValue(bookmark.note ?? ""); } }, [bookmark?.note, bookmark, hasUnsavedChanges]); const updateBookmarkMutator = useUpdateBookmark({ onSuccess: () => { setError(null); setIsSaving(false); setHasUnsavedChanges(false); }, onError: (e) => { setError(e.message || "Failed to save note"); setIsSaving(false); }, }); const handleSave = () => { if (!bookmark || noteValue === bookmark.note || isSaving) { return; } setIsSaving(true); setError(null); updateBookmarkMutator.mutate({ bookmarkId: bookmark.id, note: noteValue, }); }; if (!bookmark) { return null; } return (