252 lines
8.2 KiB
JavaScript
252 lines
8.2 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);
|
|
}
|
|
|
|
var vipAPI = {
|
|
me: function () {
|
|
return request('/api/v1/vip/me', { method: 'GET' });
|
|
},
|
|
packages: function () {
|
|
return request('/api/v1/vip/packages', { method: 'GET' });
|
|
},
|
|
purchase: function (payload) {
|
|
return request('/api/v1/vip/purchase', {
|
|
method: 'POST',
|
|
body: payload || {},
|
|
});
|
|
},
|
|
};
|
|
|
|
var hostAPI = {
|
|
searchAgencies: function (shortId, pageSize) {
|
|
return request('/api/v1/host/agencies/search', {
|
|
method: 'GET',
|
|
query: { short_id: shortId, page_size: pageSize || 20 },
|
|
});
|
|
},
|
|
applyToAgency: function (payload) {
|
|
return request('/api/v1/host/agency-applications', {
|
|
method: 'POST',
|
|
body: payload || {},
|
|
});
|
|
},
|
|
};
|
|
|
|
var levelAPI = {
|
|
overview: function () {
|
|
return request("/api/v1/levels/me/overview", { method: "GET" });
|
|
},
|
|
track: function (track) {
|
|
return request("/api/v1/levels/tracks/" + encodeURIComponent(track || ""), {
|
|
method: "GET",
|
|
});
|
|
},
|
|
rewards: function (query) {
|
|
return request("/api/v1/levels/rewards", {
|
|
method: "GET",
|
|
query: query || {},
|
|
});
|
|
},
|
|
};
|
|
|
|
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 });
|
|
},
|
|
vip: vipAPI,
|
|
host: hostAPI,
|
|
level: levelAPI,
|
|
};
|
|
clearLocalDevCache();
|
|
})();
|