index.jsx 1.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import React, { useEffect, useRef, useMemo, useState } from 'react';
  2. import { Layout, Spin } from 'antd';
  3. import { useLocation, Outlet } from "react-router-dom";
  4. import { useModel } from '@/store';
  5. import { getMenuItems } from '@/routes/menus';
  6. import useRoute from '@/utils/hooks/useRoute';
  7. import RequireLogin from './components/RequireLogin';
  8. import SiderBar from './components/SiderBar';
  9. import Header from './components/Header';
  10. import Container from './components/Container';
  11. import HtmlTitle from './components/HtmlTitle';
  12. import './style.less';
  13. export default (props) => {
  14. const { theme } = useModel('system');
  15. const { user, menus } = useModel('user');
  16. const location = useLocation();
  17. const { meta } = useRoute() || {};
  18. const { noLayout = false, noSiderBar = false, noFooter = false } = meta || {};
  19. const splitMenus = useMemo(() => menus.map(x => ({ ...x, children: undefined })), [menus]);
  20. const siderMenus = useMemo(() => {
  21. const target = menus.filter(x => location.pathname.indexOf(x.key) === 0)[0];
  22. return target ? target.children : [];
  23. }, [menus, location.pathname]);
  24. return (
  25. <Spin spinning={!user} size="large">
  26. <HtmlTitle />
  27. <RequireLogin>
  28. {
  29. noLayout
  30. ? <Outlet />
  31. : (
  32. <Layout style={{ minHeight: '100vh' }}>
  33. <Header theme={theme} menus={splitMenus} location={location} />
  34. <Layout>
  35. { !noSiderBar && <SiderBar theme={theme} menus={siderMenus} location={location} /> }
  36. <Container location={location} noFooter={noFooter} />
  37. </Layout>
  38. </Layout>
  39. )
  40. }
  41. </RequireLogin>
  42. </Spin>
  43. );
  44. }