Mostly done eliminating recurring fetches.
This commit is contained in:
parent
b14f7bae3c
commit
4f08760ef4
5 changed files with 54 additions and 33 deletions
|
@ -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)?;
|
||||||
|
|
2
ui/src/components/community.tsx
vendored
2
ui/src/components/community.tsx
vendored
|
@ -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
|
||||||
|
|
22
ui/src/components/inbox.tsx
vendored
22
ui/src/components/inbox.tsx
vendored
|
@ -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);
|
||||||
|
|
2
ui/src/components/login.tsx
vendored
2
ui/src/components/login.tsx
vendored
|
@ -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'));
|
||||||
|
|
43
ui/src/components/navbar.tsx
vendored
43
ui/src/components/navbar.tsx
vendored
|
@ -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(
|
||||||
|
|
Loading…
Reference in a new issue