🐛 Fix user loading exit early when there is another async doing that to fix the auth middleware
This commit is contained in:
@@ -9,43 +9,49 @@ export const useUserStore = defineStore("user", () => {
|
||||
const user = ref<SnAccount | null>(null)
|
||||
const isLoading = ref(false)
|
||||
const error = ref<string | null>(null)
|
||||
const currentFetchPromise = ref<Promise<void> | null>(null)
|
||||
|
||||
// Getters
|
||||
const isAuthenticated = computed(() => !!user.value)
|
||||
|
||||
// Actions
|
||||
async function fetchUser(reload = true) {
|
||||
if (isLoading.value) {
|
||||
console.log("[UserStore] Fetch already in progress. Skipping.")
|
||||
return
|
||||
async function fetchUser(reload = true): Promise<void> {
|
||||
if (currentFetchPromise.value) {
|
||||
console.log("[UserStore] Fetch already in progress. Waiting for existing fetch.")
|
||||
return currentFetchPromise.value
|
||||
}
|
||||
if (!reload && user.value) {
|
||||
console.log(
|
||||
`[UserStore] User store was loaded with account @${user.value.name} and no reload. Skipping.`
|
||||
)
|
||||
return
|
||||
return Promise.resolve()
|
||||
}
|
||||
|
||||
isLoading.value = true
|
||||
error.value = null
|
||||
const api = useSolarNetwork()
|
||||
try {
|
||||
const response = await api<SnAccount>("/id/accounts/me")
|
||||
console.log("[UserStore] Fetched user data: ", response)
|
||||
user.value = response
|
||||
console.log(`[UserStore] Logged in as @${user.value.name}`)
|
||||
} catch (e: unknown) {
|
||||
if (e instanceof FetchError && e.statusCode == 401) {
|
||||
error.value = "Unauthorized"
|
||||
user.value = null
|
||||
} else {
|
||||
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)
|
||||
const fetchPromise = (async () => {
|
||||
isLoading.value = true
|
||||
error.value = null
|
||||
const api = useSolarNetwork()
|
||||
try {
|
||||
const response = await api<SnAccount>("/id/accounts/me")
|
||||
user.value = response
|
||||
console.log(`[UserStore] Logged in as @${user.value.name}`)
|
||||
} catch (e: unknown) {
|
||||
if (e instanceof FetchError && e.statusCode == 401) {
|
||||
error.value = "Unauthorized"
|
||||
user.value = null
|
||||
} else {
|
||||
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
|
||||
currentFetchPromise.value = null
|
||||
}
|
||||
} finally {
|
||||
isLoading.value = false
|
||||
}
|
||||
})()
|
||||
|
||||
currentFetchPromise.value = fetchPromise
|
||||
return fetchPromise
|
||||
}
|
||||
|
||||
function logout() {
|
||||
|
Reference in New Issue
Block a user