Validação do tamanho do arquivo:
Função para converter bytes para megabytes:
export const byteToMb = (bytes: number) => {
return bytes / 1024 ** 2;
};
Esquema do cadastro de endereço do especialista:
import { z } from 'zod';
import { byteToMb } from '../utils/file';
export const cepLength = 8;
export const maxAvatarMbSize = 2;
export const CadastroEnderecoEspecialistaSchema = z.object({
avatar: z.instanceof(FileList).superRefine((files, ctx) => {
// Obtém o tamanho do arquivo
const fileSize = files.item(0)?.size ?? 0;
// Converte para MB
const mbAvatarSize = byteToMb(fileSize);
// Se o tamanho do arquivo for maior que o tamanho máximo, retorna um erro.
if (mbAvatarSize > maxAvatarMbSize) {
return ctx.addIssue({
code: z.ZodIssueCode.custom,
message: `A foto deve ter no máximo ${maxAvatarMbSize} mb.`,
});
}
if (files.length > 0) {
return files[0];
}
return ctx.addIssue({
code: z.ZodIssueCode.custom,
message: 'Insira uma foto.',
});
}),
endereco: z.object({
cep: z
.string()
.min(1, 'Campo obrigatório.')
.min(cepLength, 'Insira um CEP válido.'),
rua: z.string().min(1, 'Campo obrigatorio.'),
numero: z.coerce
.number({ message: 'Insira um número válido.' })
.min(1, 'Campo obrigatório.'),
bairro: z.string().min(1, 'Campo obrigatório.'),
localidade: z.string().min(1, 'Campo obrigatório'),
}),
});