From 2a85b870570b331c388d58d5a958e12e65b37c90 Mon Sep 17 00:00:00 2001 From: Ishaan Gupta Date: Mon, 18 May 2026 15:39:08 +0530 Subject: [PATCH] Improve quick note editor interactions --- apps/web/components/quick-note-card.tsx | 65 ++++++++++++++--------- apps/web/components/text-editor/index.tsx | 14 ++++- 2 files changed, 52 insertions(+), 27 deletions(-) diff --git a/apps/web/components/quick-note-card.tsx b/apps/web/components/quick-note-card.tsx index bb727734..19c7b033 100644 --- a/apps/web/components/quick-note-card.tsx +++ b/apps/web/components/quick-note-card.tsx @@ -1,11 +1,12 @@ "use client" -import { useRef, useCallback } from "react" +import { useRef, useCallback, useState } from "react" import { cn } from "@lib/utils" import { dmSansClassName } from "@/lib/fonts" import { Maximize2, Plus, Loader2 } from "lucide-react" import { useProject } from "@/stores" import { useQuickNoteDraft } from "@/stores/quick-note-draft" +import { TextEditor } from "./text-editor" interface QuickNoteCardProps { onSave: (content: string) => void @@ -18,28 +19,23 @@ export function QuickNoteCard({ onMaximize, isSaving = false, }: QuickNoteCardProps) { - const textareaRef = useRef(null) + const [isExpanded, setIsExpanded] = useState(false) const { selectedProject } = useProject() const { draft, setDraft } = useQuickNoteDraft(selectedProject) + const draftRef = useRef(draft) + draftRef.current = draft - const handleChange = useCallback( - (e: React.ChangeEvent) => { - setDraft(e.target.value) - }, + const handleContentChange = useCallback( + (content: string) => setDraft(content), [setDraft], ) - const handleKeyDown = useCallback( - (e: React.KeyboardEvent) => { - if ((e.metaKey || e.ctrlKey) && e.key === "Enter") { - e.preventDefault() - if (draft.trim() && !isSaving) { - onSave(draft) - } - } - }, - [draft, isSaving, onSave], - ) + const handleEditorSubmit = useCallback(() => { + const currentDraft = draftRef.current + if (currentDraft.trim() && !isSaving) { + onSave(currentDraft) + } + }, [isSaving, onSave]) const handleSaveClick = useCallback(() => { if (draft.trim() && !isSaving) { @@ -51,7 +47,17 @@ export function QuickNoteCard({ onMaximize(draft) }, [draft, onMaximize]) + const handleBlurCapture = useCallback( + (e: React.FocusEvent) => { + if (e.currentTarget.contains(e.relatedTarget as Node | null)) return + setIsExpanded(draftRef.current.trim().length > 0) + }, + [], + ) + const canSave = draft.trim().length > 0 && !isSaving + const editorHeight = + isExpanded || draft.trim() ? "min-h-[188px]" : "min-h-[120px]" return (
setIsExpanded(true)} + onBlurCapture={handleBlurCapture} style={{ boxShadow: "inset 1.421px 1.421px 4.263px 0 rgba(11, 15, 21, 0.4)", }} @@ -77,18 +85,23 @@ export function QuickNoteCard({ -