import { defineStore } from 'pinia' import { ref } from 'vue' const AUTH_TOKEN_KEY = 'p3xr-auth-token' export const useAuthStore = defineStore('auth', () => { const authRequired = ref(false) const isAuthenticated = ref(false) const authChecked = ref(false) const loginError = ref('') async function checkAuthStatus() { try { const res = await fetch('/api/auth-status') const data = await res.json() if (!data.enabled) { authRequired.value = false isAuthenticated.value = true } else { authRequired.value = true const token = getToken() if (token) { const verifyRes = await fetch('/api/verify-token', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ token }), }) const verifyData = await verifyRes.json() isAuthenticated.value = verifyData.valid if (!verifyData.valid) { localStorage.removeItem(AUTH_TOKEN_KEY) } } } } catch { isAuthenticated.value = true } authChecked.value = true } async function login(username: string, password: string): Promise { loginError.value = '' try { const res = await fetch('/api/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username, password }), }) const data = await res.json() if (data.status === 'ok' && data.token) { localStorage.setItem(AUTH_TOKEN_KEY, data.token) isAuthenticated.value = true return true } loginError.value = data.error return false } catch { loginError.value = 'network_error' return false } } function getToken(): string | null { try { return localStorage.getItem(AUTH_TOKEN_KEY) } catch { return null } } function logout() { try { localStorage.removeItem(AUTH_TOKEN_KEY) } catch {} location.reload() } return { authRequired, isAuthenticated, authChecked, loginError, checkAuthStatus, login, getToken, logout, } })