171 lines
5.5 KiB
TypeScript
171 lines
5.5 KiB
TypeScript
import Taro from '@tarojs/taro';
|
|
|
|
import { CacheKey } from '@/constants/cache-key';
|
|
import http from '@/http';
|
|
import { API } from '@/http/api';
|
|
import store from '@/store';
|
|
import { setUserInfo, setBindPhone } from '@/store/actions';
|
|
import { selectUserInfo } from '@/store/selector';
|
|
import {
|
|
FollowGroupRequest,
|
|
SetPhoneRequest,
|
|
UpdateUserInfoRequest,
|
|
UpdateUserInfoResponse,
|
|
UserInfo,
|
|
} from '@/types/user';
|
|
import { logWithPrefix } from '@/utils/common';
|
|
import Toast from '@/utils/toast';
|
|
|
|
let lastOpenMiniProgramTime: number | null = null;
|
|
const SHOW_LOGIN_GUIDE_OFFSET = 1 * 60 * 60 * 1000;
|
|
// const SHOW_LOGIN_GUIDE_OFFSET = 60 * 1000;
|
|
// const SHOW_MATERIAL_GUIDE_OFFSET = 1 * 1000;
|
|
const log = logWithPrefix('user-utils');
|
|
let showLoginGuide: boolean | null = null;
|
|
|
|
export const getUserInfo = () => selectUserInfo(store.getState());
|
|
|
|
export const getUserId = () => getUserInfo().userId;
|
|
|
|
// 无效则说明还没拉到数据
|
|
export const isValidUserInfo = (info: UserInfo) => !!info.userId;
|
|
|
|
export const isNeedLogin = (info: UserInfo) => !info.isBindPhone;
|
|
// export const isNeedLogin = (info: UserInfo) => !info.isBindPhone || info.userId === '534740874077898752';
|
|
|
|
export const isNeedPhone = (info: UserInfo) => isNeedLogin(info) || !info.phone;
|
|
|
|
export const updateLastLoginTime = () => {
|
|
lastOpenMiniProgramTime = Taro.getStorageSync<number>(CacheKey.LAST_OPEN_MINI_PROGRAM_TIME) ?? null;
|
|
const now = Date.now();
|
|
log(`updateLastLoginTime: lastOpenMiniProgramTime=${lastOpenMiniProgramTime}, now=${now}`);
|
|
Taro.setStorageSync(CacheKey.LAST_OPEN_MINI_PROGRAM_TIME, now);
|
|
};
|
|
|
|
/**
|
|
* 登录引导
|
|
* 非首次打开小程序后,如果没有绑定手机号,在打开小程序时自动弹出一次
|
|
* 指定时间间隔内只出现一次
|
|
* @param info
|
|
* @returns
|
|
*/
|
|
export const shouldShowLoginGuide = (info: UserInfo) => {
|
|
// if (1 < 2) {
|
|
// return true;
|
|
// }
|
|
if (!isValidUserInfo(info) || !isNeedLogin(info)) {
|
|
return false;
|
|
}
|
|
if (typeof showLoginGuide === 'boolean') {
|
|
return showLoginGuide;
|
|
}
|
|
if (!lastOpenMiniProgramTime) {
|
|
// 第一次打开不强制提示
|
|
showLoginGuide = false;
|
|
} else {
|
|
showLoginGuide = Date.now() - lastOpenMiniProgramTime > SHOW_LOGIN_GUIDE_OFFSET;
|
|
}
|
|
return showLoginGuide;
|
|
};
|
|
|
|
// export const shouldShowLoginDialog = (info: UserInfo) => {
|
|
// if (!isValidUserInfo(info) || !isNeedLogin(info)) {
|
|
// return false;
|
|
// }
|
|
// const cache = Taro.getStorageSync<boolean>(CacheKey.SHOW_LOGIN_DIALOG);
|
|
// return !cache;
|
|
// };
|
|
|
|
// export const setAlreadyShowLoginDialog = () => Taro.setStorageSync(CacheKey.SHOW_LOGIN_DIALOG, '1');
|
|
|
|
export const isNeedCreateMaterial = async () => {
|
|
let info = getUserInfo();
|
|
if (!isValidUserInfo(info)) {
|
|
info = await requestUserInfo();
|
|
}
|
|
return !info.isCreateResume;
|
|
};
|
|
|
|
export const ensureUserInfo = async (info: UserInfo, toast = true) => {
|
|
if (!isValidUserInfo(info)) {
|
|
try {
|
|
await requestUserInfo();
|
|
} catch (e) {
|
|
toast && Toast.error('请稍后再试');
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
};
|
|
|
|
export const dispatchUpdateUser = (userInfo: Partial<UserInfo>) => store.dispatch(setUserInfo(userInfo));
|
|
|
|
export async function requestUserInfo(inviteCode?: string) {
|
|
const userInfo = await http.post<UserInfo>(API.USER, { data: inviteCode ? { inviteCode } : {} });
|
|
dispatchUpdateUser(userInfo);
|
|
return userInfo;
|
|
}
|
|
|
|
export async function setPhoneNumber(params: SetPhoneRequest) {
|
|
try {
|
|
await http.post<string>(API.SET_PHONE, { data: params });
|
|
store.dispatch(setBindPhone(true));
|
|
} catch (e) {
|
|
Taro.showToast({ title: '绑定失败', icon: 'error' });
|
|
}
|
|
}
|
|
|
|
export async function updateUserInfo(params: Omit<UpdateUserInfoRequest, 'userId'>) {
|
|
try {
|
|
const data = { ...params, userId: getUserId() };
|
|
const {
|
|
avatarUrl,
|
|
nickName,
|
|
imAcctNo = params.imAcctNo,
|
|
} = await http.post<UpdateUserInfoResponse>(API.USER_UPDATE, { data });
|
|
const userInfoPayload: Partial<UserInfo> = { imAcctNo };
|
|
if (avatarUrl) {
|
|
userInfoPayload.avatarUrl = avatarUrl;
|
|
userInfoPayload.isDefaultAvatar = false;
|
|
}
|
|
if (nickName) {
|
|
userInfoPayload.nickName = nickName;
|
|
userInfoPayload.isDefaultNickname = false;
|
|
}
|
|
store.dispatch(setUserInfo(userInfoPayload));
|
|
} catch (e) {
|
|
Taro.showToast({ title: '更新失败', icon: 'error' });
|
|
}
|
|
}
|
|
|
|
export async function followGroup(blGroupId: FollowGroupRequest['blGroupId']) {
|
|
try {
|
|
const data: FollowGroupRequest = { blGroupId, userId: getUserId() };
|
|
await http.post(API.FOLLOW_GROUP, { data });
|
|
return true;
|
|
} catch (e) {
|
|
Taro.showToast({ title: '出错了,请重试', icon: 'error' });
|
|
return false;
|
|
}
|
|
}
|
|
|
|
export const getAgreementSigned = (): boolean | '' => Taro.getStorageSync(CacheKey.AGREEMENT_SIGNED);
|
|
export const setAgreementSigned = (signed: boolean) => Taro.setStorageSync(CacheKey.AGREEMENT_SIGNED, signed);
|
|
export const getCityCodes = (): string[] => {
|
|
const cachedValue = Taro.getStorageSync(CacheKey.CITY_CODES);
|
|
return !cachedValue || !Array.isArray(cachedValue) ? [] : cachedValue;
|
|
};
|
|
export const setCityCodes = (cityCode: string[]) => Taro.setStorageSync(CacheKey.CITY_CODES, cityCode);
|
|
export const checkCityCode = (cityCode: string): boolean => {
|
|
const cachedCityCodes = getCityCodes();
|
|
const isNewCityCode = cachedCityCodes.indexOf(cityCode) === -1;
|
|
if (cachedCityCodes.length === 2 && isNewCityCode) {
|
|
Toast.info('最多只能进入2个城市');
|
|
return false;
|
|
}
|
|
if (isNewCityCode) {
|
|
setCityCodes([...cachedCityCodes, cityCode]);
|
|
}
|
|
return true;
|
|
};
|