Мой вопрос не в том, как заставить это работать, а в том, как сделать это правильно ... Я экспериментирую с RxJS и пока не уверен, каков наилучший подход для этого конкретного варианта использования.
Этот подход был вдохновлен примером репозитория, опубликованным командой Firebase: rxfire-samples - response
Моя цель состоит в том, чтобы использовать firebase в приложении реакции, лениво загруженный с WebPack вместе с RxJS, и я планирую добавить в конце наблюдаемую при помощи редукса.
В данный момент я загружаю FireBase следующим образом:
import { from, forkJoin, AsyncSubject } from 'rxjs'
import { tap, map } from 'rxjs/operators'
import { authListener } from '../auth/listener'
const CONFIG = {
...
}
const lazyLoadFireBase = (config) => {
const app$ = from(import('firebase/app'))
const firestore$ = from(import('firebase/firestore'))
const fireAuth$ = from(import('firebase/auth'))
return forkJoin(app$, firestore$, fireAuth$).pipe(
map(([firebase]) => {
const app = firebase.initializeApp(config)
app.firestore().settings({ timestampsInSnapshots: true })
app.firestore().enablePersistence()
return app
})
)
}
const firebaseApp = new AsyncSubject()
lazyLoadFireBase(CONFIG)
.pipe(
tap((app) => {
authListener(app)
})
)
.subscribe((app) => firebaseApp.next(app))
export { firebaseApp }
И если я хочу использовать firebase, я делаю что-то вроде этого, но похоже, что это неправильный подход. Мне интересно, что было бы лучшим способом поделиться лениво загруженным пакетом Firebase по всему проекту.
import { firebaseApp } from '../../../store/firebase'
const logOut = (ev) => {
ev.preventDefault()
firebaseApp.subscribe((app) => {
app.auth().signOut()
})
}
Реализованные изменения, предложенные @ggradnig:
import { from, forkJoin, ReplaySubject } from 'rxjs'
import { tap, map } from 'rxjs/operators'
import { authListener } from '../auth/listener'
const CONFIG = {
}
const lazyLoadFireBase = (config) => {
const app$ = from(import('firebase/app'))
const firestore$ = from(import('firebase/firestore'))
const fireAuth$ = from(import('firebase/auth'))
return forkJoin(app$, firestore$, fireAuth$).pipe(
map(([firebase]) => {
const app = firebase.initializeApp(config)
app.firestore().settings({ timestampsInSnapshots: true })
app.firestore().enablePersistence()
return app
})
)
}
const firebaseApp = new ReplaySubject(1)
lazyLoadFireBase(CONFIG)
.pipe(
tap((app) => {
authListener(app)
})
)
.subscribe((app) => firebaseApp.next(app))
firebaseApp.asObservable()
export { firebaseApp }