1+ import { LoadingOutlined , PlusOutlined } from '@ant-design/icons' ;
2+ import { Upload } from 'antd' ;
3+ import * as Params from '../param/Params' ;
4+ import { useSelector } from 'react-redux' ;
5+ import { useState } from 'react' ;
6+ import { message } from 'antd' ;
7+
8+ const UploadAvatar = ( props ) => {
9+ const fileUploadHeader = {
10+ "Authorization" : "Bearer " + localStorage . getItem ( "ACCESS_TOKEN" ) ,
11+ }
12+ const user = useSelector ( state => state . userInfoReducer . user ) ;
13+ const [ loading , setLoading ] = useState ( false ) ;
14+ const [ imageUrl , setImageUrl ] = useState ( user . avatar ) ;
15+
16+ const handleChange = ( info ) => {
17+ if ( info . file . status === 'uploading' ) {
18+ setLoading ( true ) ;
19+ return ;
20+ }
21+ if ( info . file . status === 'done' ) {
22+ const response = info . file . response ;
23+ if ( response . code !== 0 ) {
24+ message . error ( response . msg ) ;
25+ } else {
26+ getBase64 ( info . file . originFileObj , ( imageUrl ) => {
27+ setImageUrl ( imageUrl ) ;
28+ setLoading ( false ) ;
29+ } ) ;
30+
31+ props . handleImgChange ( response . data )
32+ }
33+ }
34+ } ;
35+
36+ const getBase64 = ( img , callback ) => {
37+ const reader = new FileReader ( ) ;
38+ reader . addEventListener ( 'load' , ( ) => callback ( reader . result ) ) ;
39+ reader . readAsDataURL ( img ) ;
40+ }
41+ const beforeUpload = ( file ) => {
42+ const isJpgOrPng = file . type === 'image/jpeg' || file . type === 'image/png' ;
43+ if ( ! isJpgOrPng ) {
44+ message . error ( 'JPG/PNG only!' ) ;
45+ }
46+ const isLt2M = file . size / 1024 / 1024 < 2 ;
47+ if ( ! isLt2M ) {
48+ message . error ( 'Image must smaller than 2MB!' ) ;
49+ }
50+ return isJpgOrPng && isLt2M ;
51+ }
52+ return (
53+ < Upload
54+ name = "file"
55+ listType = "picture-card"
56+ className = "avatar-uploader"
57+ style = { { position : 'relative' } }
58+ showUploadList = { false }
59+ action = { Params . FILE_URL }
60+ beforeUpload = { beforeUpload }
61+ onChange = { handleChange }
62+ headers = { fileUploadHeader }
63+ // data={{ objectType: props.objectType}}
64+ >
65+ { imageUrl ? < img src = { imageUrl } alt = "avatar" style = { { width : '40%' , position :'absolute' } } /> : loading ? < LoadingOutlined /> : < PlusOutlined /> }
66+ < div style = { { marginTop : 8 } } > Upload</ div >
67+ </ Upload >
68+ )
69+ }
70+ export default UploadAvatar
0 commit comments