Untitled

 avatar
abd
plain_text
7 days ago
1.6 kB
1
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,
	};
};
Leave a Comment