import {
CommentNode as CommentNodeI,
CommentLikeForm,
- CommentForm as CommentFormI,
- EditUserMentionForm,
+ DeleteCommentForm,
+ RemoveCommentForm,
+ MarkCommentAsReadForm,
+ MarkUserMentionAsReadForm,
SaveCommentForm,
BanFromCommunityForm,
BanUserForm,
AddAdminForm,
TransferCommunityForm,
TransferSiteForm,
- BanType,
- CommentSortType,
SortType,
-} from '../interfaces';
+} from 'lemmy-js-client';
+import { CommentSortType, BanType } from '../interfaces';
import { WebSocketService, UserService } from '../services';
import {
mdToHtml,
showRemoveDialog: boolean;
removeReason: string;
showBanDialog: boolean;
+ removeData: boolean;
banReason: string;
banExpires: string;
banType: BanType;
interface CommentNodeProps {
node: CommentNodeI;
+ noBorder?: boolean;
noIndent?: boolean;
viewOnly?: boolean;
locked?: boolean;
showRemoveDialog: false,
removeReason: null,
showBanDialog: false,
+ removeData: null,
banReason: null,
banExpires: null,
banType: BanType.Community,
>
<div
id={`comment-${node.comment.id}`}
- className={`details comment-node border-top border-light py-2 ${
- this.isCommentNew ? 'mark' : ''
- }`}
+ className={`details comment-node py-2 ${
+ !this.props.noBorder ? 'border-top border-light' : ''
+ } ${this.isCommentNew ? 'mark' : ''}`}
style={
!this.props.noIndent &&
this.props.node.comment.parent_id &&
<UserListing
user={{
name: node.comment.creator_name,
+ preferred_username: node.comment.creator_preferred_username,
avatar: node.comment.creator_avatar,
id: node.comment.creator_id,
local: node.comment.creator_local,
id: node.comment.community_id,
local: node.comment.community_local,
actor_id: node.comment.community_actor_id,
+ icon: node.comment.community_icon,
}}
/>
<span class="mx-2">•</span>
</>
)}
<button
- class="btn btn-sm text-muted"
+ class="btn text-muted"
onClick={linkEvent(this, this.handleCommentCollapse)}
>
{this.state.collapsed ? (
{/* This is an expanding spacer for mobile */}
<div className="mr-lg-4 flex-grow-1 flex-lg-grow-0 unselectable pointer mx-2"></div>
<button
- className={`btn btn-sm p-0 unselectable pointer ${this.scoreColor}`}
+ className={`btn p-0 unselectable pointer ${this.scoreColor}`}
onClick={linkEvent(node, this.handleCommentUpvote)}
data-tippy-content={this.pointsTippy}
>
</button>
))}
{!node.comment.banned_from_community &&
+ node.comment.creator_local &&
(!this.state.showConfirmAppointAsMod ? (
<button
class="btn btn-link btn-animate text-muted"
{/* Community creators and admins can transfer community to another mod */}
{(this.amCommunityCreator || this.canAdmin) &&
this.isMod &&
+ node.comment.creator_local &&
(!this.state.showConfirmTransferCommunity ? (
<button
class="btn btn-link btn-animate text-muted"
</button>
))}
{!node.comment.banned &&
+ node.comment.creator_local &&
(!this.state.showConfirmAppointAsAdmin ? (
<button
class="btn btn-link btn-animate text-muted"
{/* Site Creator can transfer to another admin */}
{this.amSiteCreator &&
this.isAdmin &&
+ node.comment.creator_local &&
(!this.state.showConfirmTransferSite ? (
<button
class="btn btn-link btn-animate text-muted"
value={this.state.banReason}
onInput={linkEvent(this, this.handleModBanReasonChange)}
/>
+ <div class="form-group">
+ <div class="form-check">
+ <input
+ class="form-check-input"
+ id="mod-ban-remove-data"
+ type="checkbox"
+ checked={this.state.removeData}
+ onChange={linkEvent(this, this.handleModRemoveDataChange)}
+ />
+ <label class="form-check-label" htmlFor="mod-ban-remove-data">
+ {i18n.t('remove_posts_comments')}
+ </label>
+ </div>
+ </div>
</div>
{/* TODO hold off on expires until later */}
{/* <div class="form-group row"> */}
}
handleDeleteClick(i: CommentNode) {
- let deleteForm: CommentFormI = {
- content: i.props.node.comment.content,
+ let deleteForm: DeleteCommentForm = {
edit_id: i.props.node.comment.id,
- creator_id: i.props.node.comment.creator_id,
- post_id: i.props.node.comment.post_id,
- parent_id: i.props.node.comment.parent_id,
deleted: !i.props.node.comment.deleted,
auth: null,
};
- WebSocketService.Instance.editComment(deleteForm);
+ WebSocketService.Instance.deleteComment(deleteForm);
}
handleSaveCommentClick(i: CommentNode) {
let form: CommentLikeForm = {
comment_id: i.comment.id,
- post_id: i.comment.post_id,
score: this.state.my_vote,
};
let form: CommentLikeForm = {
comment_id: i.comment.id,
- post_id: i.comment.post_id,
score: this.state.my_vote,
};
i.setState(i.state);
}
+ handleModRemoveDataChange(i: CommentNode, event: any) {
+ i.state.removeData = event.target.checked;
+ i.setState(i.state);
+ }
+
handleModRemoveSubmit(i: CommentNode) {
event.preventDefault();
- let form: CommentFormI = {
- content: i.props.node.comment.content,
+ let form: RemoveCommentForm = {
edit_id: i.props.node.comment.id,
- creator_id: i.props.node.comment.creator_id,
- post_id: i.props.node.comment.post_id,
- parent_id: i.props.node.comment.parent_id,
removed: !i.props.node.comment.removed,
reason: i.state.removeReason,
auth: null,
};
- WebSocketService.Instance.editComment(form);
+ WebSocketService.Instance.removeComment(form);
i.state.showRemoveDialog = false;
i.setState(i.state);
handleMarkRead(i: CommentNode) {
// if it has a user_mention_id field, then its a mention
if (i.props.node.comment.user_mention_id) {
- let form: EditUserMentionForm = {
+ let form: MarkUserMentionAsReadForm = {
user_mention_id: i.props.node.comment.user_mention_id,
read: !i.props.node.comment.read,
};
- WebSocketService.Instance.editUserMention(form);
+ WebSocketService.Instance.markUserMentionAsRead(form);
} else {
- let form: CommentFormI = {
- content: i.props.node.comment.content,
+ let form: MarkCommentAsReadForm = {
edit_id: i.props.node.comment.id,
- creator_id: i.props.node.comment.creator_id,
- post_id: i.props.node.comment.post_id,
- parent_id: i.props.node.comment.parent_id,
read: !i.props.node.comment.read,
auth: null,
};
- WebSocketService.Instance.editComment(form);
+ WebSocketService.Instance.markCommentAsRead(form);
}
i.state.readLoading = true;
event.preventDefault();
if (i.state.banType == BanType.Community) {
+ // If its an unban, restore all their data
+ let ban = !i.props.node.comment.banned_from_community;
+ if (ban == false) {
+ i.state.removeData = false;
+ }
let form: BanFromCommunityForm = {
user_id: i.props.node.comment.creator_id,
community_id: i.props.node.comment.community_id,
- ban: !i.props.node.comment.banned_from_community,
+ ban,
+ remove_data: i.state.removeData,
reason: i.state.banReason,
expires: getUnixTime(i.state.banExpires),
};
WebSocketService.Instance.banFromCommunity(form);
} else {
+ // If its an unban, restore all their data
+ let ban = !i.props.node.comment.banned;
+ if (ban == false) {
+ i.state.removeData = false;
+ }
let form: BanUserForm = {
user_id: i.props.node.comment.creator_id,
- ban: !i.props.node.comment.banned,
+ ban,
+ remove_data: i.state.removeData,
reason: i.state.banReason,
expires: getUnixTime(i.state.banExpires),
};