import { defineStore } from 'pinia' import { http } from '@/api/client' import type { User } from '@/types' export const useAuthStore = defineStore('auth', { state: () => ({ user: null as User | null, accessToken: localStorage.getItem('ot_access') ?? '', ready: false, }), getters: { isAuthed: (s) => !!s.accessToken && !!s.user, isAdmin: (s) => s.user?.role === 'admin', }, actions: { async bootstrap() { try { if (!this.accessToken) { await this.refresh() } await this.fetchMe() } catch { this.clear() } this.ready = true }, async register(username: string, email: string, password: string) { await http.post('/auth/register', { username, email, password }) }, async login(username: string, password: string) { const { data } = await http.post('/auth/login', { username, password }) this.setSession(data.data) }, setSession(d: { access_token: string; user: User }) { this.accessToken = d.access_token this.user = d.user localStorage.setItem('ot_access', d.access_token) }, async refresh() { const { data } = await http.post('/auth/refresh') this.accessToken = data.data.access_token as string localStorage.setItem('ot_access', this.accessToken) }, async fetchMe() { const { data } = await http.get('/auth/me') this.user = data.data.user as User }, async logout() { try { await http.post('/auth/logout') } catch { /* ignore */ } this.clear() }, clear() { this.accessToken = '' this.user = null localStorage.removeItem('ot_access') }, }, })