From 273a38f61f03b4e1316ff2a0a75607dc77aaaf44 Mon Sep 17 00:00:00 2001
From: Dessalines <tyhou13@gmx.com>
Date: Sun, 21 Apr 2019 10:49:57 -0700
Subject: Adding a recurring inbox fetch.

- Fixes #94
---
 ui/src/components/navbar.tsx | 58 +++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 55 insertions(+), 3 deletions(-)

(limited to 'ui/src/components/navbar.tsx')

diff --git a/ui/src/components/navbar.tsx b/ui/src/components/navbar.tsx
index 67a9866a..33a33025 100644
--- a/ui/src/components/navbar.tsx
+++ b/ui/src/components/navbar.tsx
@@ -1,6 +1,10 @@
 import { Component, linkEvent } from 'inferno';
 import { Link } from 'inferno-router';
-import { UserService } from '../services';
+import { Subscription } from "rxjs";
+import { retryWhen, delay, take } from 'rxjs/operators';
+import { WebSocketService, UserService } from '../services';
+import { UserOperation, GetRepliesForm, GetRepliesResponse, SortType } from '../interfaces';
+import { msgOp } from '../utils';
 import { version } from '../version';
 
 interface NavbarState {
@@ -11,7 +15,8 @@ interface NavbarState {
 }
 
 export class Navbar extends Component<any, NavbarState> {
-
+  private wsSub: Subscription;
+  private userSub: Subscription;
   emptyState: NavbarState = {
     isLoggedIn: (UserService.Instance.user !== undefined),
     unreadCount: 0,
@@ -24,12 +29,22 @@ export class Navbar extends Component<any, NavbarState> {
     this.state = this.emptyState;
     this.handleOverviewClick = this.handleOverviewClick.bind(this);
 
+    this.keepFetchingReplies();
+
     // Subscribe to user changes
-    UserService.Instance.sub.subscribe(user => {
+    this.userSub = UserService.Instance.sub.subscribe(user => {
       this.state.isLoggedIn = user.user !== undefined;
       this.state.unreadCount = user.unreadCount;
       this.setState(this.state);
     });
+
+    this.wsSub = WebSocketService.Instance.subject
+    .pipe(retryWhen(errors => errors.pipe(delay(3000), take(10))))
+    .subscribe(
+      (msg) => this.parseMessage(msg),
+        (err) => console.error(err),
+        () => console.log('complete')
+    );
   }
 
   render() {
@@ -38,6 +53,11 @@ export class Navbar extends Component<any, NavbarState> {
     )
   }
 
+  componentWillUnmount() {
+    this.wsSub.unsubscribe();
+    this.userSub.unsubscribe();
+  }
+
   // TODO class active corresponding to current page
   // TODO toggle css collapse
   navbar() {
@@ -117,5 +137,37 @@ export class Navbar extends Component<any, NavbarState> {
     i.state.expanded = !i.state.expanded;
     i.setState(i.state);
   }
+
+  parseMessage(msg: any) {
+    let op: UserOperation = msgOp(msg);
+    if (msg.error) {
+      alert(msg.error);
+      return;
+    } else if (op == UserOperation.GetReplies) {
+      let res: GetRepliesResponse = msg;
+      this.sendRepliesCount(res);
+    } 
+  }
+
+  keepFetchingReplies() {
+    this.fetchReplies();
+    setInterval(() => this.fetchReplies(), 30000);
+  }
+
+  fetchReplies() {
+    if (this.state.isLoggedIn) {
+      let repliesForm: GetRepliesForm = {
+        sort: SortType[SortType.New],
+        unread_only: true,
+        page: 1,
+        limit: 9999,
+      };
+      WebSocketService.Instance.getReplies(repliesForm);
+    }
+  }
+
+  sendRepliesCount(res: GetRepliesResponse) {
+    UserService.Instance.sub.next({user: UserService.Instance.user, unreadCount: res.replies.filter(r => !r.read).length});
+  }
 }
 
-- 
cgit v1.2.3

