Files
boluo-app-main/src/http/utils.ts
2025-06-05 22:47:41 +08:00

66 lines
1.6 KiB
TypeScript

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<string> | null = null;
const getCode = (): Promise<string> => {
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<string> => {
return getCode()
.then(code => {
return http.post<LoginResponse>(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;
};