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.
79 lines
1.9 KiB
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);
|
|
|