RSS Git Download  Clone
Raw Blame History 3kB 92 lines
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<boolean> {
        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,
    }
})