From 41c9b3baf9af72593833fc03b253fe2f9d103726 Mon Sep 17 00:00:00 2001 From: Jay Sitter <jay@jaysitter.com> Date: Fri, 23 Jun 2023 12:14:24 -0400 Subject: [PATCH] fix: Specify vote content type so buttons work for both comments and posts --- .../components/comment/comment-node.tsx | 2 + src/shared/components/common/vote-buttons.tsx | 47 ++++++++++++++----- src/shared/components/post/post-listing.tsx | 9 +++- src/shared/interfaces.ts | 5 ++ 4 files changed, 51 insertions(+), 12 deletions(-) diff --git a/src/shared/components/comment/comment-node.tsx b/src/shared/components/comment/comment-node.tsx index d38a7af..2fabba1 100644 --- a/src/shared/components/comment/comment-node.tsx +++ b/src/shared/components/comment/comment-node.tsx @@ -52,6 +52,7 @@ import { CommentNodeI, CommentViewType, PurgeType, + VoteContentType, } from "../../interfaces"; import { mdToHtml, mdToHtmlNoImages } from "../../markdown"; import { I18NextService, UserService } from "../../services"; @@ -437,6 +438,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> { {UserService.Instance.myUserInfo && !this.props.viewOnly && ( <> <VoteButtonsCompact + voteContentType={VoteContentType.Comment} id={this.commentView.comment.id} onVote={this.props.onCommentVote} enableDownvotes={this.props.enableDownvotes} diff --git a/src/shared/components/common/vote-buttons.tsx b/src/shared/components/common/vote-buttons.tsx index b337794..f6113c4 100644 --- a/src/shared/components/common/vote-buttons.tsx +++ b/src/shared/components/common/vote-buttons.tsx @@ -8,11 +8,12 @@ import { CreatePostLike, PostAggregates, } from "lemmy-js-client"; -import { VoteType } from "../../interfaces"; +import { VoteContentType, VoteType } from "../../interfaces"; import { I18NextService } from "../../services"; import { Icon, Spinner } from "../common/icon"; interface VoteButtonsProps { + voteContentType: VoteContentType; id: number; onVote: (i: CreateCommentLike | CreatePostLike) => void; enableDownvotes?: boolean; @@ -46,21 +47,45 @@ const tippy = (counts: CommentAggregates | PostAggregates): string => { const handleUpvote = (i: VoteButtons) => { i.setState({ upvoteLoading: true }); - i.props.onVote({ - id: i.props.id, - score: newVote(VoteType.Upvote, i.props.my_vote), - auth: myAuthRequired(), - }); + + switch (i.props.voteContentType) { + case VoteContentType.Comment: + i.props.onVote({ + comment_id: i.props.id, + score: newVote(VoteType.Upvote, i.props.my_vote), + auth: myAuthRequired(), + }); + break; + case VoteContentType.Post: + default: + i.props.onVote({ + post_id: i.props.id, + score: newVote(VoteType.Upvote, i.props.my_vote), + auth: myAuthRequired(), + }); + } + i.setState({ upvoteLoading: false }); }; const handleDownvote = (i: VoteButtons) => { i.setState({ downvoteLoading: true }); - i.props.onVote({ - id: i.props.id, - score: newVote(VoteType.Downvote, i.props.my_vote), - auth: myAuthRequired(), - }); + switch (i.props.voteContentType) { + case VoteContentType.Comment: + i.props.onVote({ + comment_id: i.props.id, + score: newVote(VoteType.Downvote, i.props.my_vote), + auth: myAuthRequired(), + }); + break; + case VoteContentType.Post: + default: + i.props.onVote({ + post_id: i.props.id, + score: newVote(VoteType.Downvote, i.props.my_vote), + auth: myAuthRequired(), + }); + } i.setState({ downvoteLoading: false }); }; diff --git a/src/shared/components/post/post-listing.tsx b/src/shared/components/post/post-listing.tsx index e8ab95e..5a5ffe0 100644 --- a/src/shared/components/post/post-listing.tsx +++ b/src/shared/components/post/post-listing.tsx @@ -43,7 +43,12 @@ import { TransferCommunity, } from "lemmy-js-client"; import { relTags } from "../../config"; -import { BanType, PostFormParams, PurgeType } from "../../interfaces"; +import { + BanType, + PostFormParams, + PurgeType, + VoteContentType, +} from "../../interfaces"; import { mdNoImages, mdToHtml, mdToHtmlInline } from "../../markdown"; import { I18NextService, UserService } from "../../services"; import { setupTippy } from "../../tippy"; @@ -598,6 +603,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> { )} {mobile && !this.props.viewOnly && ( <VoteButtonsCompact + voteContentType={VoteContentType.Post} id={this.postView.post.id} onVote={this.props.onPostVote} enableDownvotes={this.props.enableDownvotes} @@ -1380,6 +1386,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> { <article className="row post-container"> {!this.props.viewOnly && ( <VoteButtons + voteContentType={VoteContentType.Post} id={this.postView.post.id} onVote={this.props.onPostVote} enableDownvotes={this.props.enableDownvotes} diff --git a/src/shared/interfaces.ts b/src/shared/interfaces.ts index 6946fd3..b37dbd3 100644 --- a/src/shared/interfaces.ts +++ b/src/shared/interfaces.ts @@ -77,6 +77,11 @@ export enum VoteType { Downvote, } +export enum VoteContentType { + Post, + Comment, +} + export interface CommentNodeI { comment_view: CommentView; children: Array<CommentNodeI>; -- 2.44.1