aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/schemas.ts
diff options
context:
space:
mode:
authorSebastien Castiel <sebastien@castiel.me>2023-12-05 17:39:05 -0500
committerSebastien Castiel <sebastien@castiel.me>2023-12-05 17:39:05 -0500
commited55c696cd083bfaa5429082a9c5edd4ebde0cd8 (patch)
tree9f387881f85716bcb4a05d6fce13bfe59fbc9c17 /src/lib/schemas.ts
parent1fd6e48807d455f66d9cd79db64cbf9e9f947c6c (diff)
First version
Diffstat (limited to 'src/lib/schemas.ts')
-rw-r--r--src/lib/schemas.ts50
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>