// import { user } from '@/feactures/auth/schemas/register'; // import { all } from 'axios'; import { url } from 'inspector'; import { z } from 'zod'; export type InventoryTable = z.infer; export type EditInventory = z.infer; export type CreateInventory = z.infer; export type ProductApiResponseSchema = z.infer; export type allProducts = z.infer; 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(), stock: z.number(), price: z.string(), urlImg: z.custom().optional(), gallery: z.array(z.string()).optional(), status: z.string(), userId: z.number().optional() }) export const seeProduct = product.extend({ urlImg: z.string(), }) export const productDetails = seeProduct.extend({ fullname: z.string(), phone: z.string().nullable(), email: z.string().email().nullable() }) const validateProduct = 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().min(1, { message: "Debe de tener 1 o más caracteres" }), urlImg: z.custom(), status: z.string().min(1, { message: "Debe de seleccionar un valor" }), userId: z.number().optional(), }) export const updateInventory = validateProduct.extend({ urlImg: z.custom() .refine((files) => (files && files.length <= 10) || files === undefined, "Máximo 10 imágenes") .refine((files) => // (files && Array.from(files).every(file => file.size <= MAX_FILE_SIZE)) || files === undefined { if (files) { let size = 0; Array.from(files).map(file => { size += file.size; }) if (size <= MAX_FILE_SIZE) return true; return false } return true } , `El tamaño máximo entre toda las imagenes es de 5MB` ).refine((files) => (files && Array.from(files).every(file => ACCEPTED_IMAGE_TYPES.includes(file.type))) || files === undefined, "Solo se aceptan archivos .jpg, .jpeg, .png y .webp" ).refine((files) => (files && Array.from(files).every(file => file.name.length <= MAX_FILENAME_LENGTH)) || files === undefined, `El nombre de cada archivo no puede superar los ${MAX_FILENAME_LENGTH} caracteres` ), }) export const createProduct = validateProduct.extend({ urlImg: z.custom() .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) => { let size = 0; if (files) Array.from(files).map(file => { size += file.size; }) if (size <= MAX_FILE_SIZE) return true; return false }, `El tamaño máximo entre toda las imagenes 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` ), }) export const ApiResponseSchema = z.object({ message: z.string(), data: z.array(seeProduct), 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 productMutate = z.object({ message: z.string(), data: seeProduct, }) export const getProduct = z.object({ message: z.string(), data: productDetails, }) export const deleteProduct = z.object({ message: z.string(), })