From a9edcee115bf81d3a80d77cb79cc29e0ee87cb28 Mon Sep 17 00:00:00 2001 From: sw326 Date: Mon, 23 Sep 2024 03:06:20 +0900 Subject: [PATCH] fix: commission write fixed --- src/api/commissions.ts | 4 +++- src/pages/members/CommissionWrite.tsx | 33 ++++++++++++++++----------- src/types/commission.ts | 7 +++--- src/utils/validationUtils.ts | 6 +++-- 4 files changed, 30 insertions(+), 20 deletions(-) diff --git a/src/api/commissions.ts b/src/api/commissions.ts index ef5bb5e..c9a1bba 100644 --- a/src/api/commissions.ts +++ b/src/api/commissions.ts @@ -30,7 +30,9 @@ export const fetchCommissionSendDetail = async ( }; export const createCommission = async ( - commission: Omit, + commission: Omit & { + addressId: number; + }, ): Promise => { const response = await api.post('/commission', commission); return response.data; diff --git a/src/pages/members/CommissionWrite.tsx b/src/pages/members/CommissionWrite.tsx index 7bf959c..b91d831 100644 --- a/src/pages/members/CommissionWrite.tsx +++ b/src/pages/members/CommissionWrite.tsx @@ -1,4 +1,4 @@ -import React, { useState, useRef } from 'react'; +import React, { useState, useRef, useCallback } from 'react'; import { useNavigate } from 'react-router-dom'; import toast from 'react-hot-toast'; import { @@ -10,7 +10,6 @@ import { CleanType, CommissionFormData, AddressData, - Status, CleanTypeKorean, HouseTypeKorean, } from '../../types/commission'; @@ -49,10 +48,10 @@ const CommissionWrite: React.FC = () => { const [isUploading, setIsUploading] = useState(false); const fileInputRef = useRef(null); - const handleAddressSelect = (addressData: AddressData) => { + const handleAddressSelect = useCallback((addressData: AddressData) => { setForm(prev => ({ ...prev, addressId: addressData.id })); setSelectedAddress(addressData); - }; + }, []); const handleChange = ( e: React.ChangeEvent< @@ -104,12 +103,12 @@ const CommissionWrite: React.FC = () => { } }; - const validateForm = (): boolean => { + const validateForm = useCallback((): boolean => { const validations = [ { field: 'size', validation: validateSize(form.size?.toString() || '') }, { field: 'houseType', validation: validateHouseType(form.houseType) }, { field: 'cleanType', validation: validateCleanType(form.cleanType) }, - { field: 'address', validation: validateAddress(selectedAddress) }, + { field: 'addressId', validation: validateAddress(form.addressId) }, { field: 'image', validation: validateImage(form.image) }, { field: 'desiredDate', @@ -119,6 +118,13 @@ const CommissionWrite: React.FC = () => { field: 'significant', validation: validateSignificant(form.significant), }, + { + field: 'addressId', + validation: { + isValid: !!form.addressId, + message: '주소를 선택해주세요.', + }, + }, ]; let isValid = true; @@ -131,14 +137,14 @@ const CommissionWrite: React.FC = () => { }); return isValid; - }; + }, [form]); const getFieldName = (field: string): string => { const fieldNames: { [key: string]: string } = { size: '평수', houseType: '주거 형태', cleanType: '청소 종류', - address: '주소', + addressId: '주소', image: '이미지', desiredDate: '희망 날짜', significant: '특이사항', @@ -155,16 +161,17 @@ const CommissionWrite: React.FC = () => { try { const newCommission = { - ...form, size: form.size || 0, - addressId: form.addressId || 0, - desiredDate: new Date(form.desiredDate).toISOString(), + addressId: form.addressId as number, + image: form.image, houseType: form.houseType as HouseType, cleanType: form.cleanType as CleanType, - address: selectedAddress?.address || '', - status: 'CHECK' as Status, + desiredDate: new Date(form.desiredDate).toISOString(), + significant: form.significant, }; + console.log('Sending commission data:', newCommission); + await createCommissionMutation.mutateAsync(newCommission); toast.success('의뢰가 성공적으로 작성되었습니다.'); navigate('/commissionlist'); diff --git a/src/types/commission.ts b/src/types/commission.ts index 6b6b89b..f20a81e 100644 --- a/src/types/commission.ts +++ b/src/types/commission.ts @@ -5,7 +5,7 @@ export const Status = { FINISH: 'FINISH', } as const; -export type Status = typeof Status[keyof typeof Status]; +export type Status = (typeof Status)[keyof typeof Status]; export const StatusKorean = { [Status.CHECK]: '대기', @@ -21,7 +21,7 @@ export const HouseType = { TOILET: 'TOILET', } as const; -export type HouseType = typeof HouseType[keyof typeof HouseType]; +export type HouseType = (typeof HouseType)[keyof typeof HouseType]; export const HouseTypeKorean = { [HouseType.APT]: '아파트', @@ -35,7 +35,7 @@ export const CleanType = { SPECIAL: 'SPECIAL', } as const; -export type CleanType = typeof CleanType[keyof typeof CleanType]; +export type CleanType = (typeof CleanType)[keyof typeof CleanType]; export const CleanTypeKorean = { [CleanType.NORMAL]: '일반 청소', @@ -52,7 +52,6 @@ export interface Commission { cleanType: CleanType; desiredDate: string; significant?: string; - status: Status; } export interface CommissionFormData { diff --git a/src/utils/validationUtils.ts b/src/utils/validationUtils.ts index ef781d3..13e1688 100644 --- a/src/utils/validationUtils.ts +++ b/src/utils/validationUtils.ts @@ -114,8 +114,10 @@ export const validateSignificant = createValidator( ); // 주소 유효성 검사 -export const validateAddress = (addressData: any): ValidationResult => { - if (!addressData || !addressData.address || !addressData.addressDetail) { +export const validateAddress = ( + addressData: number | null, +): ValidationResult => { + if (!addressData) { return { isValid: false, message: '주소를 선택하고 상세주소를 입력해주세요.',