55 lines
1.7 KiB
TypeScript
55 lines
1.7 KiB
TypeScript
import { initializeApp, getApps, getApp } from 'firebase/app'
|
|
import { getStorage } from 'firebase/storage'
|
|
import { FIREBASE_CONFIG } from 'common/envs/constants'
|
|
import {
|
|
connectFirestoreEmulator,
|
|
initializeFirestore,
|
|
} from 'firebase/firestore'
|
|
import { connectFunctionsEmulator, getFunctions } from 'firebase/functions'
|
|
|
|
// Initialize Firebase
|
|
export const app = getApps().length ? getApp() : initializeApp(FIREBASE_CONFIG)
|
|
|
|
function iOS() {
|
|
if (typeof navigator === 'undefined') {
|
|
// We're on the server, proceed normally
|
|
return false
|
|
}
|
|
return (
|
|
[
|
|
'iPad Simulator',
|
|
'iPhone Simulator',
|
|
'iPod Simulator',
|
|
'iPad',
|
|
'iPhone',
|
|
'iPod',
|
|
].includes(navigator.platform) ||
|
|
// iPad on iOS 13 detection
|
|
(navigator.userAgent.includes('Mac') && 'ontouchend' in document)
|
|
)
|
|
}
|
|
// Long polling is necessary for ios, see: https://github.com/firebase/firebase-js-sdk/issues/6118
|
|
const opts = iOS() ? { experimentalForceLongPolling: true } : {}
|
|
export const db = initializeFirestore(app, opts)
|
|
|
|
export const functions = getFunctions()
|
|
export const storage = getStorage()
|
|
|
|
declare global {
|
|
/* eslint-disable-next-line no-var */
|
|
var EMULATORS_STARTED: boolean
|
|
}
|
|
|
|
function startEmulators() {
|
|
// I don't like this but this is the only way to reconnect to the emulators without error, see: https://stackoverflow.com/questions/65066963/firebase-firestore-emulator-error-host-has-been-set-in-both-settings-and-usee
|
|
if (!global.EMULATORS_STARTED) {
|
|
global.EMULATORS_STARTED = true
|
|
connectFirestoreEmulator(db, 'localhost', 8080)
|
|
connectFunctionsEmulator(functions, 'localhost', 5001)
|
|
}
|
|
}
|
|
|
|
if (process.env.NEXT_PUBLIC_FIREBASE_EMULATE) {
|
|
startEmulators()
|
|
}
|