Files
xsh-assistant-next/composables/useLoginState.ts

80 lines
2.0 KiB
TypeScript

import { useFetchWrapped } from '~/composables/useFetchWrapped'
export const useLoginState = defineStore(
'loginState',
() => {
const is_logged_in = ref(false)
const token = ref<string | null>(null)
const user = ref<UserSchema>({} as UserSchema)
const checkSession = () => {
return new Promise<boolean>((resolve) => {
if (!token.value) return resolve(false)
useFetchWrapped<AuthedRequest, BaseResponse<resp.user.CheckSession>>(
'App.User_User.CheckSession',
{
token: token.value,
user_id: user.value.id,
}
)
.then((res) => {
if (res.ret !== 200) {
resolve(false)
return
}
resolve(res.data.is_login)
// update global state
is_logged_in.value = res.data.is_login
})
.catch((err) => resolve(false))
})
}
const updateProfile = () => {
return new Promise<UserSchema>((resolve, reject) => {
if (!token.value) return reject('token is empty')
useFetchWrapped<AuthedRequest, BaseResponse<resp.user.Profile>>(
'App.User_User.Profile',
{
token: token.value,
user_id: user.value.id,
}
)
.then((res) => {
if (res.ret !== 200) {
reject(res.msg || '未知错误')
return
}
user.value = res.data.profile
resolve(res.data.profile)
})
.catch((err) => reject(err || '未知错误'))
})
}
const logout = () =>
new Promise<void>((resolve) => {
token.value = null
user.value = {} as UserSchema
is_logged_in.value = false
resolve()
})
return {
is_logged_in,
token,
user,
checkSession,
updateProfile,
logout,
}
},
{
persist: {
key: 'xsh_assistant_persisted_state',
storage: persistedState.localStorage,
paths: ['is_logged_in', 'token', 'user'],
},
}
)