You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.4 KiB
51 lines
1.4 KiB
import { useState, useEffect, useRef } from 'react' |
|
import { Sheet, SheetContent } from '@/components/ui/sheet' |
|
import NotePage from '@/pages/secondary/NotePage' |
|
|
|
interface NoteDrawerProps { |
|
open: boolean |
|
onOpenChange: (open: boolean) => void |
|
noteId: string | null |
|
} |
|
|
|
export default function NoteDrawer({ open, onOpenChange, noteId }: NoteDrawerProps) { |
|
const [displayNoteId, setDisplayNoteId] = useState<string | null>(noteId) |
|
const timeoutRef = useRef<NodeJS.Timeout | null>(null) |
|
|
|
useEffect(() => { |
|
// Clear any pending timeout |
|
if (timeoutRef.current) { |
|
clearTimeout(timeoutRef.current) |
|
timeoutRef.current = null |
|
} |
|
|
|
if (noteId) { |
|
// New noteId - show immediately |
|
setDisplayNoteId(noteId) |
|
} else if (!open && displayNoteId) { |
|
// Closing - keep content visible during animation (350ms) |
|
timeoutRef.current = setTimeout(() => { |
|
setDisplayNoteId(null) |
|
timeoutRef.current = null |
|
}, 350) |
|
} |
|
|
|
return () => { |
|
if (timeoutRef.current) { |
|
clearTimeout(timeoutRef.current) |
|
} |
|
} |
|
}, [noteId, open]) |
|
|
|
if (!displayNoteId) return null |
|
|
|
return ( |
|
<Sheet open={open} onOpenChange={onOpenChange}> |
|
<SheetContent side="right" className="w-full sm:max-w-[1042px] overflow-y-auto p-0"> |
|
<div className="h-full"> |
|
<NotePage id={displayNoteId} index={0} hideTitlebar={false} /> |
|
</div> |
|
</SheetContent> |
|
</Sheet> |
|
) |
|
}
|
|
|