مشكلة في firebase لمعرفة حالة online/offline للمستخدمين

فايربيز لا يشرح الطريقة بشكل واضح!
أود معرفة حالة المستخدمين إذا كانو online أو offline
بحسب الdocumentation:
https://firebase.google.com/docs/firestore/solutions/presence

الشرح متداخل ويتحدث بشكل عام ، وانا أستهدف شئ صغير جدا

عملت طباعة للأمر التالي:

console.log(firebase.firestore().doc('/status/' + user.uid)._firestoreClient)

والنتيجة

{…}
​
asyncQueue: Object { tail: Promise { "fulfilled" }, _isShuttingDown: false, operationInProgress: false, … }
​
clientId: "RIHolEwBtzxy9HcrzZqV"
​
credentials: Object { receivedInitialUser: true, tokenCounter: 1, forceRefresh: false, … }
​
databaseInfo: Object { persistenceKey: "[DEFAULT]", host: "firestore.googleapis.com", ssl: true, … }
​
eventMgr: Object { syncEngine: {…}, queries: {…}, onlineState: 1, … }
​
localStore: Object { persistence: {…}, queryEngine: {…}, localViewReferences: {…}, … }
​
persistence: Object { clientId: "RIHolEwBtzxy9HcrzZqV", mutationQueues: {…}, _started: true, … }
​
platform: Object { emptyByteString: "", base64Available: true }
​
remoteStore: Object { localStore: {…}, networkEnabled: true, isPrimary: true, … }
​
sharedClientState: Object { localState: {…}, queryState: {…}, syncEngine: {…}, … }
​
syncEngine: Object { localStore: {…}, remoteStore: {…}, sharedClientState: {…}, … }
​
<prototype>: Object { start: start(), enableNetwork: enableNetwork(), initializePersistence: initializePersistence(), … }
Home.vue:205

3 Likes

معلش ممكن اسال انت كتبت الكود في inspect صح ؟

2 Likes

يس بكل تأكيد

2 Likes

6 posts were split to a new topic: في ماذا يستخدم Firebase؟

الحالة مش property تلاقيها جاهزة في الفايربايس لذا بلزمك تستخدم منطق كما في الـ documentation بحيث يتم إنشاء node في الـ database model هذه ال node بتكون لكل عضو بالـ id تبعة وتحمل تحديث حالته ال status سوا كان اونلاين او بعيد او اوفلاين.

Use Realtime Database to report connection status, then use Cloud Functions to mirror that data into Cloud Firestore.

بتستخدم الـ realtime database علشان تعرف حالة إتصال المستخدم ومن ثم عبر الـ cloud functions راح تستخدم تلك الحالة في الـ firestore كون ان ال could function هي الي بتخليك تنفذ اوامر في الـ Backend بشكل اوتوماتيكي بناء على events محددة بما يحافظ على التزامن بين كل من الـ realtime database و الـ firestore

3 Likes

بعد التطبيق أجد المستخدمين كلهم أونلاين فقط حتى لو عاملين logout، لا أعلم ديناميكية الcashing في السيرفر

كود النود nodejs:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const cors = require('cors')({origin: true});

const firestore = admin.firestore();

exports.onUserStatusChanged = functions.database
  .ref('/status/{userId}') // Reference to the Firebase RealTime database key
  .onUpdate(event => {
    const usersRef = firestore.collection('profiles'); // Create a reference to the Firestore Collection
  
    return event.data.ref.once('value')
      .then(() => snapShot.val())
      .then(status => {
        if (status === 'offline') {
          usersRef
            .doc(event.params.userId)
            .set({
              online: false
            }, { merge: true })
        }
        return 0;
      })
  });

كود الويب:

created () {
      let user = firebase.auth().currentUser
      let vm = this
      if (user) {

        const firestoreDb = firebase.firestore();
        const oldRealTimeDb = firebase.database();

        const usersRef = firestoreDb.collection('profiles'); // Get a reference to the Users collection;
        const onlineRef = oldRealTimeDb.ref('.info/connected'); // Get a reference to the list of connections

        onlineRef.on('value', () => {
          oldRealTimeDb
            .ref(`/status/${user.uid}`)
            .onDisconnect() // Set up the disconnect hook
            .set('offline') // The value to be set for this key when the client disconnects
            .then(() => {
                // Set the Firestore User's online status to true
                usersRef
                  .doc(user.uid)
                  .set({
                    online: true,
                  }, { merge: true})
                  console.log('off')
                  vm.isActive = false
                // Let's also create a key in our real-time database
                // The value is set to 'online'
                oldRealTimeDb.ref(`/status/${user.uid}`).set('online').then(() => {
                  console.log('on')
                  vm.isActive = true
                })
            })
        })

        this.authUser = user
        const allUsers = []
        allUsers.push(user)
        this.currentUser = allUsers
        } else {
          this.authUser = {}
        }
}