import { Subscription } from "rxjs";
import { retryWhen, delay, take } from 'rxjs/operators';
import { WebSocketService, UserService } from '../services';
-import { UserOperation, GetRepliesForm, GetRepliesResponse, SortType, GetSiteResponse } from '../interfaces';
+import { UserOperation, GetRepliesForm, GetRepliesResponse, SortType, GetSiteResponse, Comment} from '../interfaces';
import { msgOp } from '../utils';
import { version } from '../version';
isLoggedIn: boolean;
expanded: boolean;
expandUserDropdown: boolean;
+ replies: Array<Comment>,
unreadCount: number;
siteName: string;
}
emptyState: NavbarState = {
isLoggedIn: (UserService.Instance.user !== undefined),
unreadCount: 0,
+ replies: [],
expanded: false,
expandUserDropdown: false,
siteName: undefined
this.userSub = UserService.Instance.sub.subscribe(user => {
this.state.isLoggedIn = user.user !== undefined;
this.state.unreadCount = user.unreadCount;
+ this.requestNotificationPermission();
this.setState(this.state);
});
() => console.log('complete')
);
+ if (this.state.isLoggedIn) {
+ this.requestNotificationPermission();
+ }
+
WebSocketService.Instance.getSite();
}
return;
} else if (op == UserOperation.GetReplies) {
let res: GetRepliesResponse = msg;
+ if (res.replies.length > 0 && this.state.replies.length > 0 &&
+ (JSON.stringify(this.state.replies) !== JSON.stringify(res.replies))) {
+ this.notify(res.replies);
+ }
+
+ this.state.replies = res.replies;
this.sendRepliesCount(res);
} else if (op == UserOperation.GetSite) {
let res: GetSiteResponse = msg;
sendRepliesCount(res: GetRepliesResponse) {
UserService.Instance.sub.next({user: UserService.Instance.user, unreadCount: res.replies.filter(r => !r.read).length});
}
-}
+ requestNotificationPermission() {
+ if (UserService.Instance.user) {
+ document.addEventListener('DOMContentLoaded', function () {
+ if (!Notification) {
+ alert('Desktop notifications not available in your browser. Try Chromium.');
+ return;
+ }
+
+ if (Notification.permission !== 'granted')
+ Notification.requestPermission();
+ });
+ }
+ }
+
+ notify(replies: Array<Comment>) {
+ let recentReply = replies[0];
+ if (Notification.permission !== 'granted')
+ Notification.requestPermission();
+ else {
+ var notification = new Notification(`${replies.length} Unread Messages`, {
+ icon: `${window.location.protocol}//${window.location.host}/static/assets/apple-touch-icon.png`,
+ body: recentReply.content
+ });
+
+ notification.onclick = () => {
+ this.context.router.history.push(`/post/${recentReply.post_id}/comment/${recentReply.id}`);
+ };
+
+ }
+ }
+}