Proper user login

This commit is contained in:
2025-09-20 12:37:37 +08:00
parent e9c7559e38
commit bd78e3f600
16 changed files with 323 additions and 95 deletions

View File

@@ -1,46 +1,65 @@
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import { useSolarNetwork } from '~/composables/useSolarNetwork'
import type { SnAccount } from '~/types/api'
import { defineStore } from "pinia"
import { ref, computed } from "vue"
import { useSolarNetwork } from "~/composables/useSolarNetwork"
import type { SnAccount } from "~/types/api"
export const useUserStore = defineStore('user', () => {
export const useUserStore = defineStore("user", () => {
// State
const user = ref<SnAccount | null>(null)
const isLoading = ref(false)
const error = ref<string | null>(null)
// The name is match with the remote one (set by server Set-Cookie)
const token = useCookie<string | null>("AuthToken", {
default: () => null,
path: "/",
maxAge: 60 * 60 * 24 * 365 * 10
}) // 10 years
// Getters
const isAuthenticated = computed(() => !!user.value)
const isAuthenticated = computed(() => !!user.value && !!token.value)
// Call fetchUser immediately
fetchUser()
// Actions
async function fetchUser(reload = true) {
if (!reload && user.value) return // Skip fetching if already loaded and not forced to
isLoading.value = true
error.value = null
const api = useSolarNetwork()
try {
const response = await api('/id/accounts/me')
const response = await api("/id/accounts/me")
user.value = response as SnAccount
console.log(`Logged in as ${user.value.name}`)
} catch (e: unknown) {
error.value = e instanceof Error ? e.message : 'An error occurred'
error.value = e instanceof Error ? e.message : "An error occurred"
user.value = null // Clear user data on error
console.error('Failed to fetch user... ', e)
} finally {
isLoading.value = false
}
}
function setToken(newToken: string) {
token.value = newToken
}
function logout() {
user.value = null
localStorage.removeItem('authToken')
token.value = null
}
return {
user,
token,
isLoading,
error,
isAuthenticated,
fetchUser,
setToken,
logout,
}
})