From 682413613e75618489d262bd033c3101da96abd7 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Sat, 20 Apr 2019 11:17:00 -0700 Subject: Mostly working, before merge --- ui/src/components/inbox.tsx | 177 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 ui/src/components/inbox.tsx (limited to 'ui/src/components/inbox.tsx') diff --git a/ui/src/components/inbox.tsx b/ui/src/components/inbox.tsx new file mode 100644 index 00000000..e6ce6d13 --- /dev/null +++ b/ui/src/components/inbox.tsx @@ -0,0 +1,177 @@ +import { Component, linkEvent } from 'inferno'; +import { Link } from 'inferno-router'; +import { Subscription } from "rxjs"; +import { retryWhen, delay, take } from 'rxjs/operators'; +import { UserOperation, Comment, SortType, GetRepliesForm, GetRepliesResponse, CommentResponse } from '../interfaces'; +import { WebSocketService, UserService } from '../services'; +import { msgOp } from '../utils'; +import { CommentNodes } from './comment-nodes'; + +enum UnreadType { + Unread, All +} + +interface InboxState { + unreadType: UnreadType; + replies: Array; + sort: SortType; + page: number; +} + +export class Inbox extends Component { + + private subscription: Subscription; + private emptyState: InboxState = { + unreadType: UnreadType.Unread, + replies: [], + sort: SortType.New, + page: 1, + } + + constructor(props: any, context: any) { + super(props, context); + + this.state = this.emptyState; + + this.subscription = WebSocketService.Instance.subject + .pipe(retryWhen(errors => errors.pipe(delay(3000), take(10)))) + .subscribe( + (msg) => this.parseMessage(msg), + (err) => console.error(err), + () => console.log('complete') + ); + + this.refetch(); + } + + componentWillUnmount() { + this.subscription.unsubscribe(); + } + + render() { + let user = UserService.Instance.user; + return ( +
+
+
+
Inbox for {user.username}
+ {this.selects()} + {this.replies()} + {this.paginator()} +
+
+
+ ) + } + + selects() { + return ( +
+ + +
+ ) + + } + + replies() { + return ( +
+ {this.state.replies.map(reply => + + )} +
+ ); + } + + paginator() { + return ( +
+ {this.state.page > 1 && + + } + +
+ ); + } + + nextPage(i: Inbox) { + i.state.page++; + i.setState(i.state); + i.refetch(); + } + + prevPage(i: Inbox) { + i.state.page--; + i.setState(i.state); + i.refetch(); + } + + handleUnreadTypeChange(i: Inbox, event: any) { + i.state.unreadType = Number(event.target.value); + i.state.page = 1; + i.setState(i.state); + i.refetch(); + } + + refetch() { + let form: GetRepliesForm = { + sort: SortType[this.state.sort], + unread_only: (this.state.unreadType == UnreadType.Unread), + page: this.state.page, + limit: 9999, + }; + WebSocketService.Instance.getReplies(form); + } + + handleSortChange(i: Inbox, event: any) { + i.state.sort = Number(event.target.value); + i.state.page = 1; + i.setState(i.state); + i.refetch(); + } + + parseMessage(msg: any) { + console.log(msg); + let op: UserOperation = msgOp(msg); + if (msg.error) { + alert(msg.error); + return; + } else if (op == UserOperation.GetReplies) { + let res: GetRepliesResponse = msg; + this.state.replies = res.replies; + this.sendRepliesCount(); + this.setState(this.state); + } else if (op == UserOperation.EditComment) { + let res: CommentResponse = msg; + + // If youre in the unread view, just remove it from the list + if (this.state.unreadType == UnreadType.Unread && res.comment.read) { + this.state.replies = this.state.replies.filter(r => r.id !== res.comment.id); + } else { + let found = this.state.replies.find(c => c.id == res.comment.id); + found.read = res.comment.read; + } + + this.sendRepliesCount(); + this.setState(this.state); + } + } + + sendRepliesCount() { + UserService.Instance.sub.next({user: UserService.Instance.user, unreadCount: this.state.replies.filter(r => !r.read).length}); + } +} + -- cgit v1.2.3