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

Cambiar bandera de disputa

El esquema ideal para este endpoint.

Esquema

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

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"),
});

Hook Personalizado

Esto contiene toda la lógica del formulario, incluida 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 { zodResolver } from "@hookform/resolvers/zod";
import { useState } from "react";
import { useForm } from "react-hook-form";
import { z } from "zod";
import { formSchema } from "../schemas/start-dispute-form.schema";
import { escrowService } from "../services/escrow.service";
import { Escrow } from "@/@types/escrows/escrow.entity";
import { toast } from "sonner";
import { EscrowRequestResponse } from "@/@types/escrows/escrow-response.entity";
import { StartDisputePayload } from "@/@types/escrows/escrow-payload.entity";

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

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

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

    try {
      /**
       * Llamada API usando el servicio escrow
       * @Note:
       * - 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/change-dispute-flag",
        method: "post",
        returnEscrowDataIsRequired: false,
      })) as EscrowRequestResponse;

      /**
       * @Responses:
       * result.status === "SUCCESS"
       * - Escrow actualizado 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") {
        const escrowUpdated: Escrow = {
          ...escrow!,
          flags: {
            disputeFlag: true,
          },
        };

        setEscrow(escrowUpdated);

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

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

Formulario

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

Última actualización