diff --git a/frontend/composables/partials/use-store-factory.ts b/frontend/composables/partials/use-store-factory.ts index 1e62d396e..0a510b25d 100644 --- a/frontend/composables/partials/use-store-factory.ts +++ b/frontend/composables/partials/use-store-factory.ts @@ -52,7 +52,7 @@ export const useStore = function ( return await storeActions.refresh(1, -1, params); }, flushStore() { - store = ref([]); + store.value = []; }, }; diff --git a/frontend/composables/store/index.ts b/frontend/composables/store/index.ts index 9dad0b7f1..265917e22 100644 --- a/frontend/composables/store/index.ts +++ b/frontend/composables/store/index.ts @@ -1,7 +1,31 @@ -export { useCategoryStore, usePublicCategoryStore, useCategoryData } from "./use-category-store"; -export { useFoodStore, usePublicFoodStore, useFoodData } from "./use-food-store"; -export { useHouseholdStore, usePublicHouseholdStore } from "./use-household-store"; -export { useLabelStore, useLabelData } from "./use-label-store"; -export { useTagStore, usePublicTagStore, useTagData } from "./use-tag-store"; -export { useToolStore, usePublicToolStore, useToolData } from "./use-tool-store"; -export { useUnitStore, useUnitData } from "./use-unit-store"; +import { resetCategoryStore } from "./use-category-store"; +import { resetFoodStore } from "./use-food-store"; +import { resetHouseholdStore } from "./use-household-store"; +import { resetLabelStore } from "./use-label-store"; +import { resetTagStore } from "./use-tag-store"; +import { resetToolStore } from "./use-tool-store"; +import { resetUnitStore } from "./use-unit-store"; +import { resetCookbookStore } from "./use-cookbook-store"; +import { resetUserStore } from "./use-user-store"; + +export { useCategoryStore, usePublicCategoryStore, useCategoryData, resetCategoryStore } from "./use-category-store"; +export { useFoodStore, usePublicFoodStore, useFoodData, resetFoodStore } from "./use-food-store"; +export { useHouseholdStore, usePublicHouseholdStore, resetHouseholdStore } from "./use-household-store"; +export { useLabelStore, useLabelData, resetLabelStore } from "./use-label-store"; +export { useTagStore, usePublicTagStore, useTagData, resetTagStore } from "./use-tag-store"; +export { useToolStore, usePublicToolStore, useToolData, resetToolStore } from "./use-tool-store"; +export { useUnitStore, useUnitData, resetUnitStore } from "./use-unit-store"; +export { useCookbookStore, usePublicCookbookStore, resetCookbookStore } from "./use-cookbook-store"; +export { useUserStore, resetUserStore } from "./use-user-store"; + +export function clearAllStores() { + resetCategoryStore(); + resetFoodStore(); + resetHouseholdStore(); + resetLabelStore(); + resetTagStore(); + resetToolStore(); + resetUnitStore(); + resetCookbookStore(); + resetUserStore(); +} diff --git a/frontend/composables/store/use-category-store.ts b/frontend/composables/store/use-category-store.ts index bfa074d30..86121ce68 100644 --- a/frontend/composables/store/use-category-store.ts +++ b/frontend/composables/store/use-category-store.ts @@ -7,6 +7,12 @@ const store: Ref = ref([]); const loading = ref(false); const publicLoading = ref(false); +export function resetCategoryStore() { + store.value = []; + loading.value = false; + publicLoading.value = false; +} + export const useCategoryData = function () { return useData({ id: "", diff --git a/frontend/composables/store/use-cookbook-store.ts b/frontend/composables/store/use-cookbook-store.ts index f299a8436..8e5bc4cc1 100644 --- a/frontend/composables/store/use-cookbook-store.ts +++ b/frontend/composables/store/use-cookbook-store.ts @@ -7,6 +7,12 @@ const cookbooks: Ref = ref([]); const loading = ref(false); const publicLoading = ref(false); +export function resetCookbookStore() { + cookbooks.value = []; + loading.value = false; + publicLoading.value = false; +} + export const useCookbookStore = function (i18n?: Composer) { const api = useUserApi(i18n); const store = useStore("cookbook", cookbooks, loading, api.cookbooks); diff --git a/frontend/composables/store/use-food-store.ts b/frontend/composables/store/use-food-store.ts index 3d2ae23f0..68a19d252 100644 --- a/frontend/composables/store/use-food-store.ts +++ b/frontend/composables/store/use-food-store.ts @@ -7,6 +7,12 @@ const store: Ref = ref([]); const loading = ref(false); const publicLoading = ref(false); +export function resetFoodStore() { + store.value = []; + loading.value = false; + publicLoading.value = false; +} + export const useFoodData = function () { return useData({ id: "", diff --git a/frontend/composables/store/use-household-store.ts b/frontend/composables/store/use-household-store.ts index a472b43ae..468ebd807 100644 --- a/frontend/composables/store/use-household-store.ts +++ b/frontend/composables/store/use-household-store.ts @@ -7,6 +7,12 @@ const store: Ref = ref([]); const loading = ref(false); const publicLoading = ref(false); +export function resetHouseholdStore() { + store.value = []; + loading.value = false; + publicLoading.value = false; +} + export const useHouseholdStore = function (i18n?: Composer) { const api = useUserApi(i18n); return useReadOnlyStore("household", store, loading, api.households); diff --git a/frontend/composables/store/use-label-store.ts b/frontend/composables/store/use-label-store.ts index 53d4843d4..394b17092 100644 --- a/frontend/composables/store/use-label-store.ts +++ b/frontend/composables/store/use-label-store.ts @@ -6,6 +6,11 @@ import { useUserApi } from "~/composables/api"; const store: Ref = ref([]); const loading = ref(false); +export function resetLabelStore() { + store.value = []; + loading.value = false; +} + export const useLabelData = function () { return useData({ groupId: "", diff --git a/frontend/composables/store/use-tag-store.ts b/frontend/composables/store/use-tag-store.ts index 0faa7e8d4..9526184a4 100644 --- a/frontend/composables/store/use-tag-store.ts +++ b/frontend/composables/store/use-tag-store.ts @@ -7,6 +7,12 @@ const store: Ref = ref([]); const loading = ref(false); const publicLoading = ref(false); +export function resetTagStore() { + store.value = []; + loading.value = false; + publicLoading.value = false; +} + export const useTagData = function () { return useData({ id: "", diff --git a/frontend/composables/store/use-tool-store.ts b/frontend/composables/store/use-tool-store.ts index 059a99228..2cd998e65 100644 --- a/frontend/composables/store/use-tool-store.ts +++ b/frontend/composables/store/use-tool-store.ts @@ -11,6 +11,12 @@ const store: Ref = ref([]); const loading = ref(false); const publicLoading = ref(false); +export function resetToolStore() { + store.value = []; + loading.value = false; + publicLoading.value = false; +} + export const useToolData = function () { return useData({ id: "", diff --git a/frontend/composables/store/use-unit-store.ts b/frontend/composables/store/use-unit-store.ts index 5c5dfffad..b66e2e06f 100644 --- a/frontend/composables/store/use-unit-store.ts +++ b/frontend/composables/store/use-unit-store.ts @@ -6,6 +6,11 @@ import { useUserApi } from "~/composables/api"; const store: Ref = ref([]); const loading = ref(false); +export function resetUnitStore() { + store.value = []; + loading.value = false; +} + export const useUnitData = function () { return useData({ id: "", diff --git a/frontend/composables/store/use-user-store.ts b/frontend/composables/store/use-user-store.ts index 03d2a9697..d1440c672 100644 --- a/frontend/composables/store/use-user-store.ts +++ b/frontend/composables/store/use-user-store.ts @@ -7,6 +7,11 @@ import { BaseCRUDAPIReadOnly } from "~/lib/api/base/base-clients"; const store: Ref = ref([]); const loading = ref(false); +export function resetUserStore() { + store.value = []; + loading.value = false; +} + class GroupUserAPIReadOnly extends BaseCRUDAPIReadOnly { baseRoute = "/api/groups/members"; itemRoute = (idOrUsername: string | number) => `/groups/members/${idOrUsername}`; diff --git a/frontend/composables/use-auth-backend.ts b/frontend/composables/use-auth-backend.ts index 1aeb84c19..227d13494 100644 --- a/frontend/composables/use-auth-backend.ts +++ b/frontend/composables/use-auth-backend.ts @@ -1,5 +1,6 @@ import { ref, computed } from "vue"; import type { UserOut } from "~/lib/api/types/user"; +import { clearAllStores } from "~/composables/store"; interface AuthData { value: UserOut | null; @@ -101,6 +102,13 @@ export const useAuthBackend = function (): AuthState { setToken(null); authUser.value = null; authStatus.value = "unauthenticated"; + + // Clear all cached store data to prevent data leakage between users + clearAllStores(); + + // Clear Nuxt's useAsyncData cache + clearNuxtData(); + await router.push(callbackUrl || "/login"); } }