Inicializar Escrow

O formulário 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({
  engagementId: z.string().min(1, {
    message: "Engajamento é obrigatório.",
  }),
  title: z.string().min(1, {
    message: "Título é 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