Mostly done eliminating recurring fetches.

This commit is contained in:
Dessalines 2020-01-31 22:34:08 -05:00
parent 8036474dda
commit 8ec104cb76
5 changed files with 54 additions and 33 deletions

View file

@ -94,12 +94,6 @@ pub struct ChatServer {
db: Pool<ConnectionManager<PgConnection>>, db: Pool<ConnectionManager<PgConnection>>,
} }
// TODO show online users for communities too
// TODO GetPosts is the community / front page join.
// What is sent: New posts, post edits, post removes, post likes, community edits, community mod adds. Notifs for new posts?
// GetPost is the PostJoin, LeavePost is the leave
// What is sent: New comments, comment edits, comment likes
// UserJoin is the user join, a disconnect should remove you from all the scopes
impl ChatServer { impl ChatServer {
pub fn startup(db: Pool<ConnectionManager<PgConnection>>) -> ChatServer { pub fn startup(db: Pool<ConnectionManager<PgConnection>>) -> ChatServer {
ChatServer { ChatServer {
@ -501,7 +495,7 @@ fn parse_json_message(chat: &mut ChatServer, msg: StandardMessage) -> Result<Str
let res_str = to_json_string(&user_operation, &res)?; let res_str = to_json_string(&user_operation, &res)?;
// Don't send my data with it // Don't send my data with it
let mut post_sent = res.clone(); let mut post_sent = res;
post_sent.post.my_vote = None; post_sent.post.my_vote = None;
post_sent.post.user_id = None; post_sent.post.user_id = None;
let post_sent_str = to_json_string(&user_operation, &post_sent)?; let post_sent_str = to_json_string(&user_operation, &post_sent)?;
@ -549,7 +543,7 @@ fn parse_json_message(chat: &mut ChatServer, msg: StandardMessage) -> Result<Str
let res_str = to_json_string(&user_operation, &res)?; let res_str = to_json_string(&user_operation, &res)?;
// Don't send my data with it // Don't send my data with it
let mut post_sent = res.clone(); let mut post_sent = res;
post_sent.post.my_vote = None; post_sent.post.my_vote = None;
post_sent.post.user_id = None; post_sent.post.user_id = None;
let post_sent_str = to_json_string(&user_operation, &post_sent)?; let post_sent_str = to_json_string(&user_operation, &post_sent)?;

View file

@ -43,7 +43,6 @@ interface State {
export class Community extends Component<any, State> { export class Community extends Component<any, State> {
private subscription: Subscription; private subscription: Subscription;
private postFetcher: any;
private emptyState: State = { private emptyState: State = {
community: { community: {
id: null, id: null,
@ -107,7 +106,6 @@ export class Community extends Component<any, State> {
componentWillUnmount() { componentWillUnmount() {
this.subscription.unsubscribe(); this.subscription.unsubscribe();
clearInterval(this.postFetcher);
} }
// Necessary for back button for some reason // Necessary for back button for some reason

View file

@ -421,11 +421,25 @@ export class Inbox extends Component<any, InboxState> {
this.sendUnreadCount(); this.sendUnreadCount();
this.setState(this.state); this.setState(this.state);
} else if (res.op == UserOperation.CreateComment) { } else if (res.op == UserOperation.CreateComment) {
// let res: CommentResponse = msg; let data = res.data as CommentResponse;
// TODO gotta remove this
if (data.recipient_ids.includes(UserService.Instance.user.id)) {
this.state.replies.unshift(data.comment);
this.setState(this.state);
} else if (data.comment.creator_id == UserService.Instance.user.id) {
toast(i18n.t('reply_sent')); toast(i18n.t('reply_sent'));
// this.state.replies.unshift(res.comment); // TODO do this right }
// this.setState(this.state); this.setState(this.state);
} else if (res.op == UserOperation.CreatePrivateMessage) {
let data = res.data as PrivateMessageResponse;
if (data.message.recipient_id == UserService.Instance.user.id) {
this.state.messages.unshift(data.message);
this.setState(this.state);
} else if (data.message.creator_id == UserService.Instance.user.id) {
toast(i18n.t('message_sent'));
}
this.setState(this.state);
} else if (res.op == UserOperation.SaveComment) { } else if (res.op == UserOperation.SaveComment) {
let data = res.data as CommentResponse; let data = res.data as CommentResponse;
let found = this.state.replies.find(c => c.id == data.comment.id); let found = this.state.replies.find(c => c.id == data.comment.id);

View file

@ -306,6 +306,7 @@ export class Login extends Component<any, State> {
this.state = this.emptyState; this.state = this.emptyState;
this.setState(this.state); this.setState(this.state);
UserService.Instance.login(data); UserService.Instance.login(data);
WebSocketService.Instance.userJoin();
toast(i18n.t('logged_in')); toast(i18n.t('logged_in'));
this.props.history.push('/'); this.props.history.push('/');
} else if (res.op == UserOperation.Register) { } else if (res.op == UserOperation.Register) {
@ -313,6 +314,7 @@ export class Login extends Component<any, State> {
this.state = this.emptyState; this.state = this.emptyState;
this.setState(this.state); this.setState(this.state);
UserService.Instance.login(data); UserService.Instance.login(data);
WebSocketService.Instance.userJoin();
this.props.history.push('/communities'); this.props.history.push('/communities');
} else if (res.op == UserOperation.PasswordReset) { } else if (res.op == UserOperation.PasswordReset) {
toast(i18n.t('reset_password_mail_sent')); toast(i18n.t('reset_password_mail_sent'));

View file

@ -16,6 +16,7 @@ import {
Comment, Comment,
CommentResponse, CommentResponse,
PrivateMessage, PrivateMessage,
PrivateMessageResponse,
WebSocketJsonResponse, WebSocketJsonResponse,
} from '../interfaces'; } from '../interfaces';
import { import {
@ -36,7 +37,6 @@ interface NavbarState {
replies: Array<Comment>; replies: Array<Comment>;
mentions: Array<Comment>; mentions: Array<Comment>;
messages: Array<PrivateMessage>; messages: Array<PrivateMessage>;
fetchCount: number;
unreadCount: number; unreadCount: number;
siteName: string; siteName: string;
} }
@ -47,7 +47,6 @@ export class Navbar extends Component<any, NavbarState> {
emptyState: NavbarState = { emptyState: NavbarState = {
isLoggedIn: UserService.Instance.user !== undefined, isLoggedIn: UserService.Instance.user !== undefined,
unreadCount: 0, unreadCount: 0,
fetchCount: 0,
replies: [], replies: [],
mentions: [], mentions: [],
messages: [], messages: [],
@ -59,8 +58,6 @@ export class Navbar extends Component<any, NavbarState> {
super(props, context); super(props, context);
this.state = this.emptyState; this.state = this.emptyState;
this.fetchUnreads();
// Subscribe to user changes // Subscribe to user changes
this.userSub = UserService.Instance.sub.subscribe(user => { this.userSub = UserService.Instance.sub.subscribe(user => {
this.state.isLoggedIn = user.user !== undefined; this.state.isLoggedIn = user.user !== undefined;
@ -79,6 +76,8 @@ export class Navbar extends Component<any, NavbarState> {
if (this.state.isLoggedIn) { if (this.state.isLoggedIn) {
this.requestNotificationPermission(); this.requestNotificationPermission();
// TODO couldn't get re-logging in to re-fetch unreads
this.fetchUnreads();
} }
WebSocketService.Instance.getSite(); WebSocketService.Instance.getSite();
@ -214,6 +213,7 @@ export class Navbar extends Component<any, NavbarState> {
let unreadReplies = data.replies.filter(r => !r.read); let unreadReplies = data.replies.filter(r => !r.read);
this.state.replies = unreadReplies; this.state.replies = unreadReplies;
this.state.unreadCount = this.calculateUnreadCount();
this.setState(this.state); this.setState(this.state);
this.sendUnreadCount(); this.sendUnreadCount();
} else if (res.op == UserOperation.GetUserMentions) { } else if (res.op == UserOperation.GetUserMentions) {
@ -221,6 +221,7 @@ export class Navbar extends Component<any, NavbarState> {
let unreadMentions = data.mentions.filter(r => !r.read); let unreadMentions = data.mentions.filter(r => !r.read);
this.state.mentions = unreadMentions; this.state.mentions = unreadMentions;
this.state.unreadCount = this.calculateUnreadCount();
this.setState(this.state); this.setState(this.state);
this.sendUnreadCount(); this.sendUnreadCount();
} else if (res.op == UserOperation.GetPrivateMessages) { } else if (res.op == UserOperation.GetPrivateMessages) {
@ -228,17 +229,33 @@ export class Navbar extends Component<any, NavbarState> {
let unreadMessages = data.messages.filter(r => !r.read); let unreadMessages = data.messages.filter(r => !r.read);
this.state.messages = unreadMessages; this.state.messages = unreadMessages;
this.state.unreadCount = this.calculateUnreadCount();
this.setState(this.state); this.setState(this.state);
this.sendUnreadCount(); this.sendUnreadCount();
} else if (res.op == UserOperation.CreateComment) { } else if (res.op == UserOperation.CreateComment) {
// TODO do private messages too
let data = res.data as CommentResponse; let data = res.data as CommentResponse;
if (UserService.Instance.user) { if (this.state.isLoggedIn) {
if (data.recipient_ids.includes(UserService.Instance.user.id)) { if (data.recipient_ids.includes(UserService.Instance.user.id)) {
this.state.replies.push(data.comment);
this.state.unreadCount++;
this.setState(this.state);
this.sendUnreadCount();
this.notify(data.comment); this.notify(data.comment);
} }
} }
} else if (res.op == UserOperation.CreatePrivateMessage) {
let data = res.data as PrivateMessageResponse;
if (this.state.isLoggedIn) {
if (data.message.recipient_id == UserService.Instance.user.id) {
this.state.messages.push(data.message);
this.state.unreadCount++;
this.setState(this.state);
this.sendUnreadCount();
this.notify(data.message);
}
}
} else if (res.op == UserOperation.GetSite) { } else if (res.op == UserOperation.GetSite) {
let data = res.data as GetSiteResponse; let data = res.data as GetSiteResponse;
@ -276,7 +293,6 @@ export class Navbar extends Component<any, NavbarState> {
WebSocketService.Instance.getReplies(repliesForm); WebSocketService.Instance.getReplies(repliesForm);
WebSocketService.Instance.getUserMentions(userMentionsForm); WebSocketService.Instance.getUserMentions(userMentionsForm);
WebSocketService.Instance.getPrivateMessages(privateMessagesForm); WebSocketService.Instance.getPrivateMessages(privateMessagesForm);
this.state.fetchCount++;
} }
} }
} }
@ -288,11 +304,11 @@ export class Navbar extends Component<any, NavbarState> {
sendUnreadCount() { sendUnreadCount() {
UserService.Instance.sub.next({ UserService.Instance.sub.next({
user: UserService.Instance.user, user: UserService.Instance.user,
unreadCount: this.unreadCount, unreadCount: this.state.unreadCount,
}); });
} }
get unreadCount() { calculateUnreadCount(): number {
return ( return (
this.state.replies.filter(r => !r.read).length + this.state.replies.filter(r => !r.read).length +
this.state.mentions.filter(r => !r.read).length + this.state.mentions.filter(r => !r.read).length +
@ -317,15 +333,12 @@ export class Navbar extends Component<any, NavbarState> {
notify(reply: Comment | PrivateMessage) { notify(reply: Comment | PrivateMessage) {
if (Notification.permission !== 'granted') Notification.requestPermission(); if (Notification.permission !== 'granted') Notification.requestPermission();
else { else {
var notification = new Notification( var notification = new Notification(reply.creator_name, {
`${this.state.unreadCount} ${i18n.t('unread_messages')}`,
{
icon: reply.creator_avatar icon: reply.creator_avatar
? reply.creator_avatar ? reply.creator_avatar
: `${window.location.protocol}//${window.location.host}/static/assets/apple-touch-icon.png`, : `${window.location.protocol}//${window.location.host}/static/assets/apple-touch-icon.png`,
body: `${reply.creator_name}: ${reply.content}`, body: `${reply.content}`,
} });
);
notification.onclick = () => { notification.onclick = () => {
this.context.router.history.push( this.context.router.history.push(