From bd3302317e222b4961dd0ccf8cd26ed858787929 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Mon, 22 Apr 2019 11:32:50 -0700 Subject: [PATCH] Comment actions from inbox and user pages working. - Fixes #93 --- server/src/websocket_server/server.rs | 17 +++++++----- ui/src/components/comment-node.tsx | 11 +++++--- ui/src/components/inbox.tsx | 31 ++++++++++++++++++++-- ui/src/components/user.tsx | 37 ++++++++++++++++++++++++--- 4 files changed, 81 insertions(+), 15 deletions(-) diff --git a/server/src/websocket_server/server.rs b/server/src/websocket_server/server.rs index 068fd0275..c61756e1f 100644 --- a/server/src/websocket_server/server.rs +++ b/server/src/websocket_server/server.rs @@ -1311,14 +1311,17 @@ impl Perform for EditComment { return Err(self.error("Not allowed to edit comment."))? } - // Check for a community ban - if CommunityUserBanView::get(&conn, user_id, orig_comment.community_id).is_ok() { - return Err(self.error("You have been banned from this community"))? - } + // You are allowed to mark the comment as read even if you're banned. + if self.read.is_none() { + // Check for a community ban + if CommunityUserBanView::get(&conn, user_id, orig_comment.community_id).is_ok() { + return Err(self.error("You have been banned from this community"))? + } - // Check for a site ban - if UserView::read(&conn, user_id)?.banned { - return Err(self.error("You have been banned from the site"))? + // Check for a site ban + if UserView::read(&conn, user_id)?.banned { + return Err(self.error("You have been banned from the site"))? + } } let content_slurs_removed = remove_slurs(&self.content.to_owned()); diff --git a/ui/src/components/comment-node.tsx b/ui/src/components/comment-node.tsx index badbcd12c..af44e41e6 100644 --- a/ui/src/components/comment-node.tsx +++ b/ui/src/components/comment-node.tsx @@ -220,10 +220,15 @@ export class CommentNode extends Component { } get canMod(): boolean { - let adminsThenMods = this.props.admins.map(a => a.id) - .concat(this.props.moderators.map(m => m.user_id)); - return canMod(UserService.Instance.user, adminsThenMods, this.props.node.comment.creator_id); + if (this.props.admins && this.props.moderators) { + let adminsThenMods = this.props.admins.map(a => a.id) + .concat(this.props.moderators.map(m => m.user_id)); + + return canMod(UserService.Instance.user, adminsThenMods, this.props.node.comment.creator_id); + } else { + return false; + } } get canAdmin(): boolean { diff --git a/ui/src/components/inbox.tsx b/ui/src/components/inbox.tsx index e386aa1a8..50fd47c21 100644 --- a/ui/src/components/inbox.tsx +++ b/ui/src/components/inbox.tsx @@ -94,7 +94,7 @@ export class Inbox extends Component { return (
{this.state.replies.map(reply => - + )}
); @@ -161,6 +161,14 @@ export class Inbox extends Component { } else if (op == UserOperation.EditComment) { let res: CommentResponse = msg; + let found = this.state.replies.find(c => c.id == res.comment.id); + found.content = res.comment.content; + found.updated = res.comment.updated; + found.removed = res.comment.removed; + found.upvotes = res.comment.upvotes; + found.downvotes = res.comment.downvotes; + found.score = res.comment.score; + // 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); @@ -168,8 +176,27 @@ export class Inbox extends Component { let found = this.state.replies.find(c => c.id == res.comment.id); found.read = res.comment.read; } - this.sendRepliesCount(); + + this.setState(this.state); + } else if (op == UserOperation.CreateComment) { + // let res: CommentResponse = msg; + alert('Reply sent'); + // this.state.replies.unshift(res.comment); // TODO do this right + // this.setState(this.state); + } else if (op == UserOperation.SaveComment) { + let res: CommentResponse = msg; + let found = this.state.replies.find(c => c.id == res.comment.id); + found.saved = res.comment.saved; + this.setState(this.state); + } else if (op == UserOperation.CreateCommentLike) { + let res: CommentResponse = msg; + let found: Comment = this.state.replies.find(c => c.id === res.comment.id); + found.score = res.comment.score; + found.upvotes = res.comment.upvotes; + found.downvotes = res.comment.downvotes; + if (res.comment.my_vote !== null) + found.my_vote = res.comment.my_vote; this.setState(this.state); } } diff --git a/ui/src/components/user.tsx b/ui/src/components/user.tsx index b530e41ec..1131428b3 100644 --- a/ui/src/components/user.tsx +++ b/ui/src/components/user.tsx @@ -2,7 +2,7 @@ import { Component, linkEvent } from 'inferno'; import { Link } from 'inferno-router'; import { Subscription } from "rxjs"; import { retryWhen, delay, take } from 'rxjs/operators'; -import { UserOperation, Post, Comment, CommunityUser, GetUserDetailsForm, SortType, UserDetailsResponse, UserView } from '../interfaces'; +import { UserOperation, Post, Comment, CommunityUser, GetUserDetailsForm, SortType, UserDetailsResponse, UserView, CommentResponse } from '../interfaces'; import { WebSocketService } from '../services'; import { msgOp, fetchLimit } from '../utils'; import { PostListing } from './post-listing'; @@ -148,7 +148,7 @@ export class User extends Component {
{i.type_ == "posts" ? - : + : }
) @@ -296,7 +296,38 @@ export class User extends Component { this.state.posts = res.posts; document.title = `/u/${this.state.user.name} - Lemmy`; this.setState(this.state); - } + } else if (op == UserOperation.EditComment) { + let res: CommentResponse = msg; + + let found = this.state.comments.find(c => c.id == res.comment.id); + found.content = res.comment.content; + found.updated = res.comment.updated; + found.removed = res.comment.removed; + found.upvotes = res.comment.upvotes; + found.downvotes = res.comment.downvotes; + found.score = res.comment.score; + + this.setState(this.state); + } else if (op == UserOperation.CreateComment) { + // let res: CommentResponse = msg; + alert('Reply sent'); + // this.state.comments.unshift(res.comment); // TODO do this right + // this.setState(this.state); + } else if (op == UserOperation.SaveComment) { + let res: CommentResponse = msg; + let found = this.state.comments.find(c => c.id == res.comment.id); + found.saved = res.comment.saved; + this.setState(this.state); + } else if (op == UserOperation.CreateCommentLike) { + let res: CommentResponse = msg; + let found: Comment = this.state.comments.find(c => c.id === res.comment.id); + found.score = res.comment.score; + found.upvotes = res.comment.upvotes; + found.downvotes = res.comment.downvotes; + if (res.comment.my_vote !== null) + found.my_vote = res.comment.my_vote; + this.setState(this.state); + } } }