diff --git a/src/apis/auth/types.ts b/src/apis/auth/types.ts index 23faf10..72a0038 100644 --- a/src/apis/auth/types.ts +++ b/src/apis/auth/types.ts @@ -31,9 +31,9 @@ export type LoginResponse = Promise; export const passwordSchema = z .object({ - password: z.string().min(PASSWORD_PUT_FORM_VALID_LENGTH.PASSWORD.MIN, PASSWORD_PUT_FORM_ERROR_MESSAGE.PASSWORD.MIN), - newPassword: z.string().min(PASSWORD_PUT_FORM_VALID_LENGTH.NEW_PASSWORD.MIN, PASSWORD_PUT_FORM_ERROR_MESSAGE.NEW_PASSWORD.MIN), - newPasswordConfirm: z.string(), + password: z.string().min(PASSWORD_PUT_FORM_VALID_LENGTH.PASSWORD.MIN, PASSWORD_PUT_FORM_ERROR_MESSAGE.PASSWORD.MIN).trim(), + newPassword: z.string().min(PASSWORD_PUT_FORM_VALID_LENGTH.NEW_PASSWORD.MIN, PASSWORD_PUT_FORM_ERROR_MESSAGE.NEW_PASSWORD.MIN).trim(), + newPasswordConfirm: z.string().trim(), }) .refine((check) => check.newPassword === check.newPasswordConfirm, { message: PASSWORD_PUT_FORM_ERROR_MESSAGE.NEW_PASSWORD_CONFRIM.NOT_MATCH, diff --git a/src/apis/cards/types.ts b/src/apis/cards/types.ts index 968e7ec..2f09415 100644 --- a/src/apis/cards/types.ts +++ b/src/apis/cards/types.ts @@ -6,12 +6,12 @@ const IMAGE_URL = 'https://sprint-fe-project.s3.ap-northeast-2.amazonaws.com/tas const cardBaseSchema = z.object({ dashboardId: z.number(), columnId: z.number(), - title: z.string(), - description: z.string(), + title: z.string().trim(), + description: z.string().trim(), dueDate: z.union([z.string(), z.instanceof(Date)]).refine((date) => isValidDate(date), { message: '유효하지 않은 날짜 형식입니다.', }), - tags: z.array(z.string()), + tags: z.array(z.string().trim().max(10, '10글자 이하로 작성해주세요')), imageUrl: z.string().url(), }); diff --git a/src/apis/columns/types.ts b/src/apis/columns/types.ts index 01a3fd1..135b2bd 100644 --- a/src/apis/columns/types.ts +++ b/src/apis/columns/types.ts @@ -25,7 +25,7 @@ export const getColumnsParamsSchema = z.object({ export type GetColumnsParams = z.infer; export const columnFormSchema = z.object({ - title: z.string(), + title: z.string().trim().min(2, { message: '컬럼 이름은 최소 2글자 이상이어야 합니다.' }), }); export type ColumnForm = z.infer; diff --git a/src/apis/comments/index.ts b/src/apis/comments/index.ts index fbab138..4c110c2 100644 --- a/src/apis/comments/index.ts +++ b/src/apis/comments/index.ts @@ -26,7 +26,7 @@ export const getComments = async (params: GetCommentsParams) => { */ export const putComment = async (commentId: number, putCommentForm: PutCommentForm) => { const response = await axiosClientHelper.put(`/comments/${commentId}`, putCommentForm); - return safeResponse(response.data, commentsResponseSchema); + return safeResponse(response.data, commentSchema); }; /** diff --git a/src/apis/comments/types.ts b/src/apis/comments/types.ts index af623b4..88fe7af 100644 --- a/src/apis/comments/types.ts +++ b/src/apis/comments/types.ts @@ -16,7 +16,7 @@ export const commentSchema = z.object({ export type Comment = z.infer; export const commentFormSchema = z.object({ - content: z.string(), + content: z.string().trim(), cardId: z.number(), columnId: z.number(), dashboardId: z.number(), diff --git a/src/apis/dashboards/types.ts b/src/apis/dashboards/types.ts index a524526..f466893 100644 --- a/src/apis/dashboards/types.ts +++ b/src/apis/dashboards/types.ts @@ -30,6 +30,7 @@ export type GetDashboardsRequest = Partial & { export const dashboardFormSchema = z.object({ title: z .string() + .trim() .min(DASHBOARD_FORM_VALID_LENGTH.TITLE.MIN, { message: DASHBOARD_FORM_ERROR_MESSAGE.TITLE.MIN }) .max(DASHBOARD_FORM_VALID_LENGTH.TITLE.MAX, { message: DASHBOARD_FORM_ERROR_MESSAGE.TITLE.MAX }), color: z.enum(DEFAULT_COLORS), diff --git a/src/apis/users/types.ts b/src/apis/users/types.ts index fde19d7..d5ac11f 100644 --- a/src/apis/users/types.ts +++ b/src/apis/users/types.ts @@ -9,9 +9,9 @@ interface FailResponse { export const signupSchema = z .object({ email: z.string().min(SIGNUP_FORM_VALID_LENGTH.EMAIL.MIN, SIGNUP_FORM_ERROR_MESSAGE.EMAIL.MIN).email(SIGNUP_FORM_ERROR_MESSAGE.EMAIL.NOT_FORM), - nickname: z.string().min(SIGNUP_FORM_VALID_LENGTH.NICKNAME.MIN, SIGNUP_FORM_ERROR_MESSAGE.NICKNAME.MIN).max(SIGNUP_FORM_VALID_LENGTH.NICKNAME.MAX, SIGNUP_FORM_ERROR_MESSAGE.NICKNAME.MAX), - password: z.string().min(SIGNUP_FORM_VALID_LENGTH.PASSWORD.MIN, SIGNUP_FORM_ERROR_MESSAGE.PASSWORD.MIN), - passwordConfirm: z.string(), + nickname: z.string().trim().min(SIGNUP_FORM_VALID_LENGTH.NICKNAME.MIN, SIGNUP_FORM_ERROR_MESSAGE.NICKNAME.MIN).max(SIGNUP_FORM_VALID_LENGTH.NICKNAME.MAX, SIGNUP_FORM_ERROR_MESSAGE.NICKNAME.MAX), + password: z.string().trim().min(SIGNUP_FORM_VALID_LENGTH.PASSWORD.MIN, SIGNUP_FORM_ERROR_MESSAGE.PASSWORD.MIN), + passwordConfirm: z.string().trim(), terms: z.boolean(), }) .refine((check) => check.password === check.passwordConfirm, { diff --git a/src/components/columns/CreateCard.tsx b/src/components/columns/CreateCard.tsx index df1fff2..aea41e5 100644 --- a/src/components/columns/CreateCard.tsx +++ b/src/components/columns/CreateCard.tsx @@ -3,6 +3,7 @@ import { Ref } from 'react'; import { Controller, useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; +import { isArray } from 'es-toolkit/compat'; import useAlert from '@/hooks/useAlert'; import { CardForm, cardFormSchema } from '@/apis/cards/types'; import { useCreateCard } from '@/apis/cards/queries'; @@ -100,7 +101,8 @@ export default function CreateCard({ dashboardId, columnId, ref }: CreateCardPro name='tags' control={control} render={({ field }) => { - return ; + const errorMessage = isArray(errors.tags) ? errors.tags.find((error) => !!error)?.message : undefined; + return ; }} /> } /> - } /> + { + const errorMessage = isArray(errors.tags) ? errors.tags.find((error) => !!error)?.message : undefined; + return ; + }} + /> } />