diff --git a/src/main.ts b/src/main.ts index 267de4f44..b15d4067f 100644 --- a/src/main.ts +++ b/src/main.ts @@ -2,11 +2,6 @@ import { definePreset } from '@primevue/themes' import Aura from '@primevue/themes/aura' import * as Sentry from '@sentry/vue' import { initializeApp } from 'firebase/app' -import { - browserLocalPersistence, - browserSessionPersistence, - indexedDBLocalPersistence -} from 'firebase/auth' import { createPinia } from 'pinia' import 'primeicons/primeicons.css' import PrimeVue from 'primevue/config' @@ -14,7 +9,7 @@ import ConfirmationService from 'primevue/confirmationservice' import ToastService from 'primevue/toastservice' import Tooltip from 'primevue/tooltip' import { createApp } from 'vue' -import { VueFire, VueFireAuthWithDependencies } from 'vuefire' +import { VueFire, VueFireAuth } from 'vuefire' import { FIREBASE_CONFIG } from '@/config/firebase' import '@/lib/litegraph/public/css/litegraph.css' @@ -71,18 +66,6 @@ app .use(i18n) .use(VueFire, { firebaseApp, - modules: [ - // Configure Firebase Auth persistence: localStorage first, IndexedDB last. - // Localstorage is preferred to IndexedDB for mobile Safari compatibility. - VueFireAuthWithDependencies({ - dependencies: { - persistence: [ - browserLocalPersistence, - browserSessionPersistence, - indexedDBLocalPersistence - ] - } - }) - ] + modules: [VueFireAuth()] }) .mount('#vue-app') diff --git a/src/stores/firebaseAuthStore.ts b/src/stores/firebaseAuthStore.ts index 6e4974839..698efff3e 100644 --- a/src/stores/firebaseAuthStore.ts +++ b/src/stores/firebaseAuthStore.ts @@ -6,10 +6,12 @@ import { GoogleAuthProvider, type User, type UserCredential, + browserLocalPersistence, createUserWithEmailAndPassword, deleteUser, onAuthStateChanged, sendPasswordResetEmail, + setPersistence, signInWithEmailAndPassword, signInWithPopup, signOut, @@ -80,6 +82,8 @@ export const useFirebaseAuthStore = defineStore('firebaseAuth', () => { // Retrieves the Firebase Auth instance. Returns `null` on the server. // When using this function on the client in TypeScript, you can force the type with `useFirebaseAuth()!`. const auth = useFirebaseAuth()! + // Set persistence to localStorage (works in both browser and Electron) + void setPersistence(auth, browserLocalPersistence) onAuthStateChanged(auth, (user) => { currentUser.value = user diff --git a/tests-ui/tests/store/firebaseAuthStore.test.ts b/tests-ui/tests/store/firebaseAuthStore.test.ts index ef8ffe0bd..d37c3857a 100644 --- a/tests-ui/tests/store/firebaseAuthStore.test.ts +++ b/tests-ui/tests/store/firebaseAuthStore.test.ts @@ -150,6 +150,13 @@ describe('useFirebaseAuthStore', () => { expect(store.loading).toBe(false) }) + it('should set persistence to local storage on initialization', () => { + expect(firebaseAuth.setPersistence).toHaveBeenCalledWith( + mockAuth, + firebaseAuth.browserLocalPersistence + ) + }) + it('should properly clean up error state between operations', async () => { // First, cause an error const mockError = new Error('Invalid password')