-
Notifications
You must be signed in to change notification settings - Fork 390
Expand file tree
/
Copy pathImageUploader.tsx
More file actions
73 lines (66 loc) · 1.99 KB
/
ImageUploader.tsx
File metadata and controls
73 lines (66 loc) · 1.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import { blobUrlToFile } from '@/utils/file-helper';
import clsx from 'clsx';
import React, { PropsWithChildren, useState } from 'react';
import { uploadFile, UploadFileResult, useAsyncRequest } from 'tailchat-shared';
import { ImagePicker } from './ImagePicker';
interface ImageUploaderProps extends PropsWithChildren {
circle?: boolean;
aspect?: number;
maxSize?: number;
className?: string;
onUploadSuccess: (fileInfo: UploadFileResult) => void;
}
export const ImageUploader: React.FC<ImageUploaderProps> = React.memo(
(props) => {
const aspect = props.aspect ?? 1;
const [uploadProgress, setUploadProgress] = useState(0); // 0 - 100
const [{ loading }, handlePickImage] = useAsyncRequest(
async (blobUrl: string) => {
const file = await blobUrlToFile(blobUrl);
const fileInfo = await uploadFile(file, {
onProgress(percent) {
const uploadProgress = Number((percent * 100).toFixed());
console.log(`进度:${uploadProgress}`);
setUploadProgress(uploadProgress);
},
});
console.log('上传成功', fileInfo);
props.onUploadSuccess(fileInfo);
},
[]
);
return (
<ImagePicker
className={clsx(props.className, 'relative overflow-hidden', {
'rounded-full': props.circle,
})}
aspect={aspect}
maxSize={props.maxSize}
disabled={loading}
onChange={handlePickImage}
>
{loading && (
<div
className="absolute bottom-0 left-0 h-1"
style={{ width: `${uploadProgress}%` }}
/>
)}
{props.children}
</ImagePicker>
);
}
);
ImageUploader.displayName = 'ImageUploader';
export const AvatarUploader: React.FC<ImageUploaderProps> = React.memo(
(props) => {
return (
<ImageUploader
aspect={1}
maxSize={256}
circle={true}
{...props}
></ImageUploader>
);
}
);
AvatarUploader.displayName = 'AvatarUploader';