Files
Wechat/utils/request.js
T

122 lines
3.0 KiB
JavaScript

// utils/request.js
import { buildClubHeaders } from './club-context';
const LOGIN_HINT_KEY = 'login_page_hint';
function getLoginFallbackUrl() {
try {
const { getLoginPageUrl } = require('./fighter-only.js');
return getLoginPageUrl();
} catch (e) {
return '/pages/fighter/fighter';
}
}
function goLoginPage(hint) {
try {
if (hint) wx.setStorageSync(LOGIN_HINT_KEY, hint);
} catch (e) {}
const url = getLoginFallbackUrl();
wx.reLaunch({
url,
fail: () => {
try { wx.redirectTo({ url }); } catch (e2) {}
},
});
}
function clearAuthAndGoLogin(hint) {
try {
wx.removeStorageSync('token');
wx.removeStorageSync('userInfo');
} catch (e) {}
goLoginPage(
hint ||
'您的账号可能已被封禁,或尚未注册。请点击一键登录重试;若仍无法进入,请联系客服。'
);
}
function showAuthFailModal(serverMsg) {
const hint =
(serverMsg && String(serverMsg).trim()) ||
'您的账号可能已被封禁,或尚未注册。请点击一键登录重试;若仍无法进入,请联系客服。';
wx.showModal({
title: '无法继续访问',
content: hint,
confirmText: '去登录',
cancelText: '取消',
success: (modalRes) => {
if (modalRes.confirm) {
clearAuthAndGoLogin(hint);
}
},
});
}
function request(options) {
const app = getApp();
const token = wx.getStorageSync('token');
if (!token) {
return Promise.resolve({
statusCode: 401,
data: { code: 401, msg: '未登录' },
errMsg: 'request:ok',
});
}
const header = buildClubHeaders({
'Content-Type': 'application/json',
...options.header,
});
if (token) {
header['Authorization'] = 'Bearer ' + token;
}
return new Promise((resolve) => {
wx.request({
url: app.globalData.apiBaseUrl + options.url,
method: options.method || 'GET',
data: options.data || {},
header,
timeout: options.timeout || 15000,
success: async (res) => {
if (res.statusCode === 401 || res.statusCode === 403) {
const serverMsg =
(res.data && (res.data.msg || res.data.message)) || '';
if (app.globalData.loginPromise) {
try {
await app.globalData.loginPromise;
const retryRes = await request(options);
resolve(retryRes);
} catch (err) {
showAuthFailModal(serverMsg);
resolve(res);
}
return;
}
showAuthFailModal(serverMsg);
resolve(res);
return;
}
resolve(res);
},
fail: (err) => {
console.warn('request fail:', options.url, err && err.errMsg);
resolve({
statusCode: 0,
data: {
code: 408,
msg: (err && err.errMsg) || '网络请求失败',
},
errMsg: (err && err.errMsg) || 'request:fail',
});
},
});
});
}
export default request;
export { LOGIN_HINT_KEY, goLoginPage, clearAuthAndGoLogin };