86 lines
2.5 KiB
TypeScript
86 lines
2.5 KiB
TypeScript
import { computed, reactive } from 'vue';
|
|
|
|
import { type AccountSummary, api, currentToken, type Me, setToken } from './api';
|
|
|
|
const VIEW_ACCOUNT_KEY = 'wecom-mobile-view-account';
|
|
|
|
interface ViewedAccount {
|
|
id: number;
|
|
nickname: string;
|
|
sn: string;
|
|
}
|
|
|
|
function readViewedAccount(): ViewedAccount | null {
|
|
try {
|
|
const raw = window.localStorage.getItem(VIEW_ACCOUNT_KEY);
|
|
const value = raw ? (JSON.parse(raw) as ViewedAccount) : null;
|
|
return value && typeof value.id === 'number' ? value : null;
|
|
} catch {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
export const session = reactive({
|
|
token: currentToken(),
|
|
me: null as Me | null,
|
|
// 有 remote/all 权限的人可以切到别的客服;其他人永远看自己。
|
|
viewed: readViewedAccount() as ViewedAccount | null,
|
|
});
|
|
|
|
export const permissions = computed(() => session.me?.permissions);
|
|
|
|
/** 当前查看的是不是别人的电脑。是的话,接口要带 account_id。 */
|
|
export const viewedAccountId = computed<number | undefined>(() => {
|
|
const me = session.me;
|
|
const viewed = session.viewed;
|
|
if (!me || !viewed || !me.permissions.control_all || viewed.id === me.account.id) return undefined;
|
|
return viewed.id;
|
|
});
|
|
|
|
export const viewedName = computed(() => {
|
|
if (viewedAccountId.value !== undefined && session.viewed) {
|
|
return session.viewed.nickname || session.viewed.sn || `客服 #${session.viewed.id}`;
|
|
}
|
|
return session.me?.account.nickname || session.me?.account.sn || '';
|
|
});
|
|
|
|
export function viewAccount(account: AccountSummary | ViewedAccount | null): void {
|
|
session.viewed = account ? { id: account.id, nickname: account.nickname, sn: account.sn } : null;
|
|
try {
|
|
if (session.viewed) window.localStorage.setItem(VIEW_ACCOUNT_KEY, JSON.stringify(session.viewed));
|
|
else window.localStorage.removeItem(VIEW_ACCOUNT_KEY);
|
|
} catch {
|
|
// 忽略:只是记住上次看的是谁
|
|
}
|
|
}
|
|
|
|
export function signIn(token: string, me: Me): void {
|
|
setToken(token);
|
|
session.token = token;
|
|
session.me = me;
|
|
if (!me.permissions.control_all) viewAccount(null);
|
|
}
|
|
|
|
export function clearSession(): void {
|
|
setToken('');
|
|
session.token = '';
|
|
session.me = null;
|
|
viewAccount(null);
|
|
}
|
|
|
|
export async function loadMe(): Promise<Me> {
|
|
const me = await api.me();
|
|
session.me = me;
|
|
if (!me.permissions.control_all) viewAccount(null);
|
|
return me;
|
|
}
|
|
|
|
export async function signOut(): Promise<void> {
|
|
try {
|
|
await api.logout();
|
|
} catch {
|
|
// 令牌已经失效也照样清掉本地状态
|
|
}
|
|
clearSession();
|
|
}
|