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 { showRightPanelAtom } from '@/helpers/atoms/App.atom' import { reduceTransparentAtom } from '@/helpers/atoms/Setting.atom' type Props = PropsWithChildren const DEFAULT_RIGHT_PANEL_WIDTH = 280 export const RIGHT_PANEL_WIDTH = 'rightPanelWidth' export const rightPanelWidthAtom = atom(DEFAULT_RIGHT_PANEL_WIDTH) const RightPanelContainer = ({ children }: Props) => { const [isResizing, setIsResizing] = useState(false) const [rightPanelWidth, setRightPanelWidth] = useAtom(rightPanelWidthAtom) const [rightPanelRef, setRightPanelRef] = useState( null ) const reduceTransparent = useAtomValue(reduceTransparentAtom) const [showRightPanel, setShowRightPanel] = useAtom(showRightPanelAtom) const matches = useMediaQuery('(max-width: 880px)') useClickOutside( () => matches && showRightPanel && setShowRightPanel(false), null, [rightPanelRef] ) 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 (rightPanelRef !== null) { if ( rightPanelRef?.getBoundingClientRect().right - mouseMoveEvent.clientX < 200 ) { setRightPanelWidth(DEFAULT_RIGHT_PANEL_WIDTH) setIsResizing(false) localStorage.setItem( RIGHT_PANEL_WIDTH, String(DEFAULT_RIGHT_PANEL_WIDTH) ) setShowRightPanel(false) } else { const resized = rightPanelRef?.getBoundingClientRect().right - mouseMoveEvent.clientX localStorage.setItem(RIGHT_PANEL_WIDTH, String(resized)) setRightPanelWidth(resized) } } } }, [isResizing, rightPanelRef, setRightPanelWidth, setShowRightPanel] ) useEffect(() => { if (localStorage.getItem(RIGHT_PANEL_WIDTH) === null) { setRightPanelWidth(DEFAULT_RIGHT_PANEL_WIDTH) localStorage.setItem(RIGHT_PANEL_WIDTH, String(DEFAULT_RIGHT_PANEL_WIDTH)) } window.addEventListener('mousemove', resize) window.addEventListener('mouseup', stopResizing) return () => { window.removeEventListener('mousemove', resize) window.removeEventListener('mouseup', stopResizing) } }, [resize, setRightPanelWidth, stopResizing]) return (
isResizing && e.preventDefault()} > {children} {showRightPanel && !matches && (
)}
) } export default RightPanelContainer