For the complete documentation index, see llms.txt. This page is also available as Markdown.

Financiar escrow

El formulario ideal para este endpoint.

Esquema

Esto valida un formulario de escrow usando Zod, incluyendo direcciones de billetera y monto.

import { z } from "zod";

export const formSchema = z.object({
  contractId: z.string().min(1, "Se requiere el ID del contrato"),
  signer: z.string().min(1, "Se requiere la dirección del firmante"),
  amount: z.string().min(1, {
    message: "Se requiere el monto.",
  }),
});

Hook personalizado

Esto contiene toda la lógica del formulario, incluyendo la validación del esquema, la función onSubmit y otros estados y funcionalidades.

import { useEscrowContext } from "@/providers/escrow.provider";
import { useWalletContext } from "@/providers/wallet.provider";
import { useState } from "react";
import { useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import { z } from "zod";
import { formSchema } from "../schemas/fund-escrow-form.schema";
import { escrowService } from "../services/escrow.service";
import { toast } from "sonner";
import { Escrow } from "@/@types/escrows/escrow.entity";
import { EscrowRequestResponse } from "@/@types/escrows/escrow-response.entity";
import { FundEscrowPayload } from "@/@types/escrows/escrow-payload.entity";

export const useFundEscrowForm = () => {
  const { escrow } = useEscrowContext();
  const { setEscrow } = useEscrowContext();
  const { walletAddress } = useWalletContext();
  const [loading, setLoading] = useState(false);
  const [response, setResponse] = useState<EscrowRequestResponse | null>(null);
  const [error, setError] = useState<string | null>(null);

  const form = useForm<z.infer<typeof formSchema>>({
    resolver: zodResolver(formSchema),
    defaultValues: {
      contractId: escrow?.contractId || "",
      amount: escrow?.amount?.toString() || "1000",
      signer: walletAddress || "Conecta tu billetera para obtener tu dirección",
    },
  });

  const onSubmit = async (payload: FundEscrowPayload) => {
    setLoading(true);
    setError(null);
    setResponse(null);

    try {
      /**
       * Llamada a la API usando el servicio escrow
       * @Nota:
       * - Necesitamos especificar el endpoint y el método
       * - Necesitamos especificar que returnEscrowDataIsRequired es false
       * - El resultado será un EscrowRequestResponse
       */
      const result = (await escrowService.execute({
        payload,
        endpoint: "/escrow/fund-escrow",
        method: "post",
        returnEscrowDataIsRequired: false,
      })) as EscrowRequestResponse;

      /**
       * @Respuestas:
       * result.status === "SUCCESS"
       * - Escrow financiado con éxito
       * - Establecer el escrow en el contexto
       * - Mostrar un toast de éxito
       *
       * result.status !== "SUCCESS"
       * - Mostrar un toast de error
       */
      if (result.status === "SUCCESS") {
        // Validar el balance para evitar saldos negativos en el contexto escrow
        const escrowUpdated: Escrow = {
          ...escrow!,
          balance:
            escrow?.balance && Number(escrow.balance) > 0
              ? (Number(escrow.balance) + Number(payload.amount)).toString()
              : payload.amount,
        };

        setEscrow(escrowUpdated);

        toast.info("Escrow financiado");
        setResponse(result);
      }
    } catch (err) {
      toast.error(
        err instanceof Error ? err.message : "Ocurrió un error desconocido"
      );
    } finally {
      setLoading(false);
    }
  };

  return { form, loading, response, error, onSubmit };
};

Formulario

Este formulario está construido con react hook form. Usamos el hook personalizado y el esquema zod mencionados anteriormente.

Última actualización