UNPKG

sprinque-js-sdk-wip

Version:

UI kit to implement Pay by Invoice with Sprinque

63 lines (62 loc) 2.56 kB
import { SPRINQUE_CUSTOM_ELEMENT_NAME, SPRINQUE_STEP_CLASS } from './constants'; import { displayApiError, parseSpinqueErrorResponse } from './helpers'; export const getApiUrl = () => { var _a; const env = (_a = document.querySelector(SPRINQUE_CUSTOM_ELEMENT_NAME)) === null || _a === void 0 ? void 0 : _a.getAttribute('env'); const envToApiUrlMap = { testing: 'https://api-testing.sprinque.com/api/v1/', production: 'https://api.sprinque.com/api/v1/', sandbox: 'https://api-sandbox.sprinque.com/api/v1/', }; // @ts-ignore return envToApiUrlMap[env]; }; const MAX_RETRY = 3; let current = 0; export const request = async (url, shadowRoot, data, method = 'POST') => { // show loader const loader = shadowRoot.querySelector(`[class^=${SPRINQUE_STEP_CLASS}]:not([style*="display: none"]) .sprinque-ellipsis`); if (loader) loader.style.display = 'block'; // get token const rootHtmlElem = document.querySelector(SPRINQUE_CUSTOM_ELEMENT_NAME); const token = rootHtmlElem === null || rootHtmlElem === void 0 ? void 0 : rootHtmlElem.getAttribute('token'); // execute call const response = await fetch(getApiUrl() + url, { method, body: JSON.stringify(data), headers: { 'Content-type': 'application/json; charset=UTF-8', //'X-API-KEY-ID': token, 'X-Authorization': `Bearer ${token}`, }, }); // handle results const resp = await response.json(); if (loader) loader.style.display = 'none'; // handle failure if (!response.ok) { const apiResp = await resp; displayApiError(parseSpinqueErrorResponse(apiResp), shadowRoot); const getTokenUrl = rootHtmlElem === null || rootHtmlElem === void 0 ? void 0 : rootHtmlElem.getAttribute('getTokenUrl'); // 401 if (response.status === 401 && current < MAX_RETRY) { current += 1; if (getTokenUrl) { // fetch temporary token const resp = await fetch(`${getTokenUrl}`); const { access } = await resp.json(); if (access) { rootHtmlElem === null || rootHtmlElem === void 0 ? void 0 : rootHtmlElem.setAttribute('token', access); // try to do re-fetch return request(url, shadowRoot, data, method); } } else { displayApiError('Session expired', shadowRoot); } } } return resp; };