import Taro from '@tarojs/taro'; import { LoginResponse } from '@/types/login'; import http from '.'; import { API } from './api'; import { TOKEN_KEY, TOKEN_EXPIRES_TIME } from './constant'; let token = ''; let _fetchTokenPromise: Promise | null = null; const getCode = (): Promise => { return new Promise((resolve, reject) => { Taro.login({ success: res => resolve(res.code), fail: reject, }); }); }; const clearToken = () => { token = ''; Taro.setStorageSync(TOKEN_KEY, ''); Taro.setStorageSync(TOKEN_EXPIRES_TIME, 0); }; const requestToken = (inviteCode?: string): Promise => { return getCode() .then(code => { return http.post(API.LOGIN, { data: { code, inviteCode } }).then(data => { const newToken = data?.token || ''; const expires = data?.expires || 0; if (newToken) { token = newToken; Taro.setStorageSync(TOKEN_KEY, newToken); } if (expires) { Taro.setStorageSync(TOKEN_EXPIRES_TIME, Date.now() + expires); } return newToken; }); }) .finally(() => { _fetchTokenPromise = null; }); }; export const isTokenExpired = () => (Taro.getStorageSync(TOKEN_EXPIRES_TIME) || 0) < Date.now(); export const refreshToken = (inviteCode?: string) => { if (_fetchTokenPromise) { return _fetchTokenPromise; } clearToken(); _fetchTokenPromise = requestToken(inviteCode); return _fetchTokenPromise; }; export const getToken = () => { if (token) { return token; } token = Taro.getStorageSync(TOKEN_KEY); return token; };