sprinque-js-sdk-wip
Version:
UI kit to implement Pay by Invoice with Sprinque
63 lines (62 loc) • 2.56 kB
JavaScript
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;
};