You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
168 lines
6.3 KiB
TypeScript
168 lines
6.3 KiB
TypeScript
import { PageContainer, ProCard } from '@ant-design/pro-components';
|
|
import React, { useEffect, useRef, useState } from 'react';
|
|
|
|
import { LoadingOutlined, PlusOutlined } from '@ant-design/icons';
|
|
import { Button, message, Upload } from 'antd';
|
|
import type { UploadChangeParam } from 'antd/es/upload';
|
|
import type { RcFile, UploadFile, UploadProps } from 'antd/es/upload/interface';
|
|
import type { ActionType } from '@ant-design/pro-components';
|
|
// svg 转组件
|
|
import { ReactComponent as AvatarSvg } from '../../../../public/icons/avatar.svg';
|
|
import styles from "./center.less";
|
|
import UpdateAccountForm from './components/UpdateAccountForm';
|
|
import UpdatePasswordForm from './components/UpdatePasswordForm';
|
|
import { FormattedMessage } from '@umijs/max';
|
|
|
|
const getBase64 = (img: RcFile, callback: (url: string) => void) => {
|
|
const reader = new FileReader();
|
|
reader.addEventListener('load', () => callback(reader.result as string));
|
|
reader.readAsDataURL(img);
|
|
};
|
|
|
|
const beforeUpload = (file: RcFile) => {
|
|
const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png';
|
|
if (!isJpgOrPng) {
|
|
message.error('You can only upload JPG/PNG file!');
|
|
}
|
|
const isLt2M = file.size / 1024 / 1024 < 2;
|
|
if (!isLt2M) {
|
|
message.error('Image must smaller than 2MB!');
|
|
}
|
|
return isJpgOrPng && isLt2M;
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
* @个人中心
|
|
* @returns
|
|
*/
|
|
const AccountCenter: React.FC = () => {
|
|
const [loading, setLoading] = useState(false);
|
|
const [imageUrl, setImageUrl] = useState<string>();
|
|
const actionRef = useRef<ActionType>();
|
|
const [updateAccountModalOpen, setUpdateAccountModalOpen] = useState<boolean>(false);
|
|
const [updatePasswordModalOpen, setUpdatePasswordModalOpen] = useState<boolean>(false);
|
|
const [currentRow, setCurrentRow] = useState<API.Project>();
|
|
|
|
const handleUpdateAccountModal = () => {
|
|
if (updateAccountModalOpen) {
|
|
setUpdateAccountModalOpen(false);
|
|
setCurrentRow(undefined);
|
|
} else {
|
|
setUpdateAccountModalOpen(true);
|
|
}
|
|
};
|
|
|
|
const handleUpdatePasswordModal = () => {
|
|
if (updatePasswordModalOpen) {
|
|
setUpdatePasswordModalOpen(false);
|
|
setCurrentRow(undefined);
|
|
} else {
|
|
setUpdatePasswordModalOpen(true);
|
|
}
|
|
};
|
|
|
|
const handleChange: UploadProps['onChange'] = (info: UploadChangeParam<UploadFile>) => {
|
|
if (info.file.status === 'uploading') {
|
|
setLoading(true);
|
|
return;
|
|
}
|
|
if (info.file.status === 'done') {
|
|
// Get this url from response in real world.
|
|
getBase64(info.file.originFileObj as RcFile, (url) => {
|
|
setLoading(false);
|
|
setImageUrl(url);
|
|
});
|
|
}
|
|
console.log(info);
|
|
};
|
|
|
|
const uploadButton = (
|
|
<div style={{ width: 100,height: 100, display: 'flex', justifyContent: 'center', alignItems: 'center' }}>
|
|
{loading ? <LoadingOutlined /> : <AvatarSvg />}
|
|
{/* <div style={{ marginTop: 8 }}>Upload</div> */}
|
|
</div>
|
|
);
|
|
|
|
return (
|
|
<PageContainer>
|
|
<ProCard
|
|
style={{ background: 'white' }}
|
|
bodyStyle={{
|
|
padding: 40,
|
|
margin: 0,
|
|
display: 'flex'
|
|
}}
|
|
gutter={24}
|
|
wrap
|
|
ghost
|
|
>
|
|
<Upload
|
|
name="avatar"
|
|
// listType="picture-card"
|
|
// className="avatar-uploader"
|
|
showUploadList={false}
|
|
maxCount={1}
|
|
action="https://run.mocky.io/v3/435e224c-44fb-4773-9faf-380c5e6a2188"
|
|
beforeUpload={beforeUpload}
|
|
onChange={handleChange}
|
|
>
|
|
{imageUrl ? <img src={imageUrl} alt="avatar" style={{ width: 100,height: 100 }} /> : uploadButton}
|
|
</Upload>
|
|
<div className={styles.infoBox}>
|
|
<div>
|
|
<span className={styles.spanStyle}>用户名:</span>王立强
|
|
</div>
|
|
<div>
|
|
<span className={styles.spanStyle}>账号ID:</span>awtk-55975980
|
|
</div>
|
|
<div>
|
|
<span className={styles.spanStyle}>注册时间:</span>2012-10-16 23:55:35
|
|
</div>
|
|
</div>
|
|
<div className={styles.infoBoxRight}>
|
|
<div>
|
|
<span className={styles.spanStyle}>登录账号:</span>wangliqun
|
|
<Button
|
|
type="link"
|
|
color="#154DDD"
|
|
onClick={() => {
|
|
setUpdateAccountModalOpen(true);
|
|
setCurrentRow({});
|
|
}}>
|
|
<FormattedMessage id="account.account_center.table.list.editor" defaultMessage="editor" />
|
|
</Button>
|
|
</div>
|
|
<div>
|
|
<span className={styles.spanStyle}>登录密码:</span>wangliqun
|
|
<Button
|
|
type="link"
|
|
color="#154DDD"
|
|
onClick={() => {
|
|
setUpdatePasswordModalOpen(true);
|
|
setCurrentRow({});
|
|
}}>
|
|
<FormattedMessage id="account.account_center.table.list.editor" defaultMessage="editor" />
|
|
</Button>
|
|
</div>
|
|
</div>
|
|
</ProCard>
|
|
<UpdateAccountForm
|
|
updateModalOpen={updateAccountModalOpen}
|
|
values={currentRow || {}}
|
|
handleModal={handleUpdateAccountModal}
|
|
reload={actionRef.current?.reload}
|
|
/>
|
|
<UpdatePasswordForm
|
|
updateModalOpen={updatePasswordModalOpen}
|
|
values={currentRow || {}}
|
|
handleModal={handleUpdatePasswordModal}
|
|
reload={actionRef.current?.reload}
|
|
/>
|
|
</PageContainer>
|
|
);
|
|
};
|
|
|
|
export default AccountCenter;
|