85 lines
2.2 KiB
TypeScript
85 lines
2.2 KiB
TypeScript
import firebase from "firebase/app"
|
|
import "firebase/firestore"
|
|
import { currentUser$ } from "./auth"
|
|
import {
|
|
Environment,
|
|
environments$,
|
|
replaceEnvironments,
|
|
} from "~/newstore/environments"
|
|
import { settingsStore } from "~/newstore/settings"
|
|
|
|
/**
|
|
* Used locally to prevent infinite loop when environment sync update
|
|
* is applied to the store which then fires the store sync listener.
|
|
* When you want to update environments and not want to fire the update listener,
|
|
* set this to true and then set it back to false once it is done
|
|
*/
|
|
let loadedEnvironments = false
|
|
|
|
async function writeEnvironments(environment: Environment[]) {
|
|
if (currentUser$.value == null)
|
|
throw new Error("Cannot write environments when signed out")
|
|
|
|
const ev = {
|
|
updatedOn: new Date(),
|
|
author: currentUser$.value.uid,
|
|
author_name: currentUser$.value.displayName,
|
|
author_image: currentUser$.value.photoURL,
|
|
environment,
|
|
}
|
|
|
|
try {
|
|
await firebase
|
|
.firestore()
|
|
.collection("users")
|
|
.doc(currentUser$.value.uid)
|
|
.collection("environments")
|
|
.doc("sync")
|
|
.set(ev)
|
|
} catch (e) {
|
|
console.error("error updating", ev, e)
|
|
throw e
|
|
}
|
|
}
|
|
|
|
export function initEnvironments() {
|
|
environments$.subscribe((envs) => {
|
|
if (
|
|
currentUser$.value &&
|
|
settingsStore.value.syncEnvironments &&
|
|
loadedEnvironments
|
|
) {
|
|
writeEnvironments(envs)
|
|
}
|
|
})
|
|
|
|
let snapshotStop: (() => void) | null = null
|
|
|
|
currentUser$.subscribe((user) => {
|
|
if (!user && snapshotStop) {
|
|
// User logged out, clean up snapshot listener
|
|
snapshotStop()
|
|
snapshotStop = null
|
|
} else if (user) {
|
|
snapshotStop = firebase
|
|
.firestore()
|
|
.collection("users")
|
|
.doc(user.uid)
|
|
.collection("environments")
|
|
.onSnapshot((environmentsRef) => {
|
|
const environments: any[] = []
|
|
|
|
environmentsRef.forEach((doc) => {
|
|
const environment = doc.data()
|
|
environment.id = doc.id
|
|
environments.push(environment)
|
|
})
|
|
|
|
loadedEnvironments = false
|
|
replaceEnvironments(environments[0].environment)
|
|
loadedEnvironments = true
|
|
})
|
|
}
|
|
})
|
|
}
|