PageLayout.js 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import HeaderBar from './HeaderBar.js';
  2. import { Layout } from '@douyinfe/semi-ui';
  3. import SiderBar from './SiderBar.js';
  4. import App from '../App.js';
  5. import FooterBar from './Footer.js';
  6. import { ToastContainer } from 'react-toastify';
  7. import React, { useContext, useEffect } from 'react';
  8. import { StyleContext } from '../context/Style/index.js';
  9. import { useTranslation } from 'react-i18next';
  10. import { API, getLogo, getSystemName, showError } from '../helpers/index.js';
  11. import { setStatusData } from '../helpers/data.js';
  12. import { UserContext } from '../context/User/index.js';
  13. import { StatusContext } from '../context/Status/index.js';
  14. const { Sider, Content, Header, Footer } = Layout;
  15. const PageLayout = () => {
  16. const [userState, userDispatch] = useContext(UserContext);
  17. const [statusState, statusDispatch] = useContext(StatusContext);
  18. const [styleState, styleDispatch] = useContext(StyleContext);
  19. const { i18n } = useTranslation();
  20. const loadUser = () => {
  21. let user = localStorage.getItem('user');
  22. if (user) {
  23. let data = JSON.parse(user);
  24. userDispatch({ type: 'login', payload: data });
  25. }
  26. };
  27. const loadStatus = async () => {
  28. try {
  29. const res = await API.get('/api/status');
  30. const { success, data } = res.data;
  31. if (success) {
  32. statusDispatch({ type: 'set', payload: data });
  33. setStatusData(data);
  34. } else {
  35. showError('Unable to connect to server');
  36. }
  37. } catch (error) {
  38. showError('Failed to load status');
  39. }
  40. };
  41. useEffect(() => {
  42. loadUser();
  43. loadStatus().catch(console.error);
  44. let systemName = getSystemName();
  45. if (systemName) {
  46. document.title = systemName;
  47. }
  48. let logo = getLogo();
  49. if (logo) {
  50. let linkElement = document.querySelector("link[rel~='icon']");
  51. if (linkElement) {
  52. linkElement.href = logo;
  53. }
  54. }
  55. // 从localStorage获取上次使用的语言
  56. const savedLang = localStorage.getItem('i18nextLng');
  57. if (savedLang) {
  58. i18n.changeLanguage(savedLang);
  59. }
  60. }, [i18n]);
  61. return (
  62. <Layout style={{ height: '100vh', display: 'flex', flexDirection: 'column' }}>
  63. <Header>
  64. <HeaderBar />
  65. </Header>
  66. <Layout style={{ flex: 1, overflow: 'hidden' }}>
  67. <Sider>
  68. {styleState.showSider ? <SiderBar /> : null}
  69. </Sider>
  70. <Layout>
  71. <Content
  72. style={{ overflowY: 'auto', padding: styleState.shouldInnerPadding? '24px': '0' }}
  73. >
  74. <App />
  75. </Content>
  76. <Layout.Footer>
  77. <FooterBar />
  78. </Layout.Footer>
  79. </Layout>
  80. </Layout>
  81. <ToastContainer />
  82. </Layout>
  83. )
  84. }
  85. export default PageLayout;