diff --git a/app/components/form/FeeInput.tsx b/app/components/form/FeeInput.tsx index 38c3892a..873c9be1 100644 --- a/app/components/form/FeeInput.tsx +++ b/app/components/form/FeeInput.tsx @@ -1,8 +1,11 @@ +import { toast } from "sonner"; + interface FeeInputProps { value: string; onChange: (value: string) => void; placeholder?: string; unit?: string; + maxAmount?: number; } // 숫자를 천 단위 콤마 형식으로 변환 @@ -21,11 +24,19 @@ export default function FeeInput({ onChange, placeholder = "", unit = "원", + maxAmount, }: FeeInputProps) { const displayValue = formatNumber(value); const handleChange = (e: React.ChangeEvent) => { const rawValue = parseNumber(e.target.value); + + // 최대 금액 체크 + if (maxAmount && Number(rawValue) > maxAmount) { + toast.error("더 낮은 금액을 제시해주세요"); + return; + } + onChange(rawValue); }; diff --git a/app/routes/chat/resuggest/resuggest-content.tsx b/app/routes/chat/resuggest/resuggest-content.tsx index 97b0c480..4ac903ce 100644 --- a/app/routes/chat/resuggest/resuggest-content.tsx +++ b/app/routes/chat/resuggest/resuggest-content.tsx @@ -348,7 +348,13 @@ export default function ReSuggestContent() { setValue("fee", v, { shouldValidate: true })} + maxAmount={10000000} /> + {errors.fee && ( +

+ {errors.fee.message} +

+ )} diff --git a/app/routes/matching/suggest/create/create-campaign-content.tsx b/app/routes/matching/suggest/create/create-campaign-content.tsx index 76ac8151..17c4fba7 100644 --- a/app/routes/matching/suggest/create/create-campaign-content.tsx +++ b/app/routes/matching/suggest/create/create-campaign-content.tsx @@ -388,7 +388,13 @@ export default function CreateCampaignContent() { setValue("fee", v)} + maxAmount={10000000} /> + {errors.fee && ( +

+ {errors.fee.message} +

+ )} diff --git a/app/routes/matching/suggest/create/schema.ts b/app/routes/matching/suggest/create/schema.ts index 6f715e06..c860c23f 100644 --- a/app/routes/matching/suggest/create/schema.ts +++ b/app/routes/matching/suggest/create/schema.ts @@ -15,7 +15,16 @@ export const campaignFormSchema = z.object({ involvement: z.string().min(1, "관여도를 선택해주세요"), usageScope: z.string().min(1, "활용 범위를 선택해주세요"), sponsorProduct: z.string().min(1, "협찬품을 선택해주세요"), - fee: z.string().min(1, "원고료를 입력해주세요"), + fee: z + .string() + .min(1, "원고료를 입력해주세요") + .refine( + (val) => { + const num = Number(val); + return num <= 10000000; + }, + { message: "원고료는 1,000만원 이하로 입력해주세요" } + ), startDate: z.string().min(1, "시작 날짜를 선택해주세요"), endDate: z.string().min(1, "끝 날짜를 선택해주세요"), });