import { Fragment, PropsWithChildren, useCallback, useEffect, useState, } from 'react' import { ScrollArea, useClickOutside, useMediaQuery } from '@janhq/joi' import { atom, useAtom, useAtomValue } from 'jotai' import { twMerge } from 'tailwind-merge' import { showLeftPanelAtom } from '@/helpers/atoms/App.atom' import { reduceTransparentAtom } from '@/helpers/atoms/Setting.atom' type Props = PropsWithChildren const DEFAULT_LEFT_PANEL_WIDTH = 200 export const LEFT_PANEL_WIDTH = 'leftPanelWidth' export const leftPanelWidthAtom = atom(DEFAULT_LEFT_PANEL_WIDTH) const LeftPanelContainer = ({ children }: Props) => { const [leftPanelRef, setLeftPanelRef] = useState(null) const [isResizing, setIsResizing] = useState(false) const [leftPanelWidth, setLeftPanelWidth] = useAtom(leftPanelWidthAtom) const [showLeftPanel, setShowLeftPanel] = useAtom(showLeftPanelAtom) const matches = useMediaQuery('(max-width: 880px)') const reduceTransparent = useAtomValue(reduceTransparentAtom) useClickOutside( () => matches && showLeftPanel && setShowLeftPanel(false), null, [leftPanelRef] ) const startResizing = useCallback(() => { setIsResizing(true) document.body.classList.add('select-none') }, []) const stopResizing = useCallback(() => { setIsResizing(false) document.body.classList.remove('select-none') }, []) const resize = useCallback( (mouseMoveEvent: { clientX: number }) => { if (isResizing) { if (leftPanelRef !== null) { if ( mouseMoveEvent.clientX - leftPanelRef?.getBoundingClientRect().left < 170 ) { setIsResizing(false) setLeftPanelWidth(DEFAULT_LEFT_PANEL_WIDTH) localStorage.setItem( LEFT_PANEL_WIDTH, String(DEFAULT_LEFT_PANEL_WIDTH) ) setShowLeftPanel(false) } else { const resized = mouseMoveEvent.clientX - leftPanelRef?.getBoundingClientRect().left localStorage.setItem(LEFT_PANEL_WIDTH, String(resized)) setLeftPanelWidth(resized) } } } }, [isResizing, leftPanelRef, setLeftPanelWidth, setShowLeftPanel] ) useEffect(() => { if (localStorage.getItem(LEFT_PANEL_WIDTH) === null) { setLeftPanelWidth(DEFAULT_LEFT_PANEL_WIDTH) localStorage.setItem(LEFT_PANEL_WIDTH, String(DEFAULT_LEFT_PANEL_WIDTH)) } window.addEventListener('mousemove', resize) window.addEventListener('mouseup', stopResizing) return () => { window.removeEventListener('mousemove', resize) window.removeEventListener('mouseup', stopResizing) } }, [resize, setLeftPanelWidth, stopResizing]) return (
isResizing && e.stopPropagation()} > {children} {showLeftPanel && !matches && (
)}
) } export default LeftPanelContainer