summaryrefslogtreecommitdiff
path: root/hooks/useAuthenticatedFetch.js
diff options
context:
space:
mode:
authorꦌꦫꦶꦏ꧀ꦦꦿꦧꦮꦑꦩꦭ꧀ <erik@darapsa.co.id>2022-09-15 21:38:13 +0800
committerꦌꦫꦶꦏ꧀ꦦꦿꦧꦮꦑꦩꦭ꧀ <erik@darapsa.co.id>2022-09-15 21:38:13 +0800
commit2d5640d5304f7218c8ae42faeb97114a1192d036 (patch)
treec3b227ab200752b016cd3c84a327990d0f75dc74 /hooks/useAuthenticatedFetch.js
Preparation for CDN-hosted version
Diffstat (limited to 'hooks/useAuthenticatedFetch.js')
-rw-r--r--hooks/useAuthenticatedFetch.js38
1 files changed, 38 insertions, 0 deletions
diff --git a/hooks/useAuthenticatedFetch.js b/hooks/useAuthenticatedFetch.js
new file mode 100644
index 0000000..e5f36a8
--- /dev/null
+++ b/hooks/useAuthenticatedFetch.js
@@ -0,0 +1,38 @@
+/**
+ * A hook that returns an auth-aware fetch function.
+ * @desc The returned fetch function that matches the browser's fetch API
+ * See: https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API
+ * It will provide the following functionality:
+ *
+ * 1. Add a `X-Shopify-Access-Token` header to the request.
+ * 2. Check response for `X-Shopify-API-Request-Failure-Reauthorize` header.
+ * 3. Redirect the user to the reauthorization URL if the header is present.
+ *
+ * @returns {Function} fetch function
+ */
+function useAuthenticatedFetch() {
+ const app = useAppBridge();
+ const fetchFunction = authenticatedFetch(app);
+
+ return async (uri, options) => {
+ const response = await fetchFunction(uri, options);
+ checkHeadersForReauthorization(response.headers, app);
+ return response;
+ };
+}
+
+function checkHeadersForReauthorization(headers, app) {
+ if (headers.get("X-Shopify-API-Request-Failure-Reauthorize") === "1") {
+ const authUrlHeader =
+ headers.get("X-Shopify-API-Request-Failure-Reauthorize-Url") ||
+ `/api/auth`;
+
+ const redirect = Redirect.create(app);
+ redirect.dispatch(
+ Redirect.Action.REMOTE,
+ authUrlHeader.startsWith("/")
+ ? `https://${window.location.host}${authUrlHeader}`
+ : authUrlHeader
+ );
+ }
+}