Untitled
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, }; };
Leave a Comment