"use client"; import request from "@/lib/request"; import { ApiResponse } from "@/types/types"; import useSWR, { SWRConfiguration } from "swr"; import useSWRMutation, { type SWRMutationConfiguration } from "swr/mutation"; async function fetcher( url: string, requiresAuth: boolean = true, csrfToken?: boolean, ): Promise> { return request(url, { requiresAuth, csrfToken }); } async function mutationHandler( url: string, { arg, method, requiresAuth, csrfToken, }: { arg: A; method: "GET" | "POST" | "PATCH" | "DELETE"; requiresAuth: boolean; csrfToken?: boolean; }, ): Promise> { return request(url, { method, body: arg, requiresAuth, csrfToken }); } export function useApi( endpoint: string, config?: SWRConfiguration, requiresAuth: boolean = true, csrfToken?: boolean, ) { const swr = useSWR>( endpoint, () => fetcher(endpoint, requiresAuth, csrfToken), config, ); return { ...swr, data: swr.data?.data, isLoading: swr.isLoading || swr.isValidating, success: swr.data?.status === "Success", }; } export default function useApiMutation( endpoint: string, config?: SWRMutationConfiguration, Error, string, A>, method: "GET" | "POST" | "PATCH" | "DELETE" = "GET", requiresAuth: boolean = false, csrfToken?: boolean, ) { const mutation = useSWRMutation, Error, string, A>( endpoint, (url, { arg }) => mutationHandler(url, { arg, method, requiresAuth, csrfToken }), config, ); return { ...mutation, trigger: mutation.trigger as ( arg: A, ) => Promise | undefined>, data: mutation.data?.data, isSuccess: mutation.data?.status === "Success", }; }