about summary refs log tree commit diff
path: root/app/javascript/flavours/glitch/api.js
diff options
context:
space:
mode:
Diffstat (limited to 'app/javascript/flavours/glitch/api.js')
-rw-r--r--app/javascript/flavours/glitch/api.js75
1 files changed, 75 insertions, 0 deletions
diff --git a/app/javascript/flavours/glitch/api.js b/app/javascript/flavours/glitch/api.js
new file mode 100644
index 000000000..6bbddbef6
--- /dev/null
+++ b/app/javascript/flavours/glitch/api.js
@@ -0,0 +1,75 @@
+// @ts-check
+
+import axios from 'axios';
+import LinkHeader from 'http-link-header';
+import ready from './ready';
+
+/**
+ * @param {import('axios').AxiosResponse} response
+ * @returns {LinkHeader}
+ */
+export const getLinks = response => {
+  const value = response.headers.link;
+
+  if (!value) {
+    return new LinkHeader();
+  }
+
+  return LinkHeader.parse(value);
+};
+
+/** @type {import('axios').RawAxiosRequestHeaders} */
+const csrfHeader = {};
+
+/**
+ * @returns {void}
+ */
+const setCSRFHeader = () => {
+  /** @type {HTMLMetaElement | null} */
+  const csrfToken = document.querySelector('meta[name=csrf-token]');
+
+  if (csrfToken) {
+    csrfHeader['X-CSRF-Token'] = csrfToken.content;
+  }
+};
+
+ready(setCSRFHeader);
+
+/**
+ * @param {() => import('immutable').Map} getState
+ * @returns {import('axios').RawAxiosRequestHeaders}
+ */
+const authorizationHeaderFromState = getState => {
+  const accessToken = getState && getState().getIn(['meta', 'access_token'], '');
+
+  if (!accessToken) {
+    return {};
+  }
+
+  return {
+    'Authorization': `Bearer ${accessToken}`,
+  };
+};
+
+/**
+ * @param {() => import('immutable').Map} getState
+ * @returns {import('axios').AxiosInstance}
+ */
+export default function api(getState) {
+  return axios.create({
+    headers: {
+      ...csrfHeader,
+      ...authorizationHeaderFromState(getState),
+    },
+
+    transformResponse: [
+      function (data) {
+        try {
+          return JSON.parse(data);
+        } catch {
+          return data;
+        }
+      },
+    ],
+  });
+}