Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
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 | |
} | |
} |