-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathuseImageUpload.ts
More file actions
79 lines (70 loc) · 2.15 KB
/
useImageUpload.ts
File metadata and controls
79 lines (70 loc) · 2.15 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
74
75
76
77
78
79
import { useRef, useState, useCallback, useEffect } from 'react';
import { uploadFile } from '../../features/event/hooks/usePresignedUrlHook';
import { convertImageToWebP } from '../lib/convertImageToWebP';
import basicProfile from '../../../public/assets/event-manage/creation/BasicProfile.png';
const useImageUpload = ({
value,
onSuccess,
useDefaultImage = true,
}: {
value?: string;
onSuccess?: (url: string) => void;
useDefaultImage?: boolean;
}) => {
const [previewUrl, setPreviewUrl] = useState<string | null>(null);
const [isDragging, setIsDragging] = useState(false);
const fileInputRef = useRef<HTMLInputElement>(null);
useEffect(() => {
if (value) {
setPreviewUrl(value);
} else if (useDefaultImage && previewUrl !== basicProfile) {
setPreviewUrl(basicProfile);
onSuccess?.(basicProfile);
}
}, [value, onSuccess, useDefaultImage, previewUrl]);
const validateFile = (file: File) => {
if (file.size > 4 * 1024 * 1024) {
alert('파일 크기는 4MB를 초과할 수 없습니다.');
return false;
}
if (!['image/jpg', 'image/jpeg', 'image/png'].includes(file.type)) {
alert('jpg, jpeg, png 파일만 업로드 가능합니다.');
return false;
}
return true;
};
const handleFileUpload = useCallback(
async (file: File) => {
if (!validateFile(file)) return;
try {
const webpFile = await convertImageToWebP(file);
const imageUrl = await uploadFile(webpFile);
setPreviewUrl(imageUrl);
onSuccess?.(imageUrl);
} catch (error) {
console.error('파일 업로드 실패:', error);
}
},
[onSuccess]
);
const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const file = e.target.files?.[0];
if (file) handleFileUpload(file);
};
const handleDrop = (e: React.DragEvent) => {
e.preventDefault();
setIsDragging(false);
const file = e.dataTransfer.files[0];
if (file) handleFileUpload(file);
};
return {
previewUrl,
isDragging,
setIsDragging,
fileInputRef,
handleFileUpload,
handleFileChange,
handleDrop,
};
};
export default useImageUpload;