import { GridContent } from '@ant-design/pro-components'; import { Menu } from 'antd'; import React, { useLayoutEffect, useRef, useState } from 'react'; import BaseView from './components/base'; import BindingView from './components/binding'; import NotificationView from './components/notification'; import SecurityView from './components/security'; import useStyles from './style.style'; type SettingsStateKeys = 'base' | 'security' | 'binding' | 'notification'; type SettingsState = { mode: 'inline' | 'horizontal'; selectKey: SettingsStateKeys; }; const Settings: React.FC = () => { const { styles } = useStyles(); const menuMap: Record = { base: '基本设置', security: '安全设置', binding: '账号绑定', notification: '新消息通知', }; const [initConfig, setInitConfig] = useState({ mode: 'inline', selectKey: 'base', }); const dom = useRef(null); const resize = () => { requestAnimationFrame(() => { if (!dom.current) { return; } let mode: 'inline' | 'horizontal' = 'inline'; const { offsetWidth } = dom.current; if (dom.current.offsetWidth < 641 && offsetWidth > 400) { mode = 'horizontal'; } if (window.innerWidth < 768 && offsetWidth > 400) { mode = 'horizontal'; } setInitConfig({ ...initConfig, mode: mode as SettingsState['mode'], }); }); }; useLayoutEffect(() => { if (dom.current) { window.addEventListener('resize', resize); resize(); } return () => { window.removeEventListener('resize', resize); }; }, []); const getMenu = () => { return Object.keys(menuMap).map((item) => ({ key: item, label: menuMap[item], })); }; const renderChildren = () => { const { selectKey } = initConfig; switch (selectKey) { case 'base': return ; case 'security': return ; case 'binding': return ; case 'notification': return ; default: return null; } }; return (
{ if (ref) { dom.current = ref; } }} >
{ setInitConfig({ ...initConfig, selectKey: key as SettingsStateKeys, }); }} items={getMenu()} />
{menuMap[initConfig.selectKey]}
{renderChildren()}
); }; export default Settings;