// A "selectable object" is a schema for fields that are populated as a subschema
// object by a Select; in this case, we don't want all of the subschema errors,
// we just want to know when a selection got skipped.
const selectableObject = <T extends z.ZodTypeAny>(schema: T, message: string) =>
schema
.optional()
.catch(undefined)
.refine((x) => !!x, { message });
const equipmentFormDataSchema = (
required_error: string = "Equipment selection is required",
) =>
z.object(
{
serialNumberOrVIN: z
.string({ required_error: "Serial number or VIN is required" })
.nonempty("Serial number or VIN is required"),
plateNumber: z.string().nullish(),
carNumber: z.string().nullish(),
notes: z.string().nullish(),
model: selectableObject(equipmentModelFormDataSchema(), "Model selection is required"),
customer: selectableObject(customerFormDataSchema(), "Customer selection is required"),
},
{ required_error },
);
// A "selectable object" is a schema for fields that are populated as a subschema
// object by a Select; in this case, we don't want all of the subschema errors,
// we just want to know when a selection got skipped.
const selectableObject = <T extends z.ZodTypeAny>(schema: T, message: string) =>
schema
.optional()
.catch(undefined)
.refine((x) => !!x, { message });
const equipmentFormDataSchema = (
required_error: string = "Equipment selection is required",
) =>
z.object(
{
serialNumberOrVIN: z
.string({ required_error: "Serial number or VIN is required" })
.nonempty("Serial number or VIN is required"),
plateNumber: z.string().nullish(),
carNumber: z.string().nullish(),
notes: z.string().nullish(),
model: selectableObject(equipmentModelFormDataSchema(), "Model selection is required"),
customer: selectableObject(customerFormDataSchema(), "Customer selection is required"),
},
{ required_error },
);