Spaces:
Sleeping
Sleeping
| 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<boolean>(false) | |
| const [data, setData] = useState<any>(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 | |
| } | |
| } |