80 lines
2.3 KiB
JavaScript
80 lines
2.3 KiB
JavaScript
// utils/login.js
|
|
import {
|
|
applyWechatLoginData,
|
|
backfillUserProfileCache,
|
|
getSessionToken,
|
|
isWechatLoginSuccess,
|
|
} from './role-tab-bar';
|
|
import { restoreStaffContextAfterAuth } from './staff-api.js';
|
|
import { CLUB_API, getClubId, setClubId, buildClubHeaders } from './club-context';
|
|
|
|
const app = getApp();
|
|
|
|
export function ensureLogin(options = {}) {
|
|
const silent = options.silent !== false;
|
|
const page = options.page || null;
|
|
const token = getSessionToken(app);
|
|
if (token) {
|
|
backfillUserProfileCache(app);
|
|
restoreStaffContextAfterAuth();
|
|
return Promise.resolve(true);
|
|
}
|
|
|
|
if (app.globalData.loginPromise) {
|
|
return app.globalData.loginPromise;
|
|
}
|
|
|
|
const loginPromise = new Promise(async (resolve, reject) => {
|
|
if (silent) {
|
|
wx.showLoading({ title: '自动登录中...', mask: true });
|
|
}
|
|
try {
|
|
const loginRes = await wx.login();
|
|
if (!loginRes.code) throw new Error('获取微信登录码失败');
|
|
|
|
const apiBaseUrl = app.globalData.apiBaseUrl;
|
|
if (!apiBaseUrl) throw new Error('服务器配置错误');
|
|
|
|
const clubId = getClubId(app);
|
|
const appId = app.globalData.appId || '';
|
|
|
|
const res = await new Promise((resolve, reject) => {
|
|
wx.request({
|
|
url: apiBaseUrl + CLUB_API.wechatLogin,
|
|
method: 'POST',
|
|
data: { code: loginRes.code, club_id: clubId, app_id: appId },
|
|
header: buildClubHeaders({ 'content-type': 'application/json' }),
|
|
success: resolve,
|
|
fail: reject,
|
|
});
|
|
});
|
|
|
|
const userData = res.data && (res.data.data || res.data);
|
|
if (res.statusCode === 200 && isWechatLoginSuccess(res.data) && userData) {
|
|
if (userData.club_id) {
|
|
setClubId(userData.club_id, app);
|
|
}
|
|
applyWechatLoginData(userData, page);
|
|
restoreStaffContextAfterAuth();
|
|
resolve(true);
|
|
} else {
|
|
const msg = res.data?.msg || '登录失败';
|
|
wx.showToast({ title: msg, icon: 'none' });
|
|
reject(new Error(msg));
|
|
}
|
|
} catch (error) {
|
|
wx.showToast({ title: error.message || '登录失败', icon: 'none' });
|
|
reject(error);
|
|
} finally {
|
|
if (silent) wx.hideLoading();
|
|
}
|
|
});
|
|
|
|
app.globalData.loginPromise = loginPromise;
|
|
loginPromise.finally(() => {
|
|
app.globalData.loginPromise = null;
|
|
});
|
|
|
|
return loginPromise;
|
|
}
|