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

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;