Initial VTuber Awards implementation
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
import { defineStore } from 'pinia'
|
||||
|
||||
import { AUTH_TOKEN_KEY, api } from '../lib/api'
|
||||
import type { AuthSession, LoginPayload } from '../types/awards'
|
||||
|
||||
function readStoredToken() {
|
||||
if (typeof window === 'undefined') return null
|
||||
return window.localStorage.getItem(AUTH_TOKEN_KEY)
|
||||
}
|
||||
|
||||
function writeStoredToken(token: string | null) {
|
||||
if (typeof window === 'undefined') return
|
||||
|
||||
if (token) {
|
||||
window.localStorage.setItem(AUTH_TOKEN_KEY, token)
|
||||
} else {
|
||||
window.localStorage.removeItem(AUTH_TOKEN_KEY)
|
||||
}
|
||||
}
|
||||
|
||||
export const useAuthStore = defineStore('auth', {
|
||||
state: () => ({
|
||||
session: null as AuthSession | null,
|
||||
hydrated: false,
|
||||
loading: false,
|
||||
}),
|
||||
getters: {
|
||||
isLoggedIn: (state) => Boolean(state.session),
|
||||
isAdmin: (state) => state.session?.role === 'admin',
|
||||
},
|
||||
actions: {
|
||||
async hydrate() {
|
||||
if (!readStoredToken()) {
|
||||
this.hydrated = true
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
this.session = await api.getSession()
|
||||
} catch {
|
||||
this.session = null
|
||||
writeStoredToken(null)
|
||||
} finally {
|
||||
this.hydrated = true
|
||||
}
|
||||
},
|
||||
async login(payload: LoginPayload) {
|
||||
this.loading = true
|
||||
try {
|
||||
const session = await api.login(payload)
|
||||
this.session = session
|
||||
writeStoredToken(session.sessionToken)
|
||||
} finally {
|
||||
this.loading = false
|
||||
}
|
||||
},
|
||||
async logout() {
|
||||
this.loading = true
|
||||
try {
|
||||
await api.logout()
|
||||
} finally {
|
||||
this.session = null
|
||||
writeStoredToken(null)
|
||||
this.loading = false
|
||||
}
|
||||
},
|
||||
},
|
||||
})
|
||||
Reference in New Issue
Block a user