import { useState } from "react" import axios from "@/utils/axios"; import { Options } from "redaxios"; export const useRequest = (method: "post" | "put" | "patch" | "delete" | "get", endpoint: string | undefined, params: Options, body: Options | undefined) => { const [loading, setLoading] = useState(false) const [data, setData] = useState(null) const submit = async () => { if (!endpoint) return; setLoading(true); const url = new URL(endpoint, process.env.NEXT_PUBLIC_APP_APIURL); if (params) { const parameters = Object.entries(params).filter( ([_, value]) => value !== "" && value !== null && value !== undefined && value !== false ); parameters.forEach(([key, value]) => { url.searchParams.append(key, value as string); }); } const needBody = ["post", "put", "patch"].includes(method); const formattedBody = body ? Object?.entries(body as any).reduce((acc: any, [key, value]) => { if (key.includes(".")) { const [first, ...rest] = key.split("."); acc[first] = { ...acc[first], [rest.join(".")]: value } } else { acc[key] = value; } return acc; } , {}) : undefined; axios[method](url.pathname, needBody ? formattedBody : { data: method === "delete" ? formattedBody : undefined, params: url.searchParams }) .then((res: any) => { if (res.ok) { setData(res.data); } }) .catch((err) => { setData(err.data); }) .finally(() => setLoading(false)); }; return { submit, loading, setLoading, data } }