122 lines
3.4 KiB
TypeScript
122 lines
3.4 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>;
|
|
|
|
// --- Esquemas de validación para archivos ---
|
|
|
|
// Esquema básico para un solo archivo
|
|
const fileSchema = z.object({
|
|
name: z.string().min(1, 'El nombre del archivo no puede estar vacío.'),
|
|
size: z.number().int().positive('El tamaño del archivo debe ser positivo.'),
|
|
type: z.string().refine(
|
|
(type) => type.startsWith('image/'),
|
|
'Solo se permiten archivos de imagen.'
|
|
),
|
|
// Puedes añadir más validaciones personalizadas aquí
|
|
// Por ejemplo, limitar el tamaño máximo a 5MB (5 * 1024 * 1024 bytes)
|
|
}).refine(
|
|
(file) => file.size <= 5 * 1024 * 1024,
|
|
'El tamaño del archivo no debe exceder los 5MB.'
|
|
);
|
|
|
|
// Esquema para un array de archivos (cuando el input es multiple)
|
|
const filesArraySchema = z.array(fileSchema).max(5, 'Solo se permiten hasta 5 archivos.');
|
|
|
|
// const formSchema = z.object({
|
|
// file: z
|
|
// .instanceof(FileList)
|
|
// .refine((file) => file?.length == 1, 'File is required.')
|
|
// });
|
|
|
|
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.any(),
|
|
// 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.any(),
|
|
status: z.string().min(1, { message: "Debe de seleccionar un valor" }),
|
|
userId: z.number().optional(),
|
|
})
|
|
|
|
// export const productDetails = z.object({
|
|
// id: z.number().optional(),
|
|
// title: z.string().min(5),
|
|
// description: z.string().min(10),
|
|
// stock: z.number(),
|
|
// price: z.string(),
|
|
// address: z.string(),
|
|
// urlImg: z.string(),
|
|
// userId: z.number(),
|
|
// })
|
|
|
|
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,
|
|
}) |