1
resposta

[Sugestão] Validando o tamanho do arquivo com zod.

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'),
  }),
});
1 resposta

valeu por compartilhar!