Explorar o código

Merge pull request #3391 from overleaf/ta-fetch-json

Add fetch-json Helper for React

GitOrigin-RevId: ac1ad925b8b02377109aeacc973b00322fe2895c
Eric Mc Sween %!s(int64=5) %!d(string=hai) anos
pai
achega
d0b624d419
Modificáronse 1 ficheiros con 48 adicións e 0 borrados
  1. 48 0
      services/web/frontend/js/infrastructure/fetch-json.js

+ 48 - 0
services/web/frontend/js/infrastructure/fetch-json.js

@@ -0,0 +1,48 @@
+// fetch wrapper to make simple JSON requests:
+// - send the CSRF token in the request
+// - set the JSON content-type in the request headers
+// - throw errors on non-ok response
+// - parse JSON response body, unless response is empty
+
+export function getJSON(path, options) {
+  return fetchJSON(path, { ...options, method: 'GET' })
+}
+
+export function postJSON(path, options) {
+  return fetchJSON(path, { ...options, method: 'POST' })
+}
+
+export function deleteJSON(path, options) {
+  return fetchJSON(path, { ...options, method: 'DELETE' })
+}
+
+export default function fetchJSON(
+  path,
+  { body = {}, headers = {}, method = 'GET', ...otherOptions }
+) {
+  const options = {
+    ...otherOptions,
+    headers: {
+      ...headers,
+      'Content-Type': 'application/json',
+      'X-Csrf-Token': window.csrfToken
+    },
+    method
+  }
+
+  if (method !== 'GET' && method !== 'HEAD') {
+    options.body = JSON.stringify(body)
+  }
+
+  return fetch(path, options)
+    .then(response => {
+      if (!response.ok) throw new Error(response.status)
+
+      // get the response as text first as .json() fails on empty responses.
+      // (e.g. 204 responses)
+      return response.text()
+    })
+    .then(responseText => {
+      return responseText ? JSON.parse(responseText) : responseText
+    })
+}