Untitled
abd
plain_text
10 months ago
1.6 kB
12
Indexable
interface GraphqlResponse<T, E> {
data?: T;
errors?: E[];
}
export const useGqRequest = <T, E = any>(client: "auth" | "default" = "default") => {
const { refreshAccessToken } = useAuth();
const data = ref<T | null>();
const error = ref<E | string | null>();
const loading = ref<boolean>(false);
const makeRequest = async (query: any, variables: any) => {
loading.value = true;
try {
const url = client === "auth" ? import.meta.env.VITE_AUTH_GRAPHQL : import.meta.env.VITE_BACKEND_URL;
const response = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${useStatefulCookie("accessToken").value}`,
},
body: JSON.stringify({ query, variables }),
});
if (!response.ok) {
throw new Error("Network response was not ok");
}
const responseData: GraphqlResponse<T, E> = await response.json();
if (responseData.errors && responseData.errors.length > 0) {
const isUnauthorized = responseData.errors.some((error: any) => error.extensions.code.toLowerCase() === "unauthorized");
if (isUnauthorized) {
await refreshAccessToken();
await makeRequest(query, variables);
} else {
error.value = responseData.errors.map((error: any) => `${error.message}`).join("\n");
data.value = null;
}
} else {
data.value = responseData.data;
error.value = null;
}
} catch (err) {
error.value = err as E;
} finally {
loading.value = false;
}
};
return {
data,
error,
loading,
makeRequest,
};
};Editor is loading...
Leave a Comment