import { AdminLayout, LAYOUT_SCROLL_EL_ID } from '@sa/materials'; import type { LayoutMode } from '@sa/materials'; import { configResponsive } from 'ahooks'; import { Suspense } from 'react'; import './index.scss'; import { LAYOUT_MODE_HORIZONTAL, LAYOUT_MODE_HORIZONTAL_MIX, LAYOUT_MODE_VERTICAL, LAYOUT_MODE_VERTICAL_MIX } from '@/constants/common'; import { useMixMenuContext } from '@/features/menu'; import GlobalTab from '@/features/tab/GlobalTab'; import { getThemeSettings, setLayoutMode } from '@/features/theme'; import { getFullContent, getMixSiderFixed, getSiderCollapse, setIsMobile, setSiderCollapse } from '../appStore'; import GlobalContent from '../modules/GlobalContent'; import GlobalFooter from '../modules/GlobalFooter'; import GlobalSider from '../modules/GlobalSider'; import GlobalHeader from '../modules/global-header/GlobalHeader'; import GlobalMenu from '../modules/global-menu'; import ThemeDrawer from '../modules/theme-drawer'; configResponsive({ sm: 640 }); const BaseLayout = () => { const dispatch = useAppDispatch(); const themeSettings = useAppSelector(getThemeSettings); const siderCollapse = useAppSelector(getSiderCollapse); const fullContent = useAppSelector(getFullContent); const responsive = useResponsive(); const mixSiderFixed = useAppSelector(getMixSiderFixed); const { childLevelMenus, isActiveFirstLevelMenuHasChildren } = useMixMenuContext(); const siderVisible = themeSettings.layout.mode !== LAYOUT_MODE_HORIZONTAL; const isVerticalMix = themeSettings.layout.mode === LAYOUT_MODE_VERTICAL_MIX; const isHorizontalMix = themeSettings.layout.mode === LAYOUT_MODE_HORIZONTAL_MIX; const layoutMode = themeSettings.layout.mode.includes(LAYOUT_MODE_VERTICAL) ? LAYOUT_MODE_VERTICAL : LAYOUT_MODE_HORIZONTAL; const isMobile = !responsive.sm; function getSiderWidth() { const { reverseHorizontalMix } = themeSettings.layout; const { mixChildMenuWidth, mixWidth, width } = themeSettings.sider; if (isHorizontalMix && reverseHorizontalMix) { return isActiveFirstLevelMenuHasChildren ? width : 0; } let w = isVerticalMix || isHorizontalMix ? mixWidth : width; if (isVerticalMix && mixSiderFixed && childLevelMenus.length) { w += mixChildMenuWidth; } return w; } const siderWidth = getSiderWidth(); function getSiderCollapsedWidth() { const { reverseHorizontalMix } = themeSettings.layout; const { collapsedWidth, mixChildMenuWidth, mixCollapsedWidth } = themeSettings.sider; if (isHorizontalMix && reverseHorizontalMix) { return isActiveFirstLevelMenuHasChildren ? collapsedWidth : 0; } let w = isVerticalMix || isHorizontalMix ? mixCollapsedWidth : collapsedWidth; if (isVerticalMix && mixSiderFixed && childLevelMenus.length) { w += mixChildMenuWidth; } return w; } const siderCollapsedWidth = getSiderCollapsedWidth(); function updateSiderCollapse() { dispatch(setSiderCollapse(true)); } useLayoutEffect(() => { dispatch(setIsMobile(isMobile)); if (isMobile) { dispatch(setLayoutMode('vertical')); } }, [isMobile, dispatch]); return ( } footerHeight={themeSettings.footer.height} footerVisible={themeSettings.footer.visible} fullContent={fullContent} headerHeight={themeSettings.header.height} isMobile={isMobile} mode={layoutMode as LayoutMode} rightFooter={themeSettings.footer.right} scrollElId={LAYOUT_SCROLL_EL_ID} scrollMode={themeSettings.layout.scrollMode} siderCollapse={siderCollapse} siderCollapsedWidth={siderCollapsedWidth} siderVisible={siderVisible} siderWidth={siderWidth} Tab={} tabHeight={themeSettings.tab.height} tabVisible={themeSettings.tab.visible} updateSiderCollapse={updateSiderCollapse} Header={ } Sider={ } > ); }; export default BaseLayout;