diff --git a/actions/council.ts b/actions/council.ts index fd717533..53567466 100644 --- a/actions/council.ts +++ b/actions/council.ts @@ -97,16 +97,13 @@ export const deleteCouncilReportAction = async (id: number) => { const councilRulesPath = getPath(councilRules); export const putCouncilRulesAction = withErrorHandler( - async (bylawFormData: FormData, constitutionFormData: FormData) => { - console.log(bylawFormData); - console.log(constitutionFormData); - - decodeFormDataFileName(bylawFormData, 'newAttachments'); - decodeFormDataFileName(constitutionFormData, 'newAttachments'); + async (bylawFormData?: FormData, constitutionFormData?: FormData) => { + if (bylawFormData) decodeFormDataFileName(bylawFormData, 'newAttachments'); + if (constitutionFormData) decodeFormDataFileName(constitutionFormData, 'newAttachments'); await Promise.all([ - putCouncilRules('bylaw', bylawFormData), - putCouncilRules('constitution', constitutionFormData), + bylawFormData && putCouncilRules('bylaw', bylawFormData), + constitutionFormData && putCouncilRules('constitution', constitutionFormData), ]); revalidateTag(FETCH_TAG_COUNCIL_RULES); diff --git a/app/[locale]/community/council/rules/edit/client.tsx b/app/[locale]/community/council/rules/edit/client.tsx index 4bb277fb..85af2823 100644 --- a/app/[locale]/community/council/rules/edit/client.tsx +++ b/app/[locale]/community/council/rules/edit/client.tsx @@ -34,27 +34,41 @@ export default function CouncilByLawsEditClientPage({ councilRules }: Props) { }); const router = useRouter(); - const { handleSubmit } = methods; + const { + handleSubmit, + formState: { dirtyFields }, + } = methods; const onCancel = () => { router.back(); }; const onSubmit = handleSubmit(async (formData: FormData) => { - const bylawsDeleteIds = getAttachmentDeleteIds(formData.bylawAttachments, bylawAttachments); - const bylawsFormData = contentToFormData('EDIT', { - requestObject: { deleteIds: bylawsDeleteIds }, - attachments: formData.bylawAttachments, - }); + const bylawsFormData = dirtyFields.bylawAttachments + ? (() => { + const bylawsDeleteIds = getAttachmentDeleteIds( + formData.bylawAttachments, + bylawAttachments, + ); + return contentToFormData('EDIT', { + requestObject: { deleteIds: bylawsDeleteIds }, + attachments: formData.bylawAttachments, + }); + })() + : undefined; - const constitutionDeleteIds = getAttachmentDeleteIds( - formData.constitutionAttachments, - constitutionAttachments, - ); - const constitutionFormData = contentToFormData('EDIT', { - requestObject: { deleteIds: constitutionDeleteIds }, - attachments: formData.constitutionAttachments, - }); + const constitutionFormData = dirtyFields.constitutionAttachments + ? (() => { + const constitutionDeleteIds = getAttachmentDeleteIds( + formData.constitutionAttachments, + constitutionAttachments, + ); + return contentToFormData('EDIT', { + requestObject: { deleteIds: constitutionDeleteIds }, + attachments: formData.constitutionAttachments, + }); + })() + : undefined; await putCouncilRulesAction(bylawsFormData, constitutionFormData); }); @@ -63,11 +77,11 @@ export default function CouncilByLawsEditClientPage({ councilRules }: Props) {
- + - + diff --git a/components/form/File.tsx b/components/form/File.tsx index ab77f834..a01e9962 100644 --- a/components/form/File.tsx +++ b/components/form/File.tsx @@ -1,5 +1,5 @@ import { ChangeEventHandler, MouseEventHandler } from 'react'; -import { RegisterOptions, useFormContext, useWatch } from 'react-hook-form'; +import { FieldValues, RegisterOptions, useController, useFormContext } from 'react-hook-form'; import ClearIcon from '@/public/image/clear_icon.svg'; @@ -7,16 +7,18 @@ import { EditorFile, LocalFile } from '../../types/form'; interface FilePickerProps { name: string; - options?: RegisterOptions; + rules?: Omit< + RegisterOptions, + 'setValueAs' | 'disabled' | 'valueAsNumber' | 'valueAsDate' + >; multiple?: boolean; } -export default function FilePicker({ name, options, multiple = true }: FilePickerProps) { - const { register, setValue } = useFormContext(); - const files = useWatch({ name }) as EditorFile[]; - - register(name, options); - +export default function FilePicker({ name, rules, multiple = true }: FilePickerProps) { + const { control } = useFormContext(); + const { + field: { value: files, onChange }, + } = useController({ name, rules, control }); // 성능 확인 필요 const handleChange: ChangeEventHandler = (e) => { if (e.target.files === null) return; @@ -26,7 +28,7 @@ export default function FilePicker({ name, options, multiple = true }: FilePicke file, })); - setValue(name, [...files, ...newFiles]); + onChange([...files, ...newFiles]); // 같은 파일에 대해서 선택이 가능하도록 처리 // https://stackoverflow.com/a/12102992 @@ -36,7 +38,7 @@ export default function FilePicker({ name, options, multiple = true }: FilePicke const deleteFileAtIndex = (index: number) => { const nextFiles = [...files]; nextFiles.splice(index, 1); - setValue(name, nextFiles); + onChange(nextFiles); }; return ( @@ -47,7 +49,7 @@ export default function FilePicker({ name, options, multiple = true }: FilePicke self-start rounded-sm border-[1px] border-neutral-200 bg-neutral-50 `} > - {files.map((item, idx) => ( + {(files as EditorFile[]).map((item, idx) => (