You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
2.9 KiB
108 lines
2.9 KiB
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<string, React.ReactNode> = {
|
|
base: '基本设置',
|
|
security: '安全设置',
|
|
binding: '账号绑定',
|
|
notification: '新消息通知',
|
|
};
|
|
const [initConfig, setInitConfig] = useState<SettingsState>({
|
|
mode: 'inline',
|
|
selectKey: 'base',
|
|
});
|
|
const dom = useRef<HTMLDivElement>(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 <BaseView />;
|
|
case 'security':
|
|
return <SecurityView />;
|
|
case 'binding':
|
|
return <BindingView />;
|
|
case 'notification':
|
|
return <NotificationView />;
|
|
default:
|
|
return null;
|
|
}
|
|
};
|
|
return (
|
|
<GridContent>
|
|
<div
|
|
className={styles.main}
|
|
ref={(ref) => {
|
|
if (ref) {
|
|
dom.current = ref;
|
|
}
|
|
}}
|
|
>
|
|
<div className={styles.leftMenu}>
|
|
<Menu
|
|
mode={initConfig.mode}
|
|
selectedKeys={[initConfig.selectKey]}
|
|
onClick={({ key }) => {
|
|
setInitConfig({
|
|
...initConfig,
|
|
selectKey: key as SettingsStateKeys,
|
|
});
|
|
}}
|
|
items={getMenu()}
|
|
/>
|
|
</div>
|
|
<div className={styles.right}>
|
|
<div className={styles.title}>{menuMap[initConfig.selectKey]}</div>
|
|
{renderChildren()}
|
|
</div>
|
|
</div>
|
|
</GridContent>
|
|
);
|
|
};
|
|
export default Settings;
|
|
|