1
+ import { useState } from 'react' ;
1
2
import { AddItemCard , ImageCardWithDelete } from '@/features/image-handle' ;
3
+ import { useImageUpload } from '@/features/image-handle/api/useImageUpload' ;
2
4
import { Button , Label , Typography } from '@wraffle/ui' ;
3
5
4
- // TODO
5
- // image api 연동
6
- // 이미지 추가 부분은 api연동하며 구현하겠습니다
7
6
export const ImageStep = ( { onNext} : { onNext : ( images : string [ ] ) => void } ) => {
8
- const images : string [ ] = [ '' ] ;
7
+ const [ images , setImages ] = useState < string [ ] > ( [ ] ) ;
8
+ const { getImagePresignedUrl, uploadImageToS3} = useImageUpload ( ) ;
9
+
10
+ const handleImageUpload = async ( e : Event ) => {
11
+ const input = e . target as HTMLInputElement ;
12
+ const files = input . files ;
13
+
14
+ if ( ! files ) return ;
15
+
16
+ try {
17
+ const file = files [ 0 ] ;
18
+ const fileName = encodeURIComponent ( file . name ) ;
19
+
20
+ const presignedUrl = await getImagePresignedUrl ( fileName ) ;
21
+
22
+ await uploadImageToS3 ( presignedUrl , file ) ;
23
+
24
+ const fileUrl = presignedUrl ;
25
+ setImages ( prev => [ ...prev , fileUrl ] . slice ( 0 , 4 ) ) ;
26
+ } catch ( error ) {
27
+ console . error ( '이미지 업로드 실패:' , error ) ;
28
+ }
29
+ } ;
30
+
31
+ const handleImageDelete = ( index : number ) => {
32
+ setImages ( prev => prev . filter ( ( _ , i ) => i !== index ) ) ;
33
+ } ;
34
+
9
35
return (
10
36
< div className = 'flex h-full flex-col px-5 pb-20' >
11
37
< div className = 'mb-5' >
@@ -27,18 +53,26 @@ export const ImageStep = ({onNext}: {onNext: (images: string[]) => void}) => {
27
53
</ div >
28
54
29
55
< div className = 'flex flex-wrap gap-4' >
30
- { images . map ( url => (
56
+ { images . map ( ( url , index ) => (
31
57
< ImageCardWithDelete
32
58
key = { url }
33
59
url = { url }
34
- onClick = { ( ) => { } }
60
+ onClick = { ( ) => handleImageDelete ( index ) }
35
61
className = 'h-40 w-40'
36
62
/>
37
63
) ) }
38
64
{ images . length < 4 && (
39
65
< AddItemCard
40
66
label = '이미지 추가'
41
- onClick = { ( ) => { } }
67
+ onClick = { ( ) => {
68
+ // 웹뷰 연결 후 input 파일 변경
69
+ const input = document . createElement ( 'input' ) ;
70
+ input . type = 'file' ;
71
+ input . accept = 'image/*' ;
72
+ input . multiple = false ;
73
+ input . onchange = handleImageUpload ;
74
+ input . click ( ) ;
75
+ } }
42
76
className = 'h-40 w-40'
43
77
/>
44
78
) }
@@ -48,7 +82,7 @@ export const ImageStep = ({onNext}: {onNext: (images: string[]) => void}) => {
48
82
< Button
49
83
type = 'button'
50
84
className = 'mb-5 mt-3 disabled:text-[#A1A1AA]'
51
- // disabled={images.length === 0} // api연동 후 풀게요
85
+ disabled = { images . length === 0 }
52
86
onClick = { ( ) => onNext ( images ) }
53
87
>
54
88
다음
0 commit comments