From 0c8ac833a267c6e72d661fb4ecbccfcfa5c64fee Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Wed, 9 Oct 2024 09:41:54 +0800 Subject: [PATCH] feat: thumbsdown reply --- README.md | 1 + lib/http/api.dart | 2 + lib/http/reply.dart | 30 +++++ .../detail/reply/widgets/reply_item.dart | 18 ++- lib/pages/video/detail/reply/widgets/zan.dart | 114 +++++++++++++----- 5 files changed, 129 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index e70fca1d9..f2ebdb0af 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,7 @@ ## feat +- [x] 评论点踩 - [x] 显示ops专栏 - [x] 私信发图 - [x] 投币动画 diff --git a/lib/http/api.dart b/lib/http/api.dart index 6177beb49..098917461 100644 --- a/lib/http/api.dart +++ b/lib/http/api.dart @@ -143,6 +143,8 @@ class Api { // 评论点赞 static const String likeReply = '/x/v2/reply/action'; + static const String hateReply = '/x/v2/reply/hate'; + // 发表评论 // https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/comment/action.md static const String replyAdd = '/x/v2/reply/add'; diff --git a/lib/http/reply.dart b/lib/http/reply.dart index 99ee4fc84..2eb1b9b7b 100644 --- a/lib/http/reply.dart +++ b/lib/http/reply.dart @@ -83,6 +83,36 @@ class ReplyHttp { } } + static Future hateReply({ + required int type, + required int action, + required int oid, + required int rpid, + }) async { + var res = await Request().post( + Api.hateReply, + data: { + 'type': type, + 'oid': oid, + 'rpid': rpid, + 'action': action, + 'csrf': await Request.getCsrf(), + }, + options: Options( + contentType: Headers.formUrlEncodedContentType, + ), + ); + if (res.data['code'] == 0) { + return {'status': true, 'data': res.data['data']}; + } else { + return { + 'status': false, + 'date': [], + 'msg': res.data['message'], + }; + } + } + // 评论点赞 static Future likeReply({ required int type, diff --git a/lib/pages/video/detail/reply/widgets/reply_item.dart b/lib/pages/video/detail/reply/widgets/reply_item.dart index 029dca418..2c676d11f 100644 --- a/lib/pages/video/detail/reply/widgets/reply_item.dart +++ b/lib/pages/video/detail/reply/widgets/reply_item.dart @@ -364,11 +364,19 @@ class ReplyItem extends StatelessWidget { ), const SizedBox(width: 2), if (replyItem!.upAction!.like!) ...[ - Text( - 'UP主觉得很赞', - style: TextStyle( - color: Theme.of(context).colorScheme.primary, - fontSize: Theme.of(context).textTheme.labelMedium!.fontSize), + SizedBox( + height: 32, + child: TextButton( + onPressed: null, + child: Text( + 'UP主觉得很赞', + style: TextStyle( + color: Theme.of(context).colorScheme.primary, + fontSize: Theme.of(context).textTheme.labelMedium!.fontSize, + fontWeight: FontWeight.normal, + ), + ), + ), ), const SizedBox(width: 2), ], diff --git a/lib/pages/video/detail/reply/widgets/zan.dart b/lib/pages/video/detail/reply/widgets/zan.dart index 391f325d5..7d25693e9 100644 --- a/lib/pages/video/detail/reply/widgets/zan.dart +++ b/lib/pages/video/detail/reply/widgets/zan.dart @@ -21,6 +21,38 @@ class ZanButton extends StatefulWidget { } class _ZanButtonState extends State { + Future onHateReply() async { + feedBack(); + // SmartDialog.showLoading(msg: 'pilipala ...'); + final ReplyItemModel replyItem = widget.replyItem!; + final int oid = replyItem.oid!; + final int rpid = replyItem.rpid!; + // 1 已点赞 2 不喜欢 0 未操作 + final int action = replyItem.action != 2 ? 2 : 0; + final res = await ReplyHttp.hateReply( + type: widget.replyType!.index, + action: action == 2 ? 1 : 0, + oid: oid, + rpid: rpid, + ); + // SmartDialog.dismiss(); + if (res['status']) { + SmartDialog.showToast(replyItem.action != 2 ? '点踩成功' : '取消踩'); + if (action == 2) { + if (replyItem.action == 1) { + replyItem.like = replyItem.like! - 1; + } + replyItem.action = 2; + } else { + // replyItem.like = replyItem.like! - 1; + replyItem.action = 0; + } + setState(() {}); + } else { + SmartDialog.showToast(res['msg']); + } + } + // 评论点赞 Future onLikeReply() async { feedBack(); @@ -29,12 +61,12 @@ class _ZanButtonState extends State { final int oid = replyItem.oid!; final int rpid = replyItem.rpid!; // 1 已点赞 2 不喜欢 0 未操作 - final int action = replyItem.action == 0 ? 1 : 0; + final int action = replyItem.action != 1 ? 1 : 0; final res = await ReplyHttp.likeReply( type: widget.replyType!.index, oid: oid, rpid: rpid, action: action); // SmartDialog.dismiss(); if (res['status']) { - SmartDialog.showToast(replyItem.action == 0 ? '点赞成功' : '取消赞'); + SmartDialog.showToast(replyItem.action != 1 ? '点赞成功' : '取消赞'); if (action == 1) { replyItem.like = replyItem.like! + 1; replyItem.action = 1; @@ -64,38 +96,58 @@ class _ZanButtonState extends State { final ThemeData t = Theme.of(context); final Color color = t.colorScheme.outline; final Color primary = t.colorScheme.primary; - return SizedBox( - height: 32, - child: TextButton( - onPressed: handleState(onLikeReply), - child: Row( - children: [ - Icon( - widget.replyItem!.action == 1 - ? FontAwesomeIcons.solidThumbsUp - : FontAwesomeIcons.thumbsUp, + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox( + height: 32, + child: TextButton( + onPressed: handleState(onHateReply), + child: Icon( + widget.replyItem!.action == 2 + ? FontAwesomeIcons.solidThumbsDown + : FontAwesomeIcons.thumbsDown, size: 16, - color: widget.replyItem!.action == 1 ? primary : color, - semanticLabel: widget.replyItem!.action == 1 ? '已赞' : '点赞', + color: widget.replyItem!.action == 2 ? primary : color, + semanticLabel: widget.replyItem!.action == 2 ? '已踩' : '点踩', ), - const SizedBox(width: 4), - AnimatedSwitcher( - duration: const Duration(milliseconds: 400), - transitionBuilder: (Widget child, Animation animation) { - return ScaleTransition(scale: animation, child: child); - }, - child: Text( - widget.replyItem!.like.toString(), - key: ValueKey(widget.replyItem!.like!), - style: TextStyle( - color: widget.replyItem!.action == 1 ? primary : color, - fontSize: t.textTheme.labelSmall!.fontSize, - ), - ), - ), - ], + ), ), - ), + SizedBox( + height: 32, + child: TextButton( + onPressed: handleState(onLikeReply), + child: Row( + children: [ + Icon( + widget.replyItem!.action == 1 + ? FontAwesomeIcons.solidThumbsUp + : FontAwesomeIcons.thumbsUp, + size: 16, + color: widget.replyItem!.action == 1 ? primary : color, + semanticLabel: widget.replyItem!.action == 1 ? '已赞' : '点赞', + ), + const SizedBox(width: 4), + AnimatedSwitcher( + duration: const Duration(milliseconds: 400), + transitionBuilder: + (Widget child, Animation animation) { + return ScaleTransition(scale: animation, child: child); + }, + child: Text( + widget.replyItem!.like.toString(), + key: ValueKey(widget.replyItem!.like!), + style: TextStyle( + color: widget.replyItem!.action == 1 ? primary : color, + fontSize: t.textTheme.labelSmall!.fontSize, + ), + ), + ), + ], + ), + ), + ), + ], ); } }