Socialify

Folder ..

Viewing statusTracker.ts
51 lines (46 loc) • 1.5 KB

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/**
 * Status tracker tracks and updates last seen and online status of current user
 */

import { app } from "../handlers/firebaseHandler";
import { getDatabase, ref, set, onValue, serverTimestamp, onDisconnect } from "firebase/database";
import { getAuth } from "firebase/auth";

const auth = getAuth(app);

export const statusTracker = () => {
    auth.onAuthStateChanged((user) => {
        trackStatus(user?.uid as string);
    });
};

const trackStatus = (user: string) => {
    if (user) {
        const db = getDatabase(app);
        const userStatusRef = ref(db, "userStatus/" + user);
        const connectedRef = ref(db, ".info/connected");
        var isOfflineForDatabase = {
            state: "offline",
            last_changed: serverTimestamp(),
        };
        var isOnlineForDatabase = {
            state: "online",
            last_changed: serverTimestamp(),
        };
        onValue(connectedRef, (snapshot) => {
            if (snapshot.val() == false) {
                set(userStatusRef, isOfflineForDatabase);
                return;
            };
            onDisconnect(userStatusRef).set(isOfflineForDatabase).then(() => {
                set(userStatusRef, isOnlineForDatabase);
            });
    });
    }
};

export const userStatus = (uid: string) => {
    // return status and last seen of user
    const db = getDatabase(app);
    const userStatusRef = ref(db, "userStatus/" + uid);
    onValue(userStatusRef, (snapshot) => {
        if (snapshot.exists()) {
            return snapshot.val();
        }
    });
};