1
+ function rtdb_presence ( ) {
1
2
// [START rtdb_presence]
2
3
// Fetch the current user's ID from Firebase Authentication.
3
4
const uid = firebase . auth ( ) . currentUser . uid ;
@@ -9,14 +10,14 @@ const userStatusDatabaseRef = firebase.database().ref(`/status/${uid}`);
9
10
// We'll create two constants which we will write to
10
11
// the Realtime database when this device is offline
11
12
// or online.
12
- const isOffline = {
13
+ const isOfflineForDatabase = {
13
14
state : "offline" ,
14
- last_seen : firebase . database . ServerValue . TIMESTAMP ,
15
+ last_changed : firebase . database . ServerValue . TIMESTAMP ,
15
16
} ;
16
17
17
- const isOnline = {
18
- state : "offline " ,
19
- last_seen : firebase . database . ServerValue . TIMESTAMP ,
18
+ const isOnlineForDatabase = {
19
+ state : "online " ,
20
+ last_changed : firebase . database . ServerValue . TIMESTAMP ,
20
21
} ;
21
22
22
23
// Create a reference to the special ".info/connected" path in
@@ -32,32 +33,75 @@ firebase.database().ref(".info/connected").on("value", function (snapshot) {
32
33
// method to add a set which will only trigger once this
33
34
// client has disconnected by closing the app,
34
35
// losing internet, or any other means.
35
- userStatusDatabaseRef . onDisconnect ( ) . set ( isOffline ) . then ( function ( ) {
36
+ userStatusDatabaseRef . onDisconnect ( ) . set ( isOfflineForDatabase ) . then ( function ( ) {
36
37
// The promise returned from .onDisconnect().set() will
37
38
// resolve as soon as the server acknowledges the onDisconnect()
38
39
// request, NOT once we've actually disconnected:
39
40
// https://firebase.google.com/docs/reference/js/firebase.database.OnDisconnect
40
41
41
42
// We can now safely set ourselves as "online" knowing that the
42
43
// server will mark us as offline once we lose connection.
43
- userStatusDatabaseRef . set ( isOnline ) ;
44
+ userStatusDatabaseRef . set ( isOnlineForDatabase ) ;
44
45
} ) ;
45
46
} ) ;
46
47
// [END rtdb_presence]
48
+ }
47
49
50
+ function rtdb_and_local_fs_presence ( ) {
48
51
// [START rtdb_and_local_fs_presence]
49
- [ START_EXCLUDE ]
50
- [ END_EXCLUDE ]
52
+ // [START_EXCLUDE]
53
+ const uid = firebase . auth ( ) . currentUser . uid ;
51
54
const userStatusDatabaseRef = firebase . database ( ) . ref ( `/status/${ uid } ` ) ;
55
+
56
+ const isOfflineForDatabase = {
57
+ state : "offline" ,
58
+ last_changed : firebase . database . ServerValue . TIMESTAMP ,
59
+ } ;
60
+
61
+ const isOnlineForDatabase = {
62
+ state : "online" ,
63
+ last_changed : firebase . database . ServerValue . TIMESTAMP ,
64
+ } ;
65
+
66
+ // [END_EXCLUDE]
52
67
const userStatusFirestoreRef = firebase . firestore ( ) . doc ( `/status/${ uid } ` ) ;
53
68
69
+ // Firestore uses a different server timestamp value, so we'll
70
+ // create two more constants for Firestore state.
71
+ const isOfflineForFirestore = {
72
+ state : "offline" ,
73
+ last_changed : firebase . firestore . FieldValue . serverTimestamp ( ) ,
74
+ } ;
75
+
76
+ const isOnlineForFirestore = {
77
+ state : "online" ,
78
+ last_changed : firebase . firestore . FieldValue . serverTimestamp ( ) ,
79
+ } ;
80
+
54
81
firebase . database ( ) . ref ( ".info/connected" ) . on ( "value" , function ( snapshot ) {
55
82
if ( snapshot . val ( ) == false ) {
83
+ // Instead of simply returning, we'll also set Firestore's state
84
+ // to "offline". This ensures that our Firestore cache is aware
85
+ // of the switch to "offline."
86
+ userStatusFirestoreRef . set ( isOfflineForFirestore ) ;
56
87
return ;
57
88
} ;
58
89
59
- userStatusRef . onDisconnect ( ) . set ( isOffline ) . then ( function ( ) {
60
- userStatusRef . set ( isOnline ) ;
90
+ userStatusDatabaseRef . onDisconnect ( ) . set ( isOfflineForDatabase ) . then ( function ( ) {
91
+ userStatusDatabaseRef . set ( isOnlineForDatabase ) ;
92
+
93
+ // We'll also add Firestore set here for when we come online.
94
+ userStatusFirestoreRef . set ( isOnlineForFirestore ) ;
61
95
} ) ;
62
96
} ) ;
63
97
// [END rtdb_and_local_fs_presence]
98
+ }
99
+
100
+ function fs_listen ( ) {
101
+ // [START fs_onsnapshot]
102
+ userStatusFirestoreRef . onSnapshot ( function ( doc ) {
103
+ const isOnline = doc . data ( ) . state == "online" ;
104
+ // ... use isOnline
105
+ } ) ;
106
+ // [END fs_onsnapshot]
107
+ }
0 commit comments