From 6611e3a187e5398f686449938b7cf1ddbfcb5392 Mon Sep 17 00:00:00 2001 From: Sebastien Castiel Date: Thu, 7 Dec 2023 11:11:53 -0500 Subject: Store amounts as cents --- src/lib/schemas.ts | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) (limited to 'src/lib/schemas.ts') diff --git a/src/lib/schemas.ts b/src/lib/schemas.ts index 5c3489b..ec7f3fa 100644 --- a/src/lib/schemas.ts +++ b/src/lib/schemas.ts @@ -42,9 +42,27 @@ export const expenseFormSchema = z.object({ title: z .string({ required_error: 'Please enter a title.' }) .min(2, 'Enter at least two characters.'), - amount: z.coerce - .number({ required_error: 'You must enter an amount.' }) - .min(0.01, 'The amount must be higher than 0.01.'), + amount: z + .union( + [ + z.number(), + z.string().transform((value, ctx) => { + const valueAsNumber = Number(value) + if (Number.isNaN(valueAsNumber)) + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'Invalid number.', + }) + return Math.floor(valueAsNumber * 100) + }), + ], + { required_error: 'You must enter an amount.' }, + ) + .refine((amount) => amount >= 1, 'The amount must be higher than 0.01.') + .refine( + (amount) => amount <= 10_000_000_00, + 'The amount must be lower than 10,000,000.', + ), paidBy: z.string({ required_error: 'You must select a participant.' }), paidFor: z .array(z.string()) -- cgit v1.3