217 lines
6.3 KiB
JavaScript
217 lines
6.3 KiB
JavaScript
![]() |
import React, { PureComponent } from 'react';
|
||
|
import { connect } from 'dva';
|
||
|
import Link from 'umi/link';
|
||
|
import router from 'umi/router';
|
||
|
import { Card, Row, Col, Icon, Avatar, Tag, Divider, Spin, Input } from 'antd';
|
||
|
import GridContent from '@/components/PageHeaderWrapper/GridContent';
|
||
|
import styles from './Center.less';
|
||
|
|
||
|
@connect(({ loading, user, project }) => ({
|
||
|
listLoading: loading.effects['list/fetch'],
|
||
|
currentUser: user.currentUser,
|
||
|
currentUserLoading: loading.effects['user/fetchCurrent'],
|
||
|
project,
|
||
|
projectLoading: loading.effects['project/fetchNotice'],
|
||
|
}))
|
||
|
class Center extends PureComponent {
|
||
|
state = {
|
||
|
newTags: [],
|
||
|
inputVisible: false,
|
||
|
inputValue: '',
|
||
|
};
|
||
|
|
||
|
componentDidMount() {
|
||
|
const { dispatch } = this.props;
|
||
|
dispatch({
|
||
|
type: 'user/fetchCurrent',
|
||
|
});
|
||
|
dispatch({
|
||
|
type: 'list/fetch',
|
||
|
payload: {
|
||
|
count: 8,
|
||
|
},
|
||
|
});
|
||
|
dispatch({
|
||
|
type: 'project/fetchNotice',
|
||
|
});
|
||
|
}
|
||
|
|
||
|
onTabChange = key => {
|
||
|
const { match } = this.props;
|
||
|
switch (key) {
|
||
|
case 'articles':
|
||
|
router.push(`${match.url}/articles`);
|
||
|
break;
|
||
|
case 'applications':
|
||
|
router.push(`${match.url}/applications`);
|
||
|
break;
|
||
|
case 'projects':
|
||
|
router.push(`${match.url}/projects`);
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
showInput = () => {
|
||
|
this.setState({ inputVisible: true }, () => this.input.focus());
|
||
|
};
|
||
|
|
||
|
saveInputRef = input => {
|
||
|
this.input = input;
|
||
|
};
|
||
|
|
||
|
handleInputChange = e => {
|
||
|
this.setState({ inputValue: e.target.value });
|
||
|
};
|
||
|
|
||
|
handleInputConfirm = () => {
|
||
|
const { state } = this;
|
||
|
const { inputValue } = state;
|
||
|
let { newTags } = state;
|
||
|
if (inputValue && newTags.filter(tag => tag.label === inputValue).length === 0) {
|
||
|
newTags = [...newTags, { key: `new-${newTags.length}`, label: inputValue }];
|
||
|
}
|
||
|
this.setState({
|
||
|
newTags,
|
||
|
inputVisible: false,
|
||
|
inputValue: '',
|
||
|
});
|
||
|
};
|
||
|
|
||
|
render() {
|
||
|
const { newTags, inputVisible, inputValue } = this.state;
|
||
|
const {
|
||
|
listLoading,
|
||
|
currentUser,
|
||
|
currentUserLoading,
|
||
|
project: { notice },
|
||
|
projectLoading,
|
||
|
match,
|
||
|
location,
|
||
|
children,
|
||
|
} = this.props;
|
||
|
|
||
|
const operationTabList = [
|
||
|
{
|
||
|
key: 'articles',
|
||
|
tab: (
|
||
|
<span>
|
||
|
文章 <span style={{ fontSize: 14 }}>(8)</span>
|
||
|
</span>
|
||
|
),
|
||
|
},
|
||
|
{
|
||
|
key: 'applications',
|
||
|
tab: (
|
||
|
<span>
|
||
|
应用 <span style={{ fontSize: 14 }}>(8)</span>
|
||
|
</span>
|
||
|
),
|
||
|
},
|
||
|
{
|
||
|
key: 'projects',
|
||
|
tab: (
|
||
|
<span>
|
||
|
项目 <span style={{ fontSize: 14 }}>(8)</span>
|
||
|
</span>
|
||
|
),
|
||
|
},
|
||
|
];
|
||
|
|
||
|
return (
|
||
|
<GridContent className={styles.userCenter}>
|
||
|
<Row gutter={24}>
|
||
|
<Col lg={7} md={24}>
|
||
|
<Card bordered={false} style={{ marginBottom: 24 }} loading={currentUserLoading}>
|
||
|
{currentUser && Object.keys(currentUser).length ? (
|
||
|
<div>
|
||
|
<div className={styles.avatarHolder}>
|
||
|
<img alt="" src={currentUser.avatar} />
|
||
|
<div className={styles.name}>{currentUser.name}</div>
|
||
|
<div>{currentUser.signature}</div>
|
||
|
</div>
|
||
|
<div className={styles.detail}>
|
||
|
<p>
|
||
|
<i className={styles.title} />
|
||
|
{currentUser.title}
|
||
|
</p>
|
||
|
<p>
|
||
|
<i className={styles.group} />
|
||
|
{currentUser.group}
|
||
|
</p>
|
||
|
<p>
|
||
|
<i className={styles.address} />
|
||
|
{currentUser.geographic.province.label}
|
||
|
{currentUser.geographic.city.label}
|
||
|
</p>
|
||
|
</div>
|
||
|
<Divider dashed />
|
||
|
<div className={styles.tags}>
|
||
|
<div className={styles.tagsTitle}>标签</div>
|
||
|
{currentUser.tags.concat(newTags).map(item => (
|
||
|
<Tag key={item.key}>{item.label}</Tag>
|
||
|
))}
|
||
|
{inputVisible && (
|
||
|
<Input
|
||
|
ref={this.saveInputRef}
|
||
|
type="text"
|
||
|
size="small"
|
||
|
style={{ width: 78 }}
|
||
|
value={inputValue}
|
||
|
onChange={this.handleInputChange}
|
||
|
onBlur={this.handleInputConfirm}
|
||
|
onPressEnter={this.handleInputConfirm}
|
||
|
/>
|
||
|
)}
|
||
|
{!inputVisible && (
|
||
|
<Tag
|
||
|
onClick={this.showInput}
|
||
|
style={{ background: '#fff', borderStyle: 'dashed' }}
|
||
|
>
|
||
|
<Icon type="plus" />
|
||
|
</Tag>
|
||
|
)}
|
||
|
</div>
|
||
|
<Divider style={{ marginTop: 16 }} dashed />
|
||
|
<div className={styles.team}>
|
||
|
<div className={styles.teamTitle}>团队</div>
|
||
|
<Spin spinning={projectLoading}>
|
||
|
<Row gutter={36}>
|
||
|
{notice.map(item => (
|
||
|
<Col key={item.id} lg={24} xl={12}>
|
||
|
<Link to={item.href}>
|
||
|
<Avatar size="small" src={item.logo} />
|
||
|
{item.member}
|
||
|
</Link>
|
||
|
</Col>
|
||
|
))}
|
||
|
</Row>
|
||
|
</Spin>
|
||
|
</div>
|
||
|
</div>
|
||
|
) : (
|
||
|
'loading...'
|
||
|
)}
|
||
|
</Card>
|
||
|
</Col>
|
||
|
<Col lg={17} md={24}>
|
||
|
<Card
|
||
|
className={styles.tabsCard}
|
||
|
bordered={false}
|
||
|
tabList={operationTabList}
|
||
|
activeTabKey={location.pathname.replace(`${match.path}/`, '')}
|
||
|
onTabChange={this.onTabChange}
|
||
|
loading={listLoading}
|
||
|
>
|
||
|
{children}
|
||
|
</Card>
|
||
|
</Col>
|
||
|
</Row>
|
||
|
</GridContent>
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export default Center;
|