123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- import {
- collection,
- doc,
- getFirestore,
- onSnapshot,
- setDoc,
- } from "@firebase/firestore"
- import { currentUser$ } from "./auth"
- import { applySetting, settingsStore, SettingsType } from "~/newstore/settings"
- /**
- * Used locally to prevent infinite loop when settings sync update
- * is applied to the store which then fires the store sync listener.
- * When you want to update settings and not want to fire the update listener,
- * set this to true and then set it back to false once it is done
- */
- let loadedSettings = false
- /**
- * Write Transform
- */
- async function writeSettings(setting: string, value: any) {
- if (currentUser$.value === null)
- throw new Error("Cannot write setting, user not signed in")
- const st = {
- updatedOn: new Date(),
- author: currentUser$.value.uid,
- author_name: currentUser$.value.displayName,
- author_image: currentUser$.value.photoURL,
- name: setting,
- value,
- }
- try {
- await setDoc(
- doc(getFirestore(), "users", currentUser$.value.uid, "settings", setting),
- st
- )
- } catch (e) {
- console.error("error updating", st, e)
- throw e
- }
- }
- export function initSettings() {
- settingsStore.dispatches$.subscribe((dispatch) => {
- if (currentUser$.value && loadedSettings) {
- if (dispatch.dispatcher === "bulkApplySettings") {
- Object.keys(dispatch.payload).forEach((key) => {
- writeSettings(key, dispatch.payload[key])
- })
- } else {
- writeSettings(
- dispatch.payload.settingKey,
- settingsStore.value[dispatch.payload.settingKey as keyof SettingsType]
- )
- }
- }
- })
- let snapshotStop: (() => void) | null = null
- // Subscribe and unsubscribe event listeners
- currentUser$.subscribe((user) => {
- if (!user && snapshotStop) {
- // User logged out
- snapshotStop()
- snapshotStop = null
- } else if (user) {
- snapshotStop = onSnapshot(
- collection(getFirestore(), "users", user.uid, "settings"),
- (settingsRef) => {
- const settings: any[] = []
- settingsRef.forEach((doc) => {
- const setting = doc.data()
- setting.id = doc.id
- settings.push(setting)
- })
- loadedSettings = false
- settings.forEach((e) => {
- if (e && e.name && e.value != null) {
- applySetting(e.name, e.value)
- }
- })
- loadedSettings = true
- }
- )
- }
- })
- }
|