import { tableWidthResizeIsActiveState } from '@/object-record/record-table/states/tableWidthResizeIsActivedState'; import { SidePanelRouter } from '@/side-panel/components/SidePanelRouter'; import { SidePanelWidthEffect } from '@/side-panel/components/SidePanelWidthEffect'; import { SIDE_PANEL_CLICK_OUTSIDE_ID } from '@/side-panel/constants/SidePanelClickOutsideId'; import { SIDE_PANEL_CONSTRAINTS } from '@/side-panel/constants/SidePanelConstraints'; import { useSidePanelCloseAnimationCompleteCleanup } from '@/side-panel/hooks/useSidePanelCloseAnimationCompleteCleanup'; import { useSidePanelMenu } from '@/side-panel/hooks/useSidePanelMenu'; import { isSidePanelClosingState } from '@/side-panel/states/isSidePanelClosingState'; import { isSidePanelOpenedState } from '@/side-panel/states/isSidePanelOpenedState'; import { SIDE_PANEL_WIDTH_VAR, sidePanelWidthState, } from '@/side-panel/states/sidePanelWidthState'; import { ModalContainerContext } from '@/ui/layout/modal/contexts/ModalContainerContext'; import { ResizablePanelGap } from '@/ui/layout/resizable-panel/components/ResizablePanelGap'; import { ParentClickOutsideIdContext } from '@/ui/utilities/pointer-event/contexts/ParentClickOutsideIdContext'; import { useAtomState } from '@/ui/utilities/state/jotai/hooks/useAtomState'; import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue'; import { useSetAtomState } from '@/ui/utilities/state/jotai/hooks/useSetAtomState'; import { styled } from '@linaria/react'; import { useCallback, useState } from 'react'; import { themeCssVariables } from 'twenty-ui-deprecated/theme-constants'; const StyledSidePanelWrapper = styled.div<{ isOpen: boolean; isResizing: boolean; }>` flex-shrink: 0; min-width: 0; overflow: hidden; transition: ${({ isResizing }) => isResizing ? 'none' : `width calc(${themeCssVariables.animation.duration.normal} * 1s)`}; width: ${({ isOpen }) => (isOpen ? `var(${SIDE_PANEL_WIDTH_VAR})` : '0px')}; `; const StyledSidePanel = styled.aside` background: ${themeCssVariables.background.primary}; box-sizing: border-box; display: flex; flex-direction: column; height: 100%; overflow: hidden; position: relative; width: 100%; `; const StyledModalContainer = styled.div` height: 100%; left: 0; pointer-events: none; position: absolute; top: 0; width: 100%; z-index: 1; `; export const SidePanelForDesktop = () => { const isSidePanelOpened = useAtomStateValue(isSidePanelOpenedState); const isSidePanelClosing = useAtomStateValue(isSidePanelClosingState); const [sidePanelWidth, setSidePanelWidth] = useAtomState(sidePanelWidthState); const { closeSidePanelMenu } = useSidePanelMenu(); const { sidePanelCloseAnimationCompleteCleanup } = useSidePanelCloseAnimationCompleteCleanup(); const [modalContainer, setModalContainer] = useState( null, ); const [isResizing, setIsResizing] = useState(false); const [shouldRenderContent, setShouldRenderContent] = useState(isSidePanelOpened); const setTableWidthResizeIsActive = useSetAtomState( tableWidthResizeIsActiveState, ); const shouldShowContent = isSidePanelOpened || shouldRenderContent; const handleTransitionEnd = () => { if (isSidePanelOpened) { // Open animation completed - ensure content persists for close animation setShouldRenderContent(true); } else { // Close animation completed setShouldRenderContent(false); if (isSidePanelClosing) { sidePanelCloseAnimationCompleteCleanup(); } } }; const handleModalContainerRef = useCallback( (element: HTMLDivElement | null) => { setModalContainer(element); }, [], ); const handleWidthChange = useCallback( (width: number) => { setSidePanelWidth(width); setIsResizing(false); setTableWidthResizeIsActive(true); }, [setSidePanelWidth, setTableWidthResizeIsActive], ); const handleResizeStart = useCallback(() => { setIsResizing(true); setTableWidthResizeIsActive(false); }, [setTableWidthResizeIsActive]); const handleCollapse = useCallback(() => { closeSidePanelMenu(); setIsResizing(false); setTableWidthResizeIsActive(true); }, [closeSidePanelMenu, setTableWidthResizeIsActive]); return ( <> {shouldShowContent && } ); };