Files
sistema_base/apps/web/feactures/inventory/schemas/inventory.ts

102 lines
3.2 KiB
TypeScript

// import { user } from '@/feactures/auth/schemas/register';
// import { all } from 'axios';
import { z } from 'zod';
export type InventoryTable = z.infer<typeof product>;
export type EditInventory = z.infer<typeof editInventory>;
export type ProductApiResponseSchema = z.infer<typeof productApiResponseSchema>;
export type allProducts = z.infer<typeof productDetails>;
const MAX_FILE_SIZE = 5242880; // 5MB en bytes
const ACCEPTED_IMAGE_TYPES = ["image/jpeg", "image/jpg", "image/png", "image/webp"];
const MAX_FILENAME_LENGTH = 50;
export const product = z.object({
id: z.number().optional(),
title: z.string(),
description: z.string(),
address: z.string(),
// category: z.string(),
stock: z.number(),
price: z.string(),
urlImg: z.custom<FileList | undefined>().optional(),
gallery: z.array(z.string()).optional(),
// urlImg: z.string(),
status: z.string(),
userId: z.number().optional()
})
export const productDetails = product.extend({
fullname: z.string(),
phone: z.string().nullable(),
email: z.string().email().nullable()
})
export const editInventory = z.object({
id: z.number().optional(),
title: z.string().min(5, { message: "Debe de tener 5 o más caracteres" }),
description: z.string().min(10, { message: "Debe de tener 10 o más caracteres" }),
stock: z.number(),
address: z.string().min(5, { message: "Debe de tener 5 o más caracteres" }),
price: z.string(),
urlImg: z.custom<FileList | undefined>()
.refine((files) => files && files.length > 0, "Se requiere al menos una imagen")
.refine((files) => files && files.length <= 10, "Máximo 10 imágenes")
.refine((files) =>
files && Array.from(files).every(file => file.size <= MAX_FILE_SIZE),
`El tamaño máximo de cada imagen es de 5MB`
).refine((files) =>
files && Array.from(files).every(file => ACCEPTED_IMAGE_TYPES.includes(file.type)),
"Solo se aceptan archivos .jpg, .jpeg, .png y .webp"
).refine((files) =>
files && Array.from(files).every(file => file.name.length <= MAX_FILENAME_LENGTH),
`El nombre de cada archivo no puede superar los ${MAX_FILENAME_LENGTH} caracteres`
),
status: z.string().min(1, { message: "Debe de seleccionar un valor" }),
userId: z.number().optional(),
})
export const ApiResponseSchema = z.object({
message: z.string(),
data: z.array(product),
meta: z.object({
page: z.number(),
limit: z.number(),
totalCount: z.number(),
totalPages: z.number(),
hasNextPage: z.boolean(),
hasPreviousPage: z.boolean(),
nextPage: z.number().nullable(),
previousPage: z.number().nullable(),
}),
})
export const productApiResponseSchema = z.object({
message: z.string(),
data: z.array(productDetails),
meta: z.object({
page: z.number(),
limit: z.number(),
totalCount: z.number(),
totalPages: z.number(),
hasNextPage: z.boolean(),
hasPreviousPage: z.boolean(),
nextPage: z.number().nullable(),
previousPage: z.number().nullable(),
}),
})
export const test = z.object({
// message: z.string(),
data: z.array(z.string()),
})
export const productMutate = z.object({
message: z.string(),
data: product,
})
export const getProduct = z.object({
message: z.string(),
data: productDetails,
})