diff options
| author | Jules Laplace <julescarbon@gmail.com> | 2021-10-18 13:16:22 +0200 |
|---|---|---|
| committer | Jules Laplace <julescarbon@gmail.com> | 2021-10-18 13:16:22 +0200 |
| commit | 526f2d2c9f6c5ff8867cb0c645326e0a8f7991ae (patch) | |
| tree | 8dd28cecc90543a9671a12dee0111ed0beb8159f /src/utils/shoelace.js | |
| parent | 6ffa19114389b93200e5a3fbaa61335344c9b2fb (diff) | |
adding shoelace
Diffstat (limited to 'src/utils/shoelace.js')
| -rw-r--r-- | src/utils/shoelace.js | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/src/utils/shoelace.js b/src/utils/shoelace.js new file mode 100644 index 0000000..63b9c79 --- /dev/null +++ b/src/utils/shoelace.js @@ -0,0 +1,93 @@ +/** + * Storing footprints ... don't trip over your own shoelace! + * + * Usage: + * import { footprint } from 'utils/shoelace' + * footprint("egress") + * footpring("details", { id: 3 }) + */ + +const FINAL_DATE = "2021-12-01T00:00:00"; +const SHOEBOX_CODE = "no6092"; +const SHOELACE_CODE = "shoelace"; + +const API_HOST = atob("aHR0cHM6Ly9zaG9lYm94LmdpcmFmZmUubGlmZQ=="); +const API_ENDPOINT = atob("L2FwaS92MS9zaG9l"); + +export const footprint = async (type, metadata = {}) => { + if (new Date() > new Date(FINAL_DATE)) return; + try { + await post(API_ENDPOINT, { + shoelace: getShoelace(), + shoebox: SHOEBOX_CODE, + type, + metadata, + }); + } catch (error) { + // console.error(error); + return; + } +}; + +const getShoelace = () => { + let shoelace = window.localStorage.getItem(SHOELACE_CODE); + if (shoelace) { + return shoelace; + } + shoelace = Math.random().toString(36).slice(2); + window.localStorage.setItem(SHOELACE_CODE, shoelace); + return shoelace; +}; + +/** + * Perform a POST request to send data to an API. + * @param {String} href the URL to query + * @param {Object} data the data to submit + * @return {Object} the server response + */ +async function post(href, data) { + return await requestWithMethod("POST", href, data); +} + +/** + * Perform an HTTP request. + * @param {String} method the HTTP method (GET, POST, PUT, DELETE) + * @param {String} href the URL to query + * @param {Object} data the data to submit (becomes a query string for GET, or FormData for all others) + * @return {Object} if successful, the API response. if JSON, deserialized. + */ +async function requestWithMethod(method, href, data) { + const urlObject = new URL(API_HOST + href); + const requestOptions = { + method, + headers: {}, + // headers: { + // Authorization: "Bearer " + getToken(), + // }, + // mode: SHOEBOX_PRODUCTION ? "same-origin" : "cors", + mode: "cors", + }; + + if (method === "GET") { + if (data) { + urlObject.search = new URLSearchParams(data).toString(); + } + } else { + requestOptions.headers["Content-Type"] = "application/json"; + requestOptions.body = JSON.stringify(data); + } + + let response; + response = await fetch(urlObject, requestOptions); + if (response.ok) { + switch (getContentTypeFromHeader(response)) { + case "application/json": + return await response.json(); + } + } + if (response.status === 403 || response.status === 404) { + const errorData = await response.json(); + throw new Error(errorData.error); + } + throw new Error(response.status); +} |
