Files
wedding-website/lib/validation/invitation.ts
T
Raul Lugo aed8684e09
Deploy On Server / Prepare Repository Remotely (push) Successful in 10s
Deploy On Server / Docker Compose Up (push) Successful in 18s
Deploy On Server / Prune Images (push) Successful in 3s
Deploy On Server / Remove .env File (push) Successful in 2s
feat: invitation deletion
2026-08-11 22:18:25 +02:00

54 lines
1.5 KiB
TypeScript

import { z } from "zod"
import { supportedLanguageCodes } from "@/lib/i18n/config"
const optionalText = z.preprocess(
(value) => {
if (typeof value !== "string") return null
const trimmed = value.trim()
return trimmed.length > 0 ? trimmed : null
},
z.string().nullable(),
)
const optionalEmail = z.preprocess(
(value) => {
if (typeof value !== "string") return null
const trimmed = value.trim()
return trimmed.length > 0 ? trimmed : null
},
z.email().nullable(),
)
export const createInvitationSchema = z
.object({
displayName: z.string().trim().min(1, "Display name is required"),
language: z.enum(supportedLanguageCodes, {
error: "Select a supported language",
}),
contactEmail: optionalEmail.optional().default(null),
contactPhone: optionalText.optional().default(null),
maxPartySize: z.coerce
.number()
.int("Party size must be a whole number")
.min(1, "Party size must be at least 1"),
allowMemberEdits: z.coerce.boolean().default(false),
notes: optionalText.optional().default(null),
members: z
.array(z.string().trim().min(1))
.min(1, "Add at least one invitation member"),
})
.refine((value) => value.members.length <= value.maxPartySize, {
message: "Members cannot exceed max party size",
path: ["members"],
})
export const deleteInvitationSchema = z.object({
invitationId: z.uuid(),
})
export type CreateInvitationInput = z.infer<typeof createInvitationSchema>
export type DeleteInvitationInput = z.infer<typeof deleteInvitationSchema>