diff options
| author | Sebastien Castiel <sebastien@castiel.me> | 2023-12-05 17:39:05 -0500 |
|---|---|---|
| committer | Sebastien Castiel <sebastien@castiel.me> | 2023-12-05 17:39:05 -0500 |
| commit | ed55c696cd083bfaa5429082a9c5edd4ebde0cd8 (patch) | |
| tree | 9f387881f85716bcb4a05d6fce13bfe59fbc9c17 /src/lib/schemas.ts | |
| parent | 1fd6e48807d455f66d9cd79db64cbf9e9f947c6c (diff) | |
First version
Diffstat (limited to 'src/lib/schemas.ts')
| -rw-r--r-- | src/lib/schemas.ts | 50 |
1 files changed, 50 insertions, 0 deletions
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<typeof groupFormSchema> + +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<typeof expenseFormSchema> |
