import { Fragment, PropsWithChildren, useCallback, useEffect, useState, } from 'react' import { ScrollArea, useClickOutside, useMediaQuery } from '@janhq/joi' import { 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' const RightPanelContainer = ({ children }: Props) => { const [isResizing, setIsResizing] = useState(false) const [threadRightPanelWidth, setRightPanelWidth] = useState( Number(localStorage.getItem(RIGHT_PANEL_WIDTH)) || DEFAULT_RIGHT_PANEL_WIDTH ) 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) }, []) const stopResizing = useCallback(() => { setIsResizing(false) }, []) 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, 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, stopResizing]) return (
isResizing && e.preventDefault()} > {children} {showRightPanel && !matches && (
)}
) } export default RightPanelContainer