index.jsx 1.6KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  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 { getItems } 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 } = useModel('user');
  16. const allMenus = useMemo(() => getItems(), []);
  17. const [siderMenus, setSiderMenus] = useState([]);
  18. const location = useLocation();
  19. const currentRoute = useRoute();
  20. const onSplitMenuChange = (key) => {
  21. const target = allMenus.filter(x => x.key === key)[0];
  22. if (target) {
  23. setSiderMenus(target.children || []);
  24. }
  25. }
  26. return (
  27. <Spin spinning={!user} size="large">
  28. <HtmlTitle />
  29. <RequireLogin>
  30. {
  31. currentRoute && currentRoute.meta && currentRoute.meta.noLayout
  32. ? <Outlet />
  33. : (
  34. <Layout style={{ minHeight: '100vh' }}>
  35. <Header theme={theme} menus={allMenus} location={location} onMenuChange={onSplitMenuChange} />
  36. <Layout>
  37. <SiderBar theme={theme} menus={siderMenus} location={location} />
  38. <Container location={location} />
  39. </Layout>
  40. </Layout>
  41. )
  42. }
  43. </RequireLogin>
  44. </Spin>
  45. );
  46. }