From ed55c696cd083bfaa5429082a9c5edd4ebde0cd8 Mon Sep 17 00:00:00 2001 From: Sebastien Castiel Date: Tue, 5 Dec 2023 17:39:05 -0500 Subject: First version --- src/lib/schemas.ts | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/lib/schemas.ts (limited to 'src/lib/schemas.ts') diff --git a/src/lib/schemas.ts b/src/lib/schemas.ts new file mode 100644 index 0000000..0219491 --- /dev/null +++ b/src/lib/schemas.ts @@ -0,0 +1,50 @@ +import * as z from 'zod' + +export const groupFormSchema = z + .object({ + name: z + .string() + .min(2, 'Enter at least two characters.') + .max(50, 'Enter at most 50 characters.'), + participants: z + .array( + z.object({ + id: z.string().optional(), + name: z + .string() + .min(2, 'Enter at least two characters.') + .max(50, 'Enter at most 50 characters.'), + }), + ) + .min(1), + }) + .superRefine(({ participants }, ctx) => { + participants.forEach((participant, i) => { + participants.slice(0, i).forEach((otherParticipant) => { + if (otherParticipant.name === participant.name) { + ctx.addIssue({ + code: 'custom', + message: 'Another participant already has this name.', + path: ['participants', i, 'name'], + }) + } + }) + }) + }) + +export type GroupFormValues = z.infer + +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.'), + paidBy: z.string({ required_error: 'You must select a participant.' }), + paidFor: z + .array(z.string()) + .min(1, 'The expense must be paid for at least 1 participant.'), +}) + +export type ExpenseFormValues = z.infer -- cgit v1.3