aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/schemas.ts
blob: 6f0c15c46335f8b6e7b4e40491c1c360a35c82b8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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.'),
    currency: z
      .string()
      .min(1, 'Enter at least one character.')
      .max(5, 'Enter at most five 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>