import React, { Component } from 'react'; import type { Dispatch } from 'umi'; import { FormattedMessage, connect } from 'umi'; import { GridContent } from '@ant-design/pro-layout'; import { Menu } from 'antd'; import BaseView from './components/base'; import BindingView from './components/binding'; import type { CurrentUser } from './data.d'; import NotificationView from './components/notification'; import SecurityView from './components/security'; import styles from './style.less'; const { Item } = Menu; interface SettingsProps { dispatch: Dispatch; currentUser: CurrentUser; } type SettingsStateKeys = 'base' | 'security' | 'binding' | 'notification'; interface SettingsState { mode: 'inline' | 'horizontal'; menuMap: Record; selectKey: SettingsStateKeys; } class Settings extends Component { main: HTMLDivElement | undefined = undefined; constructor(props: SettingsProps) { super(props); const menuMap = { base: ( ), security: ( ), binding: ( ), notification: ( ), }; this.state = { mode: 'inline', menuMap, selectKey: 'base', }; } componentDidMount() { const { dispatch } = this.props; // dispatch({ // type: 'accountAndsettings/fetchCurrent', // }); window.addEventListener('resize', this.resize); this.resize(); } componentWillUnmount() { window.removeEventListener('resize', this.resize); } getMenu = () => { const { menuMap } = this.state; return Object.keys(menuMap).map((item) => {menuMap[item]}); }; getRightTitle = () => { const { selectKey, menuMap } = this.state; return menuMap[selectKey]; }; selectKey = (key: SettingsStateKeys) => { this.setState({ selectKey: key, }); }; resize = () => { if (!this.main) { return; } requestAnimationFrame(() => { if (!this.main) { return; } let mode: 'inline' | 'horizontal' = 'inline'; const { offsetWidth } = this.main; if (this.main.offsetWidth < 641 && offsetWidth > 400) { mode = 'horizontal'; } if (window.innerWidth < 768 && offsetWidth > 400) { mode = 'horizontal'; } this.setState({ mode, }); }); }; renderChildren = () => { const { selectKey } = this.state; switch (selectKey) { case 'base': return ; case 'security': return ; case 'binding': return ; case 'notification': return ; default: break; } return null; }; render() { const { currentUser } = this.props; if (!currentUser.userid) { return ''; } const { mode, selectKey } = this.state; return (
{ if (ref) { this.main = ref; } }} >
this.selectKey(key as SettingsStateKeys)} > {this.getMenu()}
{this.getRightTitle()}
{this.renderChildren()}
); } } export default connect( ({ accountAndsettings }: { accountAndsettings: { currentUser: CurrentUser } }) => ({ currentUser: accountAndsettings.currentUser, }), )(Settings);