医学道
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
video/src/store/profile.ts

79 lines
1.9 KiB

import {useEffect, useState} from "react";
import {createContainer} from "unstated-next";
import Taro from "@tarojs/taro";
import {whiteList} from "@/config";
function DataKey(data: any) {
return !Array.isArray(data)
&& typeof data === 'object'
&& 'data' in data
&& 'user' in data.data
&& 'token' in data.data
&& 'company' in data.data
}
function useProfile() {
let data
if (process.env.TARO_ENV === 'h5') {
try {
const profileCopy = JSON.parse(localStorage.getItem("profileCopy") || '{}')
if (DataKey(profileCopy)) {
data = profileCopy.data || null
localStorage.removeItem("profileCopy")
Taro.reLaunch({url: '/pages/index/index'})
}
} catch (e) {
console.error(e)
}
}
if (data == null) {
try {
const cacheData = {data: JSON.parse(Taro.getStorageSync('profile') || '{}')}
if (DataKey(cacheData)) {
data = cacheData.data
}
} catch (e) {
console.error(e)
}
}
if (data?.token == null) {
if (!whiteList.includes(Taro.getCurrentInstance().router?.path?.split('?')?.[0] || '')) {
Taro.reLaunch({url: '/pages/preview/preview'})
}
}
const [role, setRole] = useState<UserRole | null>(data?.role || null)
const [user, setUser] = useState<User | null>(data?.user || null)
const [token, setToken] = useState<string | null>(data?.token || null)
const [company, setCompany] = useState<Company | null>(data?.company || null)
function empty() {
setUser(null)
setUser(null)
setToken(null)
Taro.removeStorageSync('profile')
Taro.reLaunch({url: '/pages/login/login'})
}
useEffect(() => {
Taro.setStorage({
key: 'profile',
data: JSON.stringify({role, user, token, company})
})
}, [role, user, token, company])
return {
role, setRole,
user, setUser,
token, setToken,
company, setCompany,
empty
}
}
export const Profile = createContainer(useProfile);