import { Plugins } from '@capacitor/core'; import classNames from 'classnames'; import { useEffect, useLayoutEffect, useRef, useState } from 'react'; import { useDrag } from 'react-use-gesture'; const Menu = ({ open, onClose, children, className, ...props }) => { const ref = useRef(); const [x, setX] = useState(-100000); const [rect, setRect] = useState(null); const [dragging, setDragging] = useState(false); useEffect(() => { try { if (open) { Plugins.StatusBar.setStyle({ style: 'LIGHT', }); } else { Plugins.StatusBar.setStyle({ style: 'DARK', }); } } catch (e) {} }, [open]); useLayoutEffect(() => { const rect = ref.current?.getBoundingClientRect(); setRect(rect); setX(-rect.width); }, []); useLayoutEffect(() => { if (open) { setX(0); } else if (rect) { setX(-rect.width); } }, [rect, open]); const bind = useDrag( ({ down, movement: [mx] }) => { setX(mx > 0 ? 0 : mx); if (down) { setDragging(true); } else { setDragging(false); } // If the drag ended, snap the menu back if (!down) { const mid = -rect.width; if (x < mid / 2) { // Close setX(-rect.width); onClose(); } else { // Re-open setX(0); } } }, { axis: 'x', } ); return (