owltide/stores/users.ts
Hornwitser 5662b890de
All checks were successful
/ build (push) Successful in 1m32s
/ deploy (push) Successful in 26s
Fix userStore fetching when not allowed
Fix userStore attempting to fetch the users list when it's either not
logged in or not allowed to fetch the users, causing the schedule page
to not render.
2025-06-24 16:18:28 +02:00

78 lines
2 KiB
TypeScript

import { Info } from "~/shared/utils/luxon";
import { defineStore } from 'pinia'
interface SyncOperation {
controller: AbortController,
promise: Promise<Ref<ClientMap<ClientUser>>>,
}
export const useUsersStore = defineStore("users", () => {
const accountStore = useAccountStore();
const state = {
fetched: ref<boolean>(false),
pendingSync: ref<SyncOperation>(),
users: ref<ClientMap<ClientUser>>(new ClientMap(ClientUser, new Map(), new Map())),
}
const getters = {
}
const actions = {
async fetch() {
if (!accountStore.isCrew || state.fetched.value) {
return state.users;
}
const pending = state.pendingSync.value;
if (pending) {
return pending.promise;
}
const requestFetch = useRequestFetch();
const controller = new AbortController();
const zone = Info.normalizeZone(accountStore.activeTimezone);
const locale = accountStore.activeLocale;
const promise = (async () => {
try {
const apiUsers = await requestFetch("/api/users", { signal: controller.signal });
state.users.value.apiUpdate(apiUsers, { zone, locale });
state.pendingSync.value = undefined;
state.fetched.value = true;
return state.users;
} catch (err: any) {
if (err.name !== "AbortError")
state.pendingSync.value = undefined;
throw err;
}
})();
state.pendingSync.value = {
controller,
promise,
};
return promise;
},
async resync(id: number) {
const pending = state.pendingSync.value;
if (pending) {
pending.controller.abort();
}
state.pendingSync.value = undefined;
state.fetched.value = false;
await actions.fetch();
},
}
appEventSource?.addEventListener("update", (event) => {
if (event.data.type !== "user-update") {
return;
}
console.log("appyling", event.data)
const zone = Info.normalizeZone(accountStore.activeTimezone);
const locale = accountStore.activeLocale;
state.users.value.apiUpdate([event.data.data], { zone, locale });
});
return {
...state,
...getters,
...actions,
};
})