165 lines
4.8 KiB
JavaScript
165 lines
4.8 KiB
JavaScript
// Copyright 2021 99cloud
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
import React from 'react';
|
|
import { inject, observer } from 'mobx-react';
|
|
import { Menu, Spin, Button } from 'antd';
|
|
import { UserOutlined } from '@ant-design/icons';
|
|
import i18n from 'core/i18n';
|
|
import ItemActionButtons from 'components/Tables/Base/ItemActionButtons';
|
|
import Password from './Password';
|
|
import Token from './Token';
|
|
import OpenRc from './OpenRc';
|
|
import HeaderDropdown from '../HeaderDropdown';
|
|
import styles from './index.less';
|
|
|
|
const { getLocale, setLocale } = i18n;
|
|
|
|
@inject('rootStore')
|
|
@observer
|
|
class AvatarDropdown extends React.Component {
|
|
get rootStore() {
|
|
return this.props.rootStore || {};
|
|
}
|
|
|
|
get user() {
|
|
const { user } = this.rootStore;
|
|
return user || null;
|
|
}
|
|
|
|
changeLang = (language) => setLocale(language, true);
|
|
|
|
onMenuClick = (event) => {
|
|
const { key } = event;
|
|
// eslint-disable-next-line no-console
|
|
console.log(key);
|
|
};
|
|
|
|
handleLogout = (e) => {
|
|
if (e && e.preventDefault) {
|
|
e.preventDefault();
|
|
}
|
|
this.rootStore.logout();
|
|
};
|
|
|
|
// eslint-disable-next-line no-unused-vars
|
|
afterChangePassword = (success, fail) => {
|
|
if (success) {
|
|
this.rootStore.logout();
|
|
}
|
|
};
|
|
|
|
render() {
|
|
if (!this.user) {
|
|
return (
|
|
<Spin
|
|
size="small"
|
|
style={{
|
|
marginLeft: 8,
|
|
marginRight: 8,
|
|
}}
|
|
/>
|
|
);
|
|
}
|
|
const { name: username } = this.user.user;
|
|
const selectedLang = getLocale();
|
|
// const { selectedLang } = this.state.selectedLang;
|
|
const menuHeaderDropdown = (
|
|
<Menu className={styles.menu} onClick={this.onMenuClick}>
|
|
<Menu.Item
|
|
key="user"
|
|
className={`${styles['no-hover']} ${styles['name-item']} ${styles['menu-item']}`}
|
|
>
|
|
<span>
|
|
<span className={styles['user-label']}>{t('User')}</span>
|
|
<span>{username}</span>
|
|
</span>
|
|
<Button
|
|
type="link"
|
|
onClick={this.handleLogout}
|
|
className={`${styles.logout} ${styles['no-padding-top']}`}
|
|
>
|
|
{t('Sign Out')}
|
|
</Button>
|
|
</Menu.Item>
|
|
<Menu.Divider />
|
|
<Menu.Item
|
|
key="language"
|
|
className={`${styles['no-hover']} ${styles['menu-item']}`}
|
|
>
|
|
<span>{t('Switch Language')}</span>
|
|
<span style={{ float: 'right' }}>
|
|
<Button
|
|
className={styles['no-padding-top']}
|
|
type="link"
|
|
disabled={selectedLang === 'zh-cn'}
|
|
onClick={() => {
|
|
this.changeLang('zh-cn');
|
|
}}
|
|
>
|
|
CN
|
|
</Button>
|
|
<span>/</span>
|
|
<Button
|
|
type="link"
|
|
disabled={selectedLang === 'en'}
|
|
onClick={() => {
|
|
this.changeLang('en');
|
|
}}
|
|
>
|
|
EN
|
|
</Button>
|
|
</span>
|
|
</Menu.Item>
|
|
<Menu.Item key="password" className={styles['menu-item']}>
|
|
<ItemActionButtons
|
|
actions={{ moreActions: [{ action: Password }] }}
|
|
onFinishAction={this.afterChangePassword}
|
|
item={this.user && this.user.user}
|
|
isWide
|
|
/>
|
|
</Menu.Item>
|
|
<Menu.Item key="token" className={styles['menu-item']}>
|
|
<ItemActionButtons
|
|
actions={{ moreActions: [{ action: Token }] }}
|
|
isWide
|
|
/>
|
|
</Menu.Item>
|
|
<Menu.Item key="openrc" className={styles['menu-item']}>
|
|
<ItemActionButtons
|
|
actions={{ moreActions: [{ action: OpenRc }] }}
|
|
isWide
|
|
/>
|
|
</Menu.Item>
|
|
</Menu>
|
|
);
|
|
// return currentUser && currentUser.name ? menuHeaderDropdown : null;
|
|
return (
|
|
<HeaderDropdown overlay={menuHeaderDropdown}>
|
|
<div className={`${styles.action}`}>
|
|
<Button
|
|
shape="circle"
|
|
icon={<UserOutlined />}
|
|
className={styles.avatar}
|
|
/>
|
|
{/* <Avatar size="small" className={styles.avatar} src={currentUser.avatar} alt="avatar" /> */}
|
|
{/* <span className={styles.name}>{currentUser.name}</span> */}
|
|
</div>
|
|
</HeaderDropdown>
|
|
);
|
|
}
|
|
}
|
|
|
|
export default AvatarDropdown;
|