From 962081d48ba72a691fc2df15c516baea20e648c8 Mon Sep 17 00:00:00 2001 From: zvspany Date: Sun, 8 Mar 2026 12:05:59 +0100 Subject: [PATCH] fix: allow comma in amount validation --- lib/validation.ts | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/lib/validation.ts b/lib/validation.ts index c172ef0..8c4110d 100644 --- a/lib/validation.ts +++ b/lib/validation.ts @@ -1,18 +1,31 @@ import { z } from "zod"; +function normalizeAmountInput(rawValue: string): string { + const compact = rawValue.trim().replace(/\s+/g, ""); + + if (compact.includes(",") && compact.includes(".")) { + return compact; + } + + return compact.replace(",", "."); +} + export const amountSchema = z .string() - .trim() .min(1, "Enter an amount") - .refine((value) => !Number.isNaN(Number(value)), "Enter a valid number") + .transform((value) => normalizeAmountInput(value)) + .refine( + (value) => /^(?:\d+(\.\d+)?|\.\d+)$/.test(value), + "Enter a valid number", + ) .transform((value) => Number(value)) .refine((value) => Number.isFinite(value), "Enter a valid number") .refine((value) => value > 0, "Amount must be greater than zero") .refine((value) => value <= 1_000_000_000_000, "Amount is too large"); -export function validateAmount(amount: string): - | { ok: true; value: number } - | { ok: false; error: string } { +export function validateAmount( + amount: string, +): { ok: true; value: number } | { ok: false; error: string } { const result = amountSchema.safeParse(amount); if (result.success) { @@ -21,6 +34,6 @@ export function validateAmount(amount: string): return { ok: false, - error: result.error.issues[0]?.message ?? "Invalid amount" + error: result.error.issues[0]?.message ?? "Invalid amount", }; }