// Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/ import { createPinia, type Pinia } from 'pinia' import type { UsedStore } from '#shared/types/store.ts' import type { App } from 'vue' declare module 'pinia' { // eslint-disable-next-line @typescript-eslint/no-unused-vars export interface DefineStoreOptionsBase<S, Store> { requiresAuth?: boolean } } const usedStores = new Set<UsedStore>() const pinia: Pinia = createPinia() // Remember all stores, for example to cleanup the private stores after logout. pinia.use((context) => { usedStores.add({ store: context.store, requiresAuth: context.options.requiresAuth ?? true, }) }) export default function initializeStore(app: App) { app.use(pinia) } export const resetAndDisposeStores = (requiresAuth?: boolean) => { usedStores.forEach((usedStore) => { if (requiresAuth !== undefined && usedStore.requiresAuth !== requiresAuth) { return } usedStore.store.$dispose() delete pinia.state.value[usedStore.store.$id] usedStores.delete(usedStore) }) } export { pinia }