index.tsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. import React from 'react';
  2. import { Layout, Nav } from '@douyinfe/semi-ui';
  3. import { BrowserRouter, useLocation, useNavigate, Routes, Route, Navigate } from 'react-router-dom';
  4. import { IconSemiLogo } from '@douyinfe/semi-icons';
  5. const { Header, Sider, Content } = Layout;
  6. const RouterConfig = {
  7. config: {
  8. itemKey: '/config',
  9. text: 'Config',
  10. items: [
  11. {
  12. itemKey: '/config/ability',
  13. text: 'Ability',
  14. items: [
  15. {
  16. itemKey: '/config/ability/management',
  17. text: 'Ability management',
  18. },
  19. ],
  20. },
  21. {
  22. itemKey: '/config/task',
  23. text: 'Task',
  24. items: [
  25. {
  26. itemKey: '/config/task/management',
  27. text: 'Word management',
  28. },
  29. ],
  30. },
  31. ],
  32. },
  33. distribution: {
  34. itemKey: '/distribution',
  35. text: 'Distribution',
  36. items: [
  37. {
  38. itemKey: '/distribution/queue',
  39. text: 'Queue',
  40. items: [
  41. {
  42. itemKey: '/distribution/queue/management',
  43. text: 'Config management',
  44. },
  45. ],
  46. },
  47. ],
  48. },
  49. };
  50. const AppHeader = () => {
  51. const location = useLocation();
  52. const navigate = useNavigate();
  53. const selectedKeys = React.useMemo(
  54. () => [
  55. location.pathname
  56. .split('/')
  57. .slice(0, 2)
  58. .join('/'),
  59. ],
  60. [location.pathname]
  61. );
  62. const HeaderItems = React.useMemo(
  63. () =>
  64. Object.values(RouterConfig).map(option => (
  65. <Nav.Item
  66. key={option.itemKey}
  67. itemKey={option.itemKey}
  68. text={option.text}
  69. onClick={() => {
  70. if (option.itemKey) {
  71. navigate(option.itemKey);
  72. }
  73. }}
  74. />
  75. )),
  76. [navigate]
  77. );
  78. return (
  79. <Header>
  80. <div>
  81. <Nav mode="horizontal" selectedKeys={selectedKeys} style={{ height: '52px' }}>
  82. <Nav.Header>
  83. <IconSemiLogo style={{ fontSize: 36 }} />
  84. <span>Semi Design</span>
  85. </Nav.Header>
  86. {HeaderItems}
  87. </Nav>
  88. </div>
  89. </Header>
  90. );
  91. };
  92. const AppSider = () => {
  93. const location = useLocation();
  94. const selectedFirstLevelKey = React.useMemo(() => location.pathname.split('/')[1], [location.pathname]);
  95. const siderItems = React.useMemo(() => {
  96. const selectedKeyConfig = RouterConfig[selectedFirstLevelKey];
  97. return selectedKeyConfig?.items ?? [];
  98. }, [selectedFirstLevelKey]);
  99. const selectedKey = React.useMemo(() => [location.pathname], [location.pathname]);
  100. return (
  101. <Sider>
  102. <Nav selectedKeys={selectedKey} items={siderItems} />
  103. </Sider>
  104. );
  105. };
  106. const AppContent = () => {
  107. return (
  108. <Routes>
  109. <Route path="/config/ability/management" element={<div>ability</div>} />
  110. <Route path="/config/task/management" element={<div>word</div>} />
  111. <Route path="/config" element={<Navigate to="/config/ability/management" replace />} />
  112. <Route path="/distribution/queue/management" element={<div>config management</div>} />
  113. <Route path="/distribution" element={<Navigate to="/distribution/queue/management" replace />} />
  114. <Route index element={<Navigate to="/config/ability/management" replace />} />
  115. </Routes>
  116. );
  117. };
  118. export default function App() {
  119. return (
  120. <BrowserRouter>
  121. <div style={{ width: '100%', height: '100%', display: 'flex' }}>
  122. <Layout>
  123. <AppHeader />
  124. <Layout>
  125. <AppSider />
  126. <Content>
  127. <AppContent />
  128. </Content>
  129. </Layout>
  130. </Layout>
  131. </div>
  132. </BrowserRouter>
  133. );
  134. }