From 3638d65008174ce1b8cfcfb9d036216c41525326 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Wed, 16 Apr 2025 08:01:21 +0800 Subject: [PATCH] feat: set top dyn Signed-off-by: bggRGjQaUbCoE --- lib/http/api.dart | 2 ++ lib/http/dynamics.dart | 19 ++++++++++++++++ lib/pages/dynamics/tab/controller.dart | 9 ++++++++ lib/pages/dynamics/tab/view.dart | 3 +++ lib/pages/dynamics/widgets/author_panel.dart | 14 ++++++++++++ lib/pages/dynamics/widgets/dynamic_panel.dart | 5 ++++- lib/pages/member_dynamics/controller.dart | 22 +++++++++++++++++++ lib/pages/member_dynamics/view.dart | 2 ++ 8 files changed, 75 insertions(+), 1 deletion(-) diff --git a/lib/http/api.dart b/lib/http/api.dart index d82ce44e..b0ba10af 100644 --- a/lib/http/api.dart +++ b/lib/http/api.dart @@ -764,4 +764,6 @@ class Api { static const String pgcTimeline = '/pgc/web/timeline'; static const String searchTrending = '/x/v2/search/trending/ranking'; + + static const String setTopDyn = '/x/dynamic/feed/space/set_top'; } diff --git a/lib/http/dynamics.dart b/lib/http/dynamics.dart index c7825a7e..af6352a0 100644 --- a/lib/http/dynamics.dart +++ b/lib/http/dynamics.dart @@ -118,4 +118,23 @@ class DynamicsHttp { }; } } + + static Future setTop({ + required dynamic dynamicId, + }) async { + var res = await Request().post( + Api.setTopDyn, + queryParameters: { + 'csrf': await Request.getCsrf(), + }, + data: { + 'dyn_str': dynamicId, + }, + ); + if (res.data['code'] == 0) { + return {'status': true}; + } else { + return {'status': false, 'msg': res.data['message']}; + } + } } diff --git a/lib/pages/dynamics/tab/controller.dart b/lib/pages/dynamics/tab/controller.dart index b642f609..64917f7d 100644 --- a/lib/pages/dynamics/tab/controller.dart +++ b/lib/pages/dynamics/tab/controller.dart @@ -64,6 +64,15 @@ class DynamicsTabController } } + Future onSetTop(bool isTop, dynamic dynamicId) async { + var res = await DynamicsHttp.setTop(dynamicId: dynamicId); + if (res['status']) { + SmartDialog.showToast('${isTop ? '取消' : ''}置顶成功'); + } else { + SmartDialog.showToast(res['msg']); + } + } + @override Future onReload() { scrollController.jumpToTop(); diff --git a/lib/pages/dynamics/tab/view.dart b/lib/pages/dynamics/tab/view.dart index f3ac74be..6c23ee0e 100644 --- a/lib/pages/dynamics/tab/view.dart +++ b/lib/pages/dynamics/tab/view.dart @@ -170,6 +170,7 @@ class _DynamicsTabPageState DynamicPanel( item: i, onRemove: controller.onRemove, + // onSetTop: controller.onSetTop, ), ] else ...[ for (var i in loadingState.response!) @@ -178,6 +179,7 @@ class _DynamicsTabPageState DynamicPanel( item: i, onRemove: controller.onRemove, + // onSetTop: controller.onSetTop, ), ] ], @@ -203,6 +205,7 @@ class _DynamicsTabPageState return DynamicPanel( item: item, onRemove: controller.onRemove, + // onSetTop: controller.onSetTop, ); } return const SizedBox.shrink(); diff --git a/lib/pages/dynamics/widgets/author_panel.dart b/lib/pages/dynamics/widgets/author_panel.dart index 371db7b8..9643a3b3 100644 --- a/lib/pages/dynamics/widgets/author_panel.dart +++ b/lib/pages/dynamics/widgets/author_panel.dart @@ -25,6 +25,7 @@ class AuthorPanel extends StatelessWidget { final String? source; final Function? onRemove; final bool isSave; + final Function(bool isTop, dynamic dynId)? onSetTop; const AuthorPanel({ super.key, @@ -33,6 +34,7 @@ class AuthorPanel extends StatelessWidget { this.source, this.onRemove, this.isSave = false, + this.onSetTop, }); Widget _buildAvatar(double size) => NetworkImgLayer( @@ -354,6 +356,18 @@ class AuthorPanel extends StatelessWidget { title: Text('检查动态', style: Theme.of(context).textTheme.titleSmall!), ), + if (onSetTop != null) + ListTile( + onTap: () { + Get.back(); + onSetTop!(item.modules?.moduleTag?.text != null, item.idStr); + }, + minLeadingWidth: 0, + leading: const Icon(Icons.vertical_align_top, size: 19), + title: Text( + '${item.modules?.moduleTag?.text != null ? '取消' : ''}置顶', + style: Theme.of(context).textTheme.titleSmall!), + ), if (onRemove != null) ListTile( onTap: () { diff --git a/lib/pages/dynamics/widgets/dynamic_panel.dart b/lib/pages/dynamics/widgets/dynamic_panel.dart index 5139eea9..a4b59404 100644 --- a/lib/pages/dynamics/widgets/dynamic_panel.dart +++ b/lib/pages/dynamics/widgets/dynamic_panel.dart @@ -15,14 +15,16 @@ class DynamicPanel extends StatelessWidget { final Function? onRemove; final Function(List, int)? callback; final bool isSave; + final Function(bool isTop, dynamic dynId)? onSetTop; const DynamicPanel({ + super.key, required this.item, this.source, this.onRemove, this.callback, this.isSave = false, - super.key, + this.onSetTop, }); @override @@ -134,6 +136,7 @@ class DynamicPanel extends StatelessWidget { source: source, onRemove: onRemove, isSave: isSave, + onSetTop: onSetTop, ), ), if (item!.modules!.moduleDynamic!.desc != null || diff --git a/lib/pages/member_dynamics/controller.dart b/lib/pages/member_dynamics/controller.dart index 90b3e4f9..0fe37648 100644 --- a/lib/pages/member_dynamics/controller.dart +++ b/lib/pages/member_dynamics/controller.dart @@ -1,3 +1,4 @@ +import 'package:PiliPlus/http/dynamics.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/msg.dart'; import 'package:PiliPlus/pages/common/common_list_controller.dart'; @@ -66,4 +67,25 @@ class MemberDynamicsController SmartDialog.showToast(res['msg']); } } + + Future onSetTop(bool isTop, dynamic dynamicId) async { + var res = await DynamicsHttp.setTop(dynamicId: dynamicId); + if (res['status']) { + List list = (loadingState.value as Success).response; + list[0].modules?.moduleTag = null; + if (isTop) { + loadingState.refresh(); + SmartDialog.showToast('取消置顶成功'); + } else { + final item = list.firstWhere((item) => item.idStr == dynamicId); + item.modules?.moduleTag = ModuleTag(text: '置顶'); + list.remove(item); + list.insert(0, item); + loadingState.refresh(); + SmartDialog.showToast('置顶成功'); + } + } else { + SmartDialog.showToast(res['msg']); + } + } } diff --git a/lib/pages/member_dynamics/view.dart b/lib/pages/member_dynamics/view.dart index b27eeb49..5751c488 100644 --- a/lib/pages/member_dynamics/view.dart +++ b/lib/pages/member_dynamics/view.dart @@ -130,6 +130,7 @@ class _MemberDynamicsPageState extends State (item) => DynamicPanel( item: item, onRemove: _memberDynamicController.onRemove, + onSetTop: _memberDynamicController.onSetTop, ), ) .toList(), @@ -149,6 +150,7 @@ class _MemberDynamicsPageState extends State return DynamicPanel( item: loadingState.response![index], onRemove: _memberDynamicController.onRemove, + onSetTop: _memberDynamicController.onSetTop, ); }, childCount: loadingState.response!.length,