/* * This file is part of the kernelstudio package. * * (c) 2014-2025 zlin * * For the full copyright and license information, please view the LICENSE file * that was distributed with this source code. */ import { computed, type ComputedRef, ref, type Ref } from 'vue'; import { getToken, removeToken, setToken } from '../utils/token'; import type { UserLoginForm, UserSessionResult } from '@/types'; import { fetchUserSession, signinByForm } from '@/api/user'; const userDetails = ref(null); const token = ref(getToken() || ''); export interface UseUserSession { token: Ref; details: ComputedRef; load: () => Promise; signin: (form: UserLoginForm) => Promise; logout: () => Promise; } export const useUserSession = (): UseUserSession => { const load = (): Promise => { return new Promise((resolve, reject) => { if (userDetails.value) { resolve(userDetails.value); } else { fetchUserSession().then(r => { if (r.user) { userDetails.value = r; resolve(r); } else { reject(new Error(r.msg ?? '获取用户信息失败.')); } }).catch((e: any)=> { reject(e); }); } }); }; const logout = (): Promise => { return new Promise((resolve) => { removeToken(); resolve(true); // logoutSession().then(r => resolve(r.code === 200)); }); }; const signin = (form: UserLoginForm): Promise => { return new Promise((resolve, reject) => { signinByForm(form).then(r => { if (r.token) { setToken(r.token); load().then(r => resolve(r)); } else { reject(new Error(r.msg ?? '登录失败')); } }); }); }; return { token, details: computed(() => userDetails.value), load, signin, logout, } as UseUserSession; };