diff --git a/src/main.ts b/src/main.ts index b15d4067f..267de4f44 100644 --- a/src/main.ts +++ b/src/main.ts @@ -2,6 +2,11 @@ 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' @@ -9,7 +14,7 @@ import ConfirmationService from 'primevue/confirmationservice' import ToastService from 'primevue/toastservice' import Tooltip from 'primevue/tooltip' import { createApp } from 'vue' -import { VueFire, VueFireAuth } from 'vuefire' +import { VueFire, VueFireAuthWithDependencies } from 'vuefire' import { FIREBASE_CONFIG } from '@/config/firebase' import '@/lib/litegraph/public/css/litegraph.css' @@ -66,6 +71,18 @@ app .use(i18n) .use(VueFire, { firebaseApp, - modules: [VueFireAuth()] + modules: [ + // Configure Firebase Auth persistence: localStorage first, IndexedDB last. + // Localstorage is preferred to IndexedDB for mobile Safari compatibility. + VueFireAuthWithDependencies({ + dependencies: { + persistence: [ + browserLocalPersistence, + browserSessionPersistence, + indexedDBLocalPersistence + ] + } + }) + ] }) .mount('#vue-app') diff --git a/src/stores/firebaseAuthStore.ts b/src/stores/firebaseAuthStore.ts index 8225b1f33..f2c75417c 100644 --- a/src/stores/firebaseAuthStore.ts +++ b/src/stores/firebaseAuthStore.ts @@ -6,12 +6,10 @@ import { GoogleAuthProvider, type User, type UserCredential, - browserLocalPersistence, createUserWithEmailAndPassword, deleteUser, onAuthStateChanged, sendPasswordResetEmail, - setPersistence, signInWithEmailAndPassword, signInWithPopup, signOut, @@ -80,8 +78,6 @@ 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 ffe7a8d99..fee66d3f7 100644 --- a/tests-ui/tests/store/firebaseAuthStore.test.ts +++ b/tests-ui/tests/store/firebaseAuthStore.test.ts @@ -148,13 +148,6 @@ 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')