11import { ChangeEventHandler , MouseEventHandler } from 'react' ;
2- import { RegisterOptions , useFormContext , useWatch } from 'react-hook-form' ;
2+ import { FieldValues , RegisterOptions , useController , useFormContext } from 'react-hook-form' ;
33
44import ClearIcon from '@/public/image/clear_icon.svg' ;
55
66import { EditorFile , LocalFile } from '../../types/form' ;
77
88interface FilePickerProps {
99 name : string ;
10- options ?: RegisterOptions ;
10+ rules ?: Omit <
11+ RegisterOptions < FieldValues , string > ,
12+ 'setValueAs' | 'disabled' | 'valueAsNumber' | 'valueAsDate'
13+ > ;
1114 multiple ?: boolean ;
1215}
1316
14- export default function FilePicker ( { name, options, multiple = true } : FilePickerProps ) {
15- const { register, setValue } = useFormContext ( ) ;
16- const files = useWatch ( { name } ) as EditorFile [ ] ;
17-
18- register ( name , options ) ;
19-
17+ export default function FilePicker ( { name, rules, multiple = true } : FilePickerProps ) {
18+ const { control } = useFormContext ( ) ;
19+ const {
20+ field : { value : files , onChange } ,
21+ } = useController ( { name, rules, control } ) ;
2022 // 성능 확인 필요
2123 const handleChange : ChangeEventHandler < HTMLInputElement > = ( e ) => {
2224 if ( e . target . files === null ) return ;
@@ -26,7 +28,7 @@ export default function FilePicker({ name, options, multiple = true }: FilePicke
2628 file,
2729 } ) ) ;
2830
29- setValue ( name , [ ...files , ...newFiles ] ) ;
31+ onChange ( [ ...files , ...newFiles ] ) ;
3032
3133 // 같은 파일에 대해서 선택이 가능하도록 처리
3234 // https://stackoverflow.com/a/12102992
@@ -36,7 +38,7 @@ export default function FilePicker({ name, options, multiple = true }: FilePicke
3638 const deleteFileAtIndex = ( index : number ) => {
3739 const nextFiles = [ ...files ] ;
3840 nextFiles . splice ( index , 1 ) ;
39- setValue ( name , nextFiles ) ;
41+ onChange ( nextFiles ) ;
4042 } ;
4143
4244 return (
@@ -47,7 +49,7 @@ export default function FilePicker({ name, options, multiple = true }: FilePicke
4749 self-start rounded-sm border-[1px] border-neutral-200 bg-neutral-50
4850 ` }
4951 >
50- { files . map ( ( item , idx ) => (
52+ { ( files as EditorFile [ ] ) . map ( ( item , idx ) => (
5153 < FilePickerRow
5254 // 순서를 안바꾸기로 했으니 키값으로 인덱스 써도 ㄱㅊ
5355 key = { idx }
0 commit comments