Atualizar Escrow

O esquema ideal para este endpoint.

Esquema

Isso valida um formulário de escrow usando Zod, incluindo valores, endereços de carteira, trustline e uma lista de marcos.

import { isValidWallet } from "@/helpers/valid-data.helper";
import { z } from "zod";

export const formSchema = z.object({
  contractId: z.string().min(1, {
    message: "ID do contrato é obrigatório.",
  }),
  signer: z.string().min(1, {
    message: "Assinante é obrigatório.",
  }),
  escrow: z.object({
    title: z.string().min(1, {
      message: "Título é obrigatório.",
    }),
    engagementId: z.string().min(1, {
      message: "Engajamento é obrigatório.",
    }),
    description: z.string().min(10, {
      message: "A descrição deve ter pelo menos 10 caracteres.",
    }),
    amount: z.string().min(1, {
      message: "Valor é obrigatório.",
    }),
    platformFee: z.string().min(1, {
      message: "Taxa da plataforma é obrigatória.",
    }),
    receiverMemo: z.number().min(0, {
      message: "O memo do destinatário deve ser um número não negativo.",
    }),
    roles: z.object({
      approver: z
        .string()
        .min(1, {
          message: "Aprovação é obrigatória.",
        })
        .refine((value) => isValidWallet(value), {
          message: "O aprovador deve ser uma carteira válida.",
        }),
      serviceProvider: z
        .string()
        .min(1, {
          message: "Prestador de serviço é obrigatório.",
        })
        .refine((value) => isValidWallet(value), {
          message: "O prestador de serviço deve ser uma carteira válida.",
        }),
      platformAddress: z
        .string()
        .min(1, {
          message: "Endereço da plataforma é obrigatório.",
        })
        .refine((value) => isValidWallet(value), {
          message: "O endereço da plataforma deve ser uma carteira válida.",
        }),
      releaseSigner: z
        .string()
        .min(1, {
          message: "Assinante de liberação é obrigatório.",
        })
        .refine((value) => isValidWallet(value), {
          message: "O assinante de liberação deve ser uma carteira válida.",
        }),
      disputeResolver: z
        .string()
        .min(1, {
          message: "Resolutor de disputas é obrigatório.",
        })
        .refine((value) => isValidWallet(value), {
          message: "O resolutor de disputas deve ser uma carteira válida.",
        }),
      receiver: z
        .string()
        .min(1, {
          message: "Endereço do destinatário é obrigatório.",
        })
        .refine((value) => isValidWallet(value), {
          message: "O endereço do destinatário deve ser uma carteira válida.",
        }),
    }),
    trustline: z.object({
      address: z.string().min(1, {
        message: "Endereço da trustline é obrigatório.",
      }),
      decimals: z.number().default(10000000),
    }),
    milestones: z
      .array(
        z.object({
          description: z.string().min(1, {
            message: "Descrição do marco é obrigatória.",
          }),
          status: z.string().default("pending"),
          evidence: z.string().default(""),
          approvedFlag: z.boolean().default(false),
        })
      )
      .min(1, { message: "Pelo menos um marco é obrigatório." }),
  }),
});

Hook Personalizado

Isso contém toda a lógica do formulário, incluindo validação de esquema, função onSubmit e outros estados e funcionalidades.

Formulário

Este formulário é construído com react hook form. Usamos o hook personalizado e o esquema Zod mencionados anteriormente.

Atualizado