You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Global-sales/src/stores/AuthStore.js

134 lines
3.4 KiB
JavaScript

import { create } from 'zustand'
import { fetchJSON } from '@/utils/request'
import { isEmpty, isNotEmpty, } from '@/utils/commons'
export const PERM_MERGE_CONVERSATION = 'merge-conversation'
export const PERM_ASSIGN_NEW_CONVERSATION = 'assign-new-conversation'
const useAuthStore = create((set, get) => ({
loginUser: {
userId: -1,
userIdStr: '-1',
username: '',
avatarUrl: '',
mobile: '',
email: '',
openId: '',
accountList: [],
permissionList: [],
},
loginStatus: 0,
isPermitted: (perm) => {
const { loginUser } = get()
if (perm === PERM_MERGE_CONVERSATION) {
return ['404', '383', '227'].includes(loginUser.userId)
}
if (perm === PERM_ASSIGN_NEW_CONVERSATION) {
return ['79', '383', '404', '227'].includes(loginUser.userId)
}
// 以上是 Hardcode 判断
// 以下是权限列表从数据库读取后使用的方法
// return this.permissionList.some((value, key, arry) => {
// if (value.indexOf(WILDCARD_TOKEN) > -1) {
// return true;
// }
// if (value === perm) {
// return true;
// }
// return false;
// });
},
login: async (authCode) => {
const { saveUserSession, setLoginStatus } = get()
setLoginStatus(200)
const json = await fetchJSON(`https://p9axztuwd7x8a7.mycht.cn/dingtalk/dingtalkwork/WhatsAppAuth`, { authCode })
if (json.errcode === 0 && isNotEmpty(json.result.opisn)) {
set(() => ({
loginUser: {
userId: json.result.opisn,
userIdStr: json.result?.accountlist.map(acc => {
return acc.OPI_SN
}).join(','),
accountName: json.result.opicode,
username: json.result.nick,
avatarUrl: json.result.avatarUrl,
mobile: '+' + json.result.stateCode + '-' + json.result.mobile,
email: json.result.email,
openId: json.result.openId,
accountList: json.result.accountlist,
}
}))
saveUserSession()
setLoginStatus(302)
} else {
setLoginStatus(403)
}
},
setLoginStatus: (code) => {
set(() => ({
loginStatus: code
}))
},
logout: () => {
window.sessionStorage.clear()
set(() => ({
loginStatus: 0,
loginUser: {
userId: -1,
userIdStr: '-1',
username: '',
avatarUrl: '',
mobile: '',
email: '',
openId: '',
accountList: [],
permissionList: [],
}
}))
},
loadUserSession: () => {
let sessionData = window.sessionStorage.getItem('GLOBAL_SALES_LOGIN_USER')
if (import.meta.env.DEV && isEmpty(sessionData)) {
sessionData = window.localStorage.getItem('GLOBAL_SALES_LOGIN_USER')
}
if (sessionData !== null) {
const sesstionObj = JSON.parse(sessionData);
set(() => ({
loginUser: sesstionObj,
}));
}
},
saveUserSession: () => {
const { loginUser } = get()
window.sessionStorage.setItem('GLOBAL_SALES_LOGIN_USER', JSON.stringify(loginUser))
},
copyUserSession: () => {
const sessionData = window.sessionStorage.getItem('GLOBAL_SALES_LOGIN_USER')
if (sessionData !== null) {
navigator.clipboard.writeText(sessionData)
}
}
}))
export default useAuthStore