Files
kefu/admin-web/apps/mobile-h5/src/session.ts
T
2026-09-29 15:52:07 +08:00

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();
}