Firestore: enablePersistence() 然后将 redux 与离线数据库一起使用?

Firestore: enablePersistence() and then using redux with offline database?

所以,本质上,我正在使用 Create-React-App,我希望允许用户离线或在线向 redux 添加数据。我也想将 redux 与 Firestore 同步。

在我的主要尝试中,我初始化了我的 firebase 设置:

// ./firebase/firebase.js

var firestoreDatabase;

firebase.initializeApp(config.firebase.config);
firebase.firestore().enablePersistence().then(() => {
  firestoreDatabase = firebase.firestore();
});

export { firebase, firestoreDatabase };

然后,为了确保它已正确触发(这绝对是错误的,但我无法找出捕捉 enablePersistence() return... 的最佳位置):

// src/index.js

import { firebase, firestoreDatabase } from "./firebase/firebase";

firebase.auth().onAuthStateChanged(user => {
  store.dispatch(setReduxData()).then(() => {
  if (firestoreDatabase) {
    ReactDOM.render(application, document.getElementById("root"));
  }
  });
});

动作文件

import { firestoreDatabase } from "../firebase/firebase";

export const setReduxData = () => {
  return (dispatch, getState) => {
    const uid = getState().auth.uid;
    const data = { newData: '123' };

    return firestoreDatabase
      .collection("Users")
      .doc(uid)
      .collection("data")
      .add(data)
      .then(ref => { 
        // so, this never gets fired
        dispatch(
          addData({
            id: ref.id,
            ...data
          })
        );
      })

所以 dispatch 永远不会被触发,但是,当我刷新应用程序时,我输入的数据 { newData: '123' } 会添加到商店中。

我认为我的整个处理方式都是错误的。我不喜欢将 firestoreDatabase 导出为未定义,然后在 enablePersistence() return 时更新它...

我只想 enablePersistence() 一次,然后根据用户是否在线使用缓存或服务器...Redux 应该以相同的方式运行...

欢迎任何想法和反馈!

所以,我想出了如何在我的应用程序中正确加载 Firestore:

在我的 firebase.js 文件中:

import * as firebase from "firebase";
import config from "../config";

// https://firebase.google.com/docs/reference/js/
firebase.initializeApp(config.firebase.config);

const database = firebase.database();
const auth = firebase.auth();
const googleAuthProvider = new firebase.auth.GoogleAuthProvider();

export { firebase, googleAuthProvider, auth, database };

然后,我添加了一个 firestore.js 文件:

import { firebase } from "./firebase";
import "firebase/firestore";
import { notification } from "antd";

firebase.firestore().settings({ timestampsInSnapshots: true });

const handleError = error => {
  if (error === "failed-precondition") {
    notification.open({
      message: "Error",
      description:
        "Multiple tabs open, offline data only works in one tab at a a time."
    });
  } else if (error === "unimplemented") {
    notification.open({
      message: "Error",
      description: "Cannot save offline on this browser."
    });
  }
};

export default firebase
  .firestore()
  .enablePersistence()
  .then(() => firebase.firestore())
  .catch(err => {
    handleError(err.code);
    return firebase.firestore();
  });

然后我在我的操作文件中调用 firestore:

import firestore from "../firebase/firestore";

return firestore
  .then(db => {
    var newData = db
      .collection("Users")
      .doc(uid)
      .collection("userData")
      .doc();
    newData.set(data);
    var id = newData.id;
    dispatch(addData({ id, ...data }));
  })
  .catch(err => {
    // notification
  });

本质上,我将 redux 和 Firestore 分开了,但最终它们是通过 Firestore id 连接的。