import { KeyboardKey } from '@/Services/IOService' import { WebApplication } from '@/Application/Application' import { ViewControllerManager } from '@/Services/ViewControllerManager' import { Disclosure, DisclosureButton, DisclosurePanel } from '@reach/disclosure' import { SNNote } from '@standardnotes/snjs' import { FunctionComponent, useCallback, useEffect, useRef, useState } from 'react' import Icon from '@/Components/Icon/Icon' import ChangeEditorMenu from '@/Components/ChangeEditor/ChangeEditorMenu' import { calculateSubmenuStyle, SubmenuStyle } from '@/Utils/CalculateSubmenuStyle' import { useCloseOnBlur } from '@/Hooks/useCloseOnBlur' type ChangeEditorOptionProps = { viewControllerManager: ViewControllerManager application: WebApplication note: SNNote } const ChangeEditorOption: FunctionComponent = ({ application, note }) => { const [isOpen, setIsOpen] = useState(false) const [isVisible, setIsVisible] = useState(false) const [menuStyle, setMenuStyle] = useState({ right: 0, bottom: 0, maxHeight: 'auto', }) const menuContainerRef = useRef(null) const menuRef = useRef(null) const buttonRef = useRef(null) const [closeOnBlur] = useCloseOnBlur(menuContainerRef, (open: boolean) => { setIsOpen(open) setIsVisible(open) }) const toggleChangeEditorMenu = useCallback(() => { if (!isOpen) { const menuStyle = calculateSubmenuStyle(buttonRef.current) if (menuStyle) { setMenuStyle(menuStyle) } } setIsOpen(!isOpen) }, [isOpen]) useEffect(() => { if (isOpen) { setTimeout(() => { const newMenuStyle = calculateSubmenuStyle(buttonRef.current, menuRef.current) if (newMenuStyle) { setMenuStyle(newMenuStyle) setIsVisible(true) } }) } }, [isOpen]) return (
{ if (event.key === KeyboardKey.Escape) { setIsOpen(false) } }} onBlur={closeOnBlur} ref={buttonRef} className="sn-dropdown-item justify-between" >
Change note type
{ if (event.key === KeyboardKey.Escape) { setIsOpen(false) buttonRef.current?.focus() } }} style={{ ...menuStyle, position: 'fixed', }} className="sn-dropdown flex flex-col max-h-120 min-w-68 fixed overflow-y-auto" > {isOpen && ( { setIsOpen(false) }} /> )}
) } export default ChangeEditorOption