Files
device-voice-h5/store/user.js
luo f7cb28febf
All checks were successful
构建并部署前端到生产环境 / build-and-deploy (push) Successful in 2m16s
fix: some
2026-10-14 13:40:55 +08:00

145 lines
4.3 KiB
JavaScript

import { reactive } from 'vue';
import { optionalBoolean, getBindingSuccessState } from '@/utils/phone-bind.js';
import { useAssetStore } from './asset.js';
const PHONE_STATE_KEY = 'customerAssetPhoneState';
const emptyPhoneState = () => ({
customerPhone: null,
assetPhoneBound: null,
assetPhoneIsOwn: null,
needBindPhone: null
});
const savedPhoneState = uni.getStorageSync(PHONE_STATE_KEY);
const token = uni.getStorageSync('token') || '';
const identifier = uni.getStorageSync('identifier') || '';
const isOAuthCallback = typeof window !== 'undefined' && typeof sessionStorage !== 'undefined' &&
!!new URLSearchParams(window.location.search).get('code') && !!sessionStorage.getItem('assetToken');
const phoneState = savedPhoneState?.token === token && savedPhoneState?.identifier === identifier && token
? {
customerPhone: typeof savedPhoneState.customerPhone === 'string' ? savedPhoneState.customerPhone : null,
assetPhoneBound: optionalBoolean(savedPhoneState.assetPhoneBound),
assetPhoneIsOwn: optionalBoolean(savedPhoneState.assetPhoneIsOwn),
needBindPhone: optionalBoolean(savedPhoneState.needBindPhone)
}
: emptyPhoneState();
const state = reactive({
token,
assetToken: '',
identifier,
loginPending: isOAuthCallback,
...phoneState,
phoneRevision: 0,
isDevice: false,
realNameStatus: 0,
userInfo: uni.getStorageSync('userInfo') || {
avatar: '',
nickname: ''
}
});
export const useUserStore = () => {
const setLoginPending = (pending) => { state.loginPending = pending === true; };
const persistPhoneState = () => {
uni.setStorageSync(PHONE_STATE_KEY, {
token: state.token, identifier: state.identifier,
customerPhone: state.customerPhone,
assetPhoneBound: state.assetPhoneBound,
assetPhoneIsOwn: state.assetPhoneIsOwn,
needBindPhone: state.needBindPhone
});
};
const resetContext = () => {
Object.assign(state, emptyPhoneState());
state.phoneRevision++;
uni.removeStorageSync(PHONE_STATE_KEY);
// The legacy per-asset cache mixed customer phones with asset phones.
uni.removeStorageSync('phoneBindStatus');
useAssetStore().clearAsset();
};
const setToken = (token) => {
if (state.token !== token) resetContext();
state.token = token;
uni.setStorageSync('token', token);
};
const setAssetToken = (assetToken) => {
state.assetToken = assetToken;
};
const setIdentifier = (identifier) => {
if (state.identifier !== identifier) resetContext();
state.identifier = identifier;
uni.setStorageSync('identifier', identifier);
};
const setIsDevice = (isDevice) => {
state.isDevice = isDevice;
};
const setRealNameStatus = (status) => {
state.realNameStatus = status;
};
const setUserInfo = (userInfo) => {
Object.assign(state.userInfo, userInfo);
uni.setStorageSync('userInfo', userInfo);
};
const setLoginPhoneState = (data) => {
state.assetPhoneBound = optionalBoolean(data.asset_phone_bound);
state.assetPhoneIsOwn = optionalBoolean(data.asset_phone_is_own);
state.needBindPhone = optionalBoolean(data.need_bind_phone);
// A required prompt with an already-bound asset means only the customer
// needs a phone. Other login combinations do not expose the customer phone.
if (state.assetPhoneBound === true && state.needBindPhone === true) state.customerPhone = '';
persistPhoneState();
};
const setCustomerPhone = (phone) => {
if (typeof phone !== 'string') return;
state.customerPhone = phone;
persistPhoneState();
};
const completePhoneBinding = (phone, mode) => {
Object.assign(state, getBindingSuccessState(state, phone, mode));
state.phoneRevision++;
persistPhoneState();
};
const completeCustomerPhoneChange = (phone) => {
state.customerPhone = phone;
state.assetPhoneIsOwn = null;
state.phoneRevision++;
persistPhoneState();
};
const clearUser = () => {
resetContext();
state.token = '';
state.loginPending = false;
state.assetToken = '';
state.identifier = '';
state.isDevice = false;
state.realNameStatus = 0;
state.userInfo = { avatar: '', nickname: '' };
uni.removeStorageSync('token');
uni.removeStorageSync('identifier');
uni.removeStorageSync('userInfo');
};
return {
state,
setToken,
setLoginPending,
setAssetToken,
setIdentifier,
setIsDevice,
setRealNameStatus,
setUserInfo,
setLoginPhoneState,
setCustomerPhone,
completePhoneBinding,
completeCustomerPhoneChange,
clearUser
};
};