180 lines
5.8 KiB
JavaScript
180 lines
5.8 KiB
JavaScript
var test_api = "https://api-test.global-interaction.com/";
|
|
var local_api = "http://localhost:13000/";
|
|
var default_api = "https://api.global-interaction.com/";
|
|
|
|
(function () {
|
|
var API_ENV_KEY = "hyapp_h5_env";
|
|
var ACCESS_TOKEN_KEY = "hyapp_access_token";
|
|
var APP_CODE_KEY = "hyapp_app_code";
|
|
var memoryEnv = "";
|
|
var memoryAccessToken = "";
|
|
var memoryAppCode = "";
|
|
|
|
function readQuery(name) {
|
|
return new URLSearchParams(window.location.search).get(name);
|
|
}
|
|
|
|
function normalizeBaseURL(value) {
|
|
return String(value || "").replace(/\/+$/, "") + "/";
|
|
}
|
|
|
|
function isLocalDevOrigin() {
|
|
var host = window.location.hostname;
|
|
return host === "127.0.0.1" || host === "localhost" || host === "::1";
|
|
}
|
|
|
|
function shouldPersist() {
|
|
return !isLocalDevOrigin();
|
|
}
|
|
|
|
function clearLocalDevCache() {
|
|
if (shouldPersist()) return;
|
|
window.localStorage.removeItem(API_ENV_KEY);
|
|
window.localStorage.removeItem(ACCESS_TOKEN_KEY);
|
|
window.localStorage.removeItem(APP_CODE_KEY);
|
|
}
|
|
|
|
function devProxyBase(path) {
|
|
return normalizeBaseURL(window.location.origin + path);
|
|
}
|
|
|
|
function resolveEnv() {
|
|
var env = readQuery("env");
|
|
if (env === "test" || env === "local") {
|
|
memoryEnv = env;
|
|
if (shouldPersist()) window.localStorage.setItem(API_ENV_KEY, env);
|
|
return env;
|
|
}
|
|
if (memoryEnv) return memoryEnv;
|
|
if (!shouldPersist()) return "";
|
|
return window.localStorage.getItem(API_ENV_KEY) || "";
|
|
}
|
|
|
|
function resolveBaseURL() {
|
|
var env = resolveEnv();
|
|
if (env === "test") return isLocalDevOrigin() ? devProxyBase("/__api_test__/") : normalizeBaseURL(test_api);
|
|
if (env === "local") return isLocalDevOrigin() ? devProxyBase("/__api_local__/") : normalizeBaseURL(local_api);
|
|
return normalizeBaseURL(default_api);
|
|
}
|
|
|
|
function buildURL(path, query) {
|
|
var url = new URL(path.replace(/^\/+/, ""), resolveBaseURL());
|
|
if (query) {
|
|
Object.keys(query).forEach(function (key) {
|
|
var value = query[key];
|
|
if (value === undefined || value === null || value === "") return;
|
|
url.searchParams.set(key, value);
|
|
});
|
|
}
|
|
return url.toString();
|
|
}
|
|
|
|
function getAccessToken() {
|
|
if (memoryAccessToken) return memoryAccessToken;
|
|
if (!shouldPersist()) return "";
|
|
return window.localStorage.getItem(ACCESS_TOKEN_KEY) || "";
|
|
}
|
|
|
|
function getAppCode() {
|
|
var queryAppCode = readQuery("app_code") || readQuery("appCode");
|
|
if (queryAppCode) {
|
|
memoryAppCode = queryAppCode;
|
|
if (shouldPersist()) window.localStorage.setItem(APP_CODE_KEY, queryAppCode);
|
|
return queryAppCode;
|
|
}
|
|
if (memoryAppCode) return memoryAppCode;
|
|
if (!shouldPersist()) return "lalu";
|
|
return window.localStorage.getItem(APP_CODE_KEY) || "lalu";
|
|
}
|
|
|
|
function setAccessToken(token) {
|
|
memoryAccessToken = token || "";
|
|
if (token) {
|
|
if (shouldPersist()) window.localStorage.setItem(ACCESS_TOKEN_KEY, token);
|
|
return;
|
|
}
|
|
if (shouldPersist()) window.localStorage.removeItem(ACCESS_TOKEN_KEY);
|
|
}
|
|
|
|
function setAppCode(appCode) {
|
|
memoryAppCode = appCode || "";
|
|
if (appCode) {
|
|
if (shouldPersist()) window.localStorage.setItem(APP_CODE_KEY, appCode);
|
|
return;
|
|
}
|
|
if (shouldPersist()) window.localStorage.removeItem(APP_CODE_KEY);
|
|
}
|
|
|
|
function parseResponse(response) {
|
|
return response.text().then(function (text) {
|
|
var payload = text ? JSON.parse(text) : {};
|
|
if (!response.ok) {
|
|
var httpError = new Error(payload.message || response.statusText || "request_failed");
|
|
httpError.status = response.status;
|
|
httpError.payload = payload;
|
|
throw httpError;
|
|
}
|
|
var code = payload && payload.code;
|
|
var isErrorCode = (typeof code === "number" && code !== 0) || (typeof code === "string" && code !== "" && code !== "OK");
|
|
if (isErrorCode) {
|
|
var apiError = new Error(payload.message || "api_request_failed");
|
|
apiError.code = payload.code;
|
|
apiError.request_id = payload.request_id;
|
|
apiError.payload = payload;
|
|
throw apiError;
|
|
}
|
|
return payload && Object.prototype.hasOwnProperty.call(payload, "data") ? payload.data : payload;
|
|
});
|
|
}
|
|
|
|
function request(path, options) {
|
|
var opts = options || {};
|
|
var headers = Object.assign({}, opts.headers || {});
|
|
var token = getAccessToken();
|
|
var appCode = getAppCode();
|
|
if (token) headers.Authorization = "Bearer " + token;
|
|
if (appCode) headers["X-App-Code"] = appCode;
|
|
if (!shouldPersist()) headers["Cache-Control"] = "no-cache";
|
|
|
|
var body = opts.body;
|
|
if (body && typeof body === "object" && !(body instanceof FormData)) {
|
|
headers["Content-Type"] = headers["Content-Type"] || "application/json";
|
|
body = JSON.stringify(body);
|
|
}
|
|
|
|
return window.fetch(buildURL(path, opts.query), {
|
|
method: opts.method || "GET",
|
|
headers: headers,
|
|
body: body,
|
|
cache: shouldPersist() ? "default" : "no-store",
|
|
credentials: opts.credentials || "omit"
|
|
}).then(parseResponse);
|
|
}
|
|
|
|
window.HyAppAPI = {
|
|
baseURL: resolveBaseURL,
|
|
buildURL: buildURL,
|
|
getAccessToken: getAccessToken,
|
|
getAppCode: getAppCode,
|
|
setAccessToken: setAccessToken,
|
|
setAppCode: setAppCode,
|
|
request: request,
|
|
get: function (path, query) {
|
|
return request(path, { method: "GET", query: query });
|
|
},
|
|
post: function (path, body, query) {
|
|
return request(path, { method: "POST", body: body, query: query });
|
|
},
|
|
put: function (path, body, query) {
|
|
return request(path, { method: "PUT", body: body, query: query });
|
|
},
|
|
patch: function (path, body, query) {
|
|
return request(path, { method: "PATCH", body: body, query: query });
|
|
},
|
|
delete: function (path, query) {
|
|
return request(path, { method: "DELETE", query: query });
|
|
}
|
|
};
|
|
clearLocalDevCache();
|
|
})();
|