From 104d29538986073596cf5fd21e3233b238af5572 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Tue, 5 Aug 2025 17:18:40 +0800 Subject: [PATCH] opt multi del Signed-off-by: bggRGjQaUbCoE --- lib/common/widgets/appbar/appbar.dart | 4 +- lib/http/fav.dart | 20 +- lib/http/live.dart | 4 +- lib/http/member.dart | 6 +- lib/http/msg.dart | 4 +- lib/http/user.dart | 8 +- lib/http/video.dart | 6 +- lib/models/member/tags.dart | 3 +- lib/models/model_hot_video_item.dart | 3 +- lib/models_new/dynamic/dyn_mention/item.dart | 3 +- lib/models_new/fav/fav_detail/media.dart | 3 +- lib/models_new/fav/fav_note/list.dart | 3 +- lib/models_new/fav/fav_pgc/list.dart | 3 +- lib/models_new/history/list.dart | 3 +- lib/models_new/later/list.dart | 3 +- lib/pages/common/common_intro_controller.dart | 2 +- .../base.dart} | 21 +- .../multi_select/multi_select_controller.dart | 6 + .../common_search_controller.dart | 0 .../{ => search}/common_search_page.dart | 4 +- .../common_collapse_slide_page.dart | 2 +- .../common/{ => slide}/common_slide_page.dart | 0 lib/pages/episode_panel/view.dart | 2 +- lib/pages/fav/note/child_view.dart | 2 +- lib/pages/fav/note/controller.dart | 10 +- lib/pages/fav/pgc/controller.dart | 14 +- lib/pages/fav/pgc/widget/item.dart | 2 +- lib/pages/fav_detail/controller.dart | 21 +- lib/pages/fav_detail/view.dart | 4 +- lib/pages/fav_folder_sort/view.dart | 2 +- lib/pages/fav_search/controller.dart | 4 +- lib/pages/fav_search/view.dart | 2 +- lib/pages/fav_sort/view.dart | 2 +- lib/pages/follow_search/controller.dart | 2 +- lib/pages/follow_search/view.dart | 2 +- lib/pages/group_panel/view.dart | 5 +- lib/pages/history/controller.dart | 26 +- lib/pages/history/view.dart | 334 +++++++++--------- lib/pages/history/widgets/item.dart | 108 +++--- lib/pages/history_search/controller.dart | 28 +- lib/pages/history_search/view.dart | 2 +- lib/pages/later/controller.dart | 42 +-- lib/pages/later_search/controller.dart | 14 +- lib/pages/later_search/view.dart | 2 +- lib/pages/live_area/controller.dart | 2 +- lib/pages/pgc_review/post/view.dart | 2 +- lib/pages/setting/models/extra_settings.dart | 2 +- lib/pages/video/ai_conclusion/view.dart | 2 +- lib/pages/video/controller.dart | 2 +- .../video/introduction/pgc/controller.dart | 2 +- .../pgc/widgets/intro_detail.dart | 2 +- lib/pages/video/medialist/view.dart | 2 +- lib/pages/video/note/view.dart | 2 +- lib/pages/video/post_panel/view.dart | 2 +- lib/pages/video/reply_reply/view.dart | 2 +- lib/pages/video/view_point/view.dart | 2 +- .../whisper_link_setting/controller.dart | 2 +- lib/utils/request_utils.dart | 16 +- 58 files changed, 379 insertions(+), 404 deletions(-) rename lib/pages/common/{multi_select_controller.dart => multi_select/base.dart} (88%) create mode 100644 lib/pages/common/multi_select/multi_select_controller.dart rename lib/pages/common/{ => search}/common_search_controller.dart (100%) rename lib/pages/common/{ => search}/common_search_page.dart (96%) rename lib/pages/common/{ => slide}/common_collapse_slide_page.dart (91%) rename lib/pages/common/{ => slide}/common_slide_page.dart (100%) diff --git a/lib/common/widgets/appbar/appbar.dart b/lib/common/widgets/appbar/appbar.dart index 1d2701a69..f8c28dcec 100644 --- a/lib/common/widgets/appbar/appbar.dart +++ b/lib/common/widgets/appbar/appbar.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/pages/common/multi_select_controller.dart'; +import 'package:PiliPlus/pages/common/multi_select/base.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -41,7 +41,7 @@ class MultiSelectAppBarWidget extends StatelessWidget style: TextButton.styleFrom( visualDensity: VisualDensity.compact, ), - onPressed: ctr.onConfirm, + onPressed: ctr.onRemove, child: Text( '移除', style: TextStyle(color: Get.theme.colorScheme.error), diff --git a/lib/http/fav.dart b/lib/http/fav.dart index 388b6012d..d762fe14a 100644 --- a/lib/http/fav.dart +++ b/lib/http/fav.dart @@ -312,12 +312,12 @@ class FavHttp { static Future delNote({ required bool isPublish, - required Iterable noteIds, + required String noteIds, }) async { final res = await Request().post( isPublish ? Api.delPublishNote : Api.delNote, data: { - isPublish ? 'cvids' : 'note_ids': noteIds.join(','), + isPublish ? 'cvids' : 'note_ids': noteIds, 'csrf': Accounts.main.csrf, }, options: Options( @@ -375,10 +375,10 @@ class FavHttp { } static Future sortFavFolder({ - required List sort, + required String sort, }) async { Map data = { - 'sort': sort.join(','), + 'sort': sort, 'csrf': Accounts.main.csrf, }; AppSign.appSign(data); @@ -398,11 +398,11 @@ class FavHttp { static Future sortFav({ required dynamic mediaId, - required List sort, + required String sort, }) async { Map data = { 'media_id': mediaId, - 'sort': sort.join(','), + 'sort': sort, 'csrf': Accounts.main.csrf, }; AppSign.appSign(data); @@ -442,12 +442,12 @@ class FavHttp { } static Future deleteFolder({ - required List mediaIds, + required String mediaIds, }) async { var res = await Request().post( Api.deleteFolder, data: { - 'media_ids': mediaIds.join(','), + 'media_ids': mediaIds, 'platform': 'web', 'csrf': Accounts.main.csrf, }, @@ -643,7 +643,7 @@ class FavHttp { required dynamic srcMediaId, required dynamic tarMediaId, dynamic mid, - required Iterable resources, + required String resources, }) async { var res = await Request().post( isFav @@ -657,7 +657,7 @@ class FavHttp { 'src_media_id': ?srcMediaId, 'tar_media_id': tarMediaId, 'mid': ?mid, - 'resources': resources.join(','), + 'resources': resources, 'platform': 'web', 'csrf': Accounts.main.csrf, }, diff --git a/lib/http/live.dart b/lib/http/live.dart index a904b4994..169d8d60d 100644 --- a/lib/http/live.dart +++ b/lib/http/live.dart @@ -393,10 +393,10 @@ class LiveHttp { } static Future setLiveFavTag({ - required List ids, + required String ids, }) async { final data = { - 'tags': ids.join(','), + 'tags': ids, 'access_key': Accounts.main.accessKey, 'appkey': Constants.appKey, 'actionKey': 'appkey', diff --git a/lib/http/member.dart b/lib/http/member.dart index d0f9d5e8e..7062bb0d6 100644 --- a/lib/http/member.dart +++ b/lib/http/member.dart @@ -505,7 +505,7 @@ class MemberHttp { } // 设置分组 - static Future addUsers(List fids, List tagids) async { + static Future addUsers(String fids, String tagids) async { var res = await Request().post( Api.addUsers, queryParameters: { @@ -513,8 +513,8 @@ class MemberHttp { '{"platform":"web","device":"pc","spmid":"333.1387"}', }, data: { - 'fids': fids.join(','), - 'tagids': tagids.join(','), + 'fids': fids, + 'tagids': tagids, 'csrf': Accounts.main.csrf, // 'cross_domain': true }, diff --git a/lib/http/msg.dart b/lib/http/msg.dart index 99ff4af0a..e03825083 100644 --- a/lib/http/msg.dart +++ b/lib/http/msg.dart @@ -533,13 +533,13 @@ class MsgHttp { } static Future?>> imUserInfos({ - required List uids, + required String uids, }) async { final csrf = Accounts.main.csrf; var res = await Request().get( Api.imUserInfos, queryParameters: { - 'uids': uids.join(','), + 'uids': uids, 'build': 0, 'mobi_app': 'web', 'csrf_token': csrf, diff --git a/lib/http/user.dart b/lib/http/user.dart index a7b56df7f..748acc62d 100644 --- a/lib/http/user.dart +++ b/lib/http/user.dart @@ -151,10 +151,10 @@ class UserHttp { } // 移除已观看 - static Future toViewDel({required Iterable aids}) async { + static Future toViewDel({required String aids}) async { final Map params = { 'csrf': Accounts.main.csrf, - 'resources': aids.join(','), + 'resources': aids, }; var res = await Request().post( Api.toViewDel, @@ -204,11 +204,11 @@ class UserHttp { } // 删除历史记录 - static Future delHistory(Iterable kidList) async { + static Future delHistory(String kid) async { var res = await Request().post( Api.delHistory, data: { - 'kid': kidList.join(','), + 'kid': kid, 'jsonp': 'jsonp', 'csrf': Accounts.heartbeat.csrf, }, diff --git a/lib/http/video.dart b/lib/http/video.dart index 926fe2bfb..3ca19a691 100644 --- a/lib/http/video.dart +++ b/lib/http/video.dart @@ -739,13 +739,13 @@ class VideoHttp { } static Future pgcUpdate({ - required List seasonId, - required dynamic status, + required String seasonId, + required int status, }) async { var res = await Request().post( Api.pgcUpdate, data: { - 'season_id': seasonId.join(','), + 'season_id': seasonId, 'status': status, 'csrf': Accounts.main.csrf, }, diff --git a/lib/models/member/tags.dart b/lib/models/member/tags.dart index 84202e758..0e7eaa431 100644 --- a/lib/models/member/tags.dart +++ b/lib/models/member/tags.dart @@ -1,5 +1,4 @@ -import 'package:PiliPlus/pages/common/multi_select_controller.dart' - show MultiSelectData; +import 'package:PiliPlus/pages/common/multi_select/base.dart'; class MemberTagItemModel with MultiSelectData { MemberTagItemModel({ diff --git a/lib/models/model_hot_video_item.dart b/lib/models/model_hot_video_item.dart index 4d59d15ec..82aa33027 100644 --- a/lib/models/model_hot_video_item.dart +++ b/lib/models/model_hot_video_item.dart @@ -1,8 +1,7 @@ import 'package:PiliPlus/models/model_owner.dart'; import 'package:PiliPlus/models/model_rec_video_item.dart'; import 'package:PiliPlus/models/model_video.dart'; -import 'package:PiliPlus/pages/common/multi_select_controller.dart' - show MultiSelectData; +import 'package:PiliPlus/pages/common/multi_select/base.dart'; // 稍后再看, 排行榜等网页返回也使用该类 class HotVideoItemModel extends BaseRecVideoItemModel with MultiSelectData { diff --git a/lib/models_new/dynamic/dyn_mention/item.dart b/lib/models_new/dynamic/dyn_mention/item.dart index 8146e2912..022a629a2 100644 --- a/lib/models_new/dynamic/dyn_mention/item.dart +++ b/lib/models_new/dynamic/dyn_mention/item.dart @@ -1,5 +1,4 @@ -import 'package:PiliPlus/pages/common/multi_select_controller.dart' - show MultiSelectData; +import 'package:PiliPlus/pages/common/multi_select/base.dart'; class MentionItem with MultiSelectData { String? face; diff --git a/lib/models_new/fav/fav_detail/media.dart b/lib/models_new/fav/fav_detail/media.dart index b3f8b50df..e81b6cafc 100644 --- a/lib/models_new/fav/fav_detail/media.dart +++ b/lib/models_new/fav/fav_detail/media.dart @@ -2,8 +2,7 @@ import 'package:PiliPlus/models/model_owner.dart'; import 'package:PiliPlus/models_new/fav/fav_detail/cnt_info.dart'; import 'package:PiliPlus/models_new/fav/fav_detail/ogv.dart'; import 'package:PiliPlus/models_new/fav/fav_detail/ugc.dart'; -import 'package:PiliPlus/pages/common/multi_select_controller.dart' - show MultiSelectData; +import 'package:PiliPlus/pages/common/multi_select/base.dart'; class FavDetailItemModel with MultiSelectData { int? id; diff --git a/lib/models_new/fav/fav_note/list.dart b/lib/models_new/fav/fav_note/list.dart index 08805fc65..fde33e997 100644 --- a/lib/models_new/fav/fav_note/list.dart +++ b/lib/models_new/fav/fav_note/list.dart @@ -1,5 +1,4 @@ -import 'package:PiliPlus/pages/common/multi_select_controller.dart' - show MultiSelectData; +import 'package:PiliPlus/pages/common/multi_select/base.dart'; class FavNoteItemModel with MultiSelectData { FavNoteItemModel({ diff --git a/lib/models_new/fav/fav_pgc/list.dart b/lib/models_new/fav/fav_pgc/list.dart index 106abca8f..e902670cc 100644 --- a/lib/models_new/fav/fav_pgc/list.dart +++ b/lib/models_new/fav/fav_pgc/list.dart @@ -11,8 +11,7 @@ import 'package:PiliPlus/models_new/fav/fav_pgc/rights.dart'; import 'package:PiliPlus/models_new/fav/fav_pgc/section.dart'; import 'package:PiliPlus/models_new/fav/fav_pgc/series.dart'; import 'package:PiliPlus/models_new/fav/fav_pgc/stat.dart'; -import 'package:PiliPlus/pages/common/multi_select_controller.dart' - show MultiSelectData; +import 'package:PiliPlus/pages/common/multi_select/base.dart'; class FavPgcItemModel with MultiSelectData { int? seasonId; diff --git a/lib/models_new/history/list.dart b/lib/models_new/history/list.dart index b428a7c61..1633da42f 100644 --- a/lib/models_new/history/list.dart +++ b/lib/models_new/history/list.dart @@ -1,6 +1,5 @@ import 'package:PiliPlus/models_new/history/history.dart'; -import 'package:PiliPlus/pages/common/multi_select_controller.dart' - show MultiSelectData; +import 'package:PiliPlus/pages/common/multi_select/base.dart'; class HistoryItemModel with MultiSelectData { String? title; diff --git a/lib/models_new/later/list.dart b/lib/models_new/later/list.dart index 6336374d7..d76267a82 100644 --- a/lib/models_new/later/list.dart +++ b/lib/models_new/later/list.dart @@ -4,8 +4,7 @@ import 'package:PiliPlus/models_new/later/owner.dart'; import 'package:PiliPlus/models_new/later/page.dart'; import 'package:PiliPlus/models_new/later/rights.dart'; import 'package:PiliPlus/models_new/later/stat.dart'; -import 'package:PiliPlus/pages/common/multi_select_controller.dart' - show MultiSelectData; +import 'package:PiliPlus/pages/common/multi_select/base.dart'; class LaterItemModel with MultiSelectData { int? aid; diff --git a/lib/pages/common/common_intro_controller.dart b/lib/pages/common/common_intro_controller.dart index a873fc927..2feb768b9 100644 --- a/lib/pages/common/common_intro_controller.dart +++ b/lib/pages/common/common_intro_controller.dart @@ -270,7 +270,7 @@ abstract class CommonIntroController extends GetxController { Future viewLater() async { var res = await (hasLater.value - ? UserHttp.toViewDel(aids: [IdUtils.bv2av(bvid)]) + ? UserHttp.toViewDel(aids: IdUtils.bv2av(bvid).toString()) : await UserHttp.toViewLater(bvid: bvid)); if (res['status']) hasLater.value = !hasLater.value; SmartDialog.showToast(res['msg']); diff --git a/lib/pages/common/multi_select_controller.dart b/lib/pages/common/multi_select/base.dart similarity index 88% rename from lib/pages/common/multi_select_controller.dart rename to lib/pages/common/multi_select/base.dart index 1ed9bd5bf..09dd633a8 100644 --- a/lib/pages/common/multi_select_controller.dart +++ b/lib/pages/common/multi_select/base.dart @@ -14,13 +14,9 @@ abstract class MultiSelectBase { void onSelect(T item, [bool disableSelect = true]); void handleSelect([bool checked = false, bool disableSelect = true]); - void onConfirm(); + void onRemove(); } -abstract class MultiSelectController - extends CommonListController - with CommonMultiSelectMixin, DeleteItemMixin {} - mixin CommonMultiSelectMixin implements MultiSelectBase { @override @@ -76,15 +72,16 @@ mixin CommonMultiSelectMixin mixin DeleteItemMixin on CommonListController, CommonMultiSelectMixin { - Future afterDelete(Set result) async { - // TODO: result require hash - final remainList = loadingState.value.data!; - if (result.length == 1) { - remainList.remove(result.single); + Future afterDelete(Iterable removeList) async { + final list = loadingState.value.data!; + if (removeList.length == list.length) { + list.clear(); + } else if (removeList.length == 1) { + list.remove(removeList.single); } else { - remainList.removeWhere(result.contains); + list.removeWhere(removeList.contains); } - if (remainList.isNotEmpty) { + if (list.isNotEmpty) { loadingState.refresh(); } else if (!isEnd) { onReload(); diff --git a/lib/pages/common/multi_select/multi_select_controller.dart b/lib/pages/common/multi_select/multi_select_controller.dart new file mode 100644 index 000000000..8b69a815c --- /dev/null +++ b/lib/pages/common/multi_select/multi_select_controller.dart @@ -0,0 +1,6 @@ +import 'package:PiliPlus/pages/common/common_list_controller.dart'; +import 'package:PiliPlus/pages/common/multi_select/base.dart'; + +abstract class MultiSelectController + extends CommonListController + with CommonMultiSelectMixin, DeleteItemMixin {} diff --git a/lib/pages/common/common_search_controller.dart b/lib/pages/common/search/common_search_controller.dart similarity index 100% rename from lib/pages/common/common_search_controller.dart rename to lib/pages/common/search/common_search_controller.dart diff --git a/lib/pages/common/common_search_page.dart b/lib/pages/common/search/common_search_page.dart similarity index 96% rename from lib/pages/common/common_search_page.dart rename to lib/pages/common/search/common_search_page.dart index 65999866a..5d8b66de4 100644 --- a/lib/pages/common/common_search_page.dart +++ b/lib/pages/common/search/common_search_page.dart @@ -1,8 +1,8 @@ import 'package:PiliPlus/common/widgets/appbar/appbar.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/http/loading_state.dart'; -import 'package:PiliPlus/pages/common/common_search_controller.dart'; -import 'package:PiliPlus/pages/common/multi_select_controller.dart'; +import 'package:PiliPlus/pages/common/search/common_search_controller.dart'; +import 'package:PiliPlus/pages/common/multi_select/base.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; diff --git a/lib/pages/common/common_collapse_slide_page.dart b/lib/pages/common/slide/common_collapse_slide_page.dart similarity index 91% rename from lib/pages/common/common_collapse_slide_page.dart rename to lib/pages/common/slide/common_collapse_slide_page.dart index 955105cf2..f684bc78a 100644 --- a/lib/pages/common/common_collapse_slide_page.dart +++ b/lib/pages/common/slide/common_collapse_slide_page.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/pages/common/common_slide_page.dart'; +import 'package:PiliPlus/pages/common/slide/common_slide_page.dart'; import 'package:flutter/material.dart'; abstract class CommonCollapseSlidePage extends CommonSlidePage { diff --git a/lib/pages/common/common_slide_page.dart b/lib/pages/common/slide/common_slide_page.dart similarity index 100% rename from lib/pages/common/common_slide_page.dart rename to lib/pages/common/slide/common_slide_page.dart diff --git a/lib/pages/episode_panel/view.dart b/lib/pages/episode_panel/view.dart index 88ba8de94..256335194 100644 --- a/lib/pages/episode_panel/view.dart +++ b/lib/pages/episode_panel/view.dart @@ -20,7 +20,7 @@ import 'package:PiliPlus/models_new/pgc/pgc_info_model/episode.dart' as pgc; import 'package:PiliPlus/models_new/video/video_detail/episode.dart' as ugc; import 'package:PiliPlus/models_new/video/video_detail/page.dart'; import 'package:PiliPlus/models_new/video/video_relation/data.dart'; -import 'package:PiliPlus/pages/common/common_slide_page.dart'; +import 'package:PiliPlus/pages/common/slide/common_slide_page.dart'; import 'package:PiliPlus/pages/video/controller.dart'; import 'package:PiliPlus/pages/video/introduction/ugc/controller.dart'; import 'package:PiliPlus/pages/video/introduction/ugc/widgets/page.dart'; diff --git a/lib/pages/fav/note/child_view.dart b/lib/pages/fav/note/child_view.dart index b3aac48ce..f9c68983e 100644 --- a/lib/pages/fav/note/child_view.dart +++ b/lib/pages/fav/note/child_view.dart @@ -119,7 +119,7 @@ class _FavNoteChildPageState extends State showConfirmDialog( context: context, title: '确定删除已选中的笔记吗?', - onConfirm: _favNoteController.onConfirm, + onConfirm: _favNoteController.onRemove, ); } }, diff --git a/lib/pages/fav/note/controller.dart b/lib/pages/fav/note/controller.dart index 19996e02e..1d08fa04e 100644 --- a/lib/pages/fav/note/controller.dart +++ b/lib/pages/fav/note/controller.dart @@ -1,7 +1,7 @@ import 'package:PiliPlus/http/fav.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models_new/fav/fav_note/list.dart'; -import 'package:PiliPlus/pages/common/multi_select_controller.dart'; +import 'package:PiliPlus/pages/common/multi_select/multi_select_controller.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; class FavNoteController @@ -35,11 +35,13 @@ class FavNoteController } @override - Future onConfirm() async { - Set removeList = allChecked.toSet(); + Future onRemove() async { + final removeList = allChecked; final res = await FavHttp.delNote( isPublish: isPublish, - noteIds: removeList.map((item) => isPublish ? item.cvid : item.noteId), + noteIds: removeList + .map((item) => isPublish ? item.cvid : item.noteId) + .join(','), ); if (res['status']) { afterDelete(removeList); diff --git a/lib/pages/fav/pgc/controller.dart b/lib/pages/fav/pgc/controller.dart index 83f5dba5d..8cacfffa0 100644 --- a/lib/pages/fav/pgc/controller.dart +++ b/lib/pages/fav/pgc/controller.dart @@ -3,7 +3,7 @@ import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/video.dart'; import 'package:PiliPlus/models_new/fav/fav_pgc/data.dart'; import 'package:PiliPlus/models_new/fav/fav_pgc/list.dart'; -import 'package:PiliPlus/pages/common/multi_select_controller.dart'; +import 'package:PiliPlus/pages/common/multi_select/multi_select_controller.dart'; import 'package:PiliPlus/utils/accounts.dart'; import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/material.dart'; @@ -66,29 +66,29 @@ class FavPgcController } @override - void onConfirm() { + void onRemove() { assert(false, 'call onUpdateList'); } Future onUpdateList(int followStatus) async { - final updateList = allChecked.toSet(); + final removeList = allChecked; final res = await VideoHttp.pgcUpdate( - seasonId: updateList.map((item) => item.seasonId).toList(), + seasonId: removeList.map((item) => item.seasonId).join(','), status: followStatus, ); if (res['status']) { - afterDelete(updateList); try { final ctr = Get.find(tag: '$type$followStatus'); if (ctr.loadingState.value.isSuccess) { ctr.loadingState ..value.data!.insertAll( 0, - updateList.map((item) => item..checked = null), + removeList.map((item) => item..checked = null), ) ..refresh(); ctr.allSelected.value = false; } + afterDelete(removeList); } catch (e) { if (kDebugMode) debugPrint('fav pgc onUpdate: $e'); } @@ -98,7 +98,7 @@ class FavPgcController Future onUpdate(int index, int followStatus, int? seasonId) async { var result = await VideoHttp.pgcUpdate( - seasonId: [seasonId], + seasonId: seasonId.toString(), status: followStatus, ); if (result['status']) { diff --git a/lib/pages/fav/pgc/widget/item.dart b/lib/pages/fav/pgc/widget/item.dart index 2fa0339f4..6672abd8d 100644 --- a/lib/pages/fav/pgc/widget/item.dart +++ b/lib/pages/fav/pgc/widget/item.dart @@ -4,7 +4,7 @@ import 'package:PiliPlus/common/widgets/button/icon_button.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/models/common/badge_type.dart'; import 'package:PiliPlus/models_new/fav/fav_pgc/list.dart'; -import 'package:PiliPlus/pages/common/multi_select_controller.dart'; +import 'package:PiliPlus/pages/common/multi_select/base.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:flutter/material.dart'; diff --git a/lib/pages/fav_detail/controller.dart b/lib/pages/fav_detail/controller.dart index e6a4f6b56..da72d7633 100644 --- a/lib/pages/fav_detail/controller.dart +++ b/lib/pages/fav_detail/controller.dart @@ -7,7 +7,8 @@ import 'package:PiliPlus/models_new/fav/fav_detail/data.dart'; import 'package:PiliPlus/models_new/fav/fav_detail/media.dart'; import 'package:PiliPlus/models_new/fav/fav_folder/list.dart'; import 'package:PiliPlus/pages/common/common_list_controller.dart'; -import 'package:PiliPlus/pages/common/multi_select_controller.dart'; +import 'package:PiliPlus/pages/common/multi_select/base.dart'; +import 'package:PiliPlus/pages/common/multi_select/multi_select_controller.dart'; import 'package:PiliPlus/pages/fav_sort/view.dart'; import 'package:PiliPlus/services/account_service.dart'; import 'package:PiliPlus/utils/extension.dart'; @@ -22,7 +23,7 @@ mixin BaseFavController bool get isOwner; int get mediaId; - void onRemove(int count) {} + void updateLength(int count) {} void onViewFav(FavDetailItemModel item, int? index); @@ -35,7 +36,7 @@ mixin BaseFavController loadingState ..value.data!.removeAt(index) ..refresh(); - onRemove(1); + updateLength(1); SmartDialog.showToast('取消收藏'); } else { SmartDialog.showToast(result['msg']); @@ -43,20 +44,22 @@ mixin BaseFavController } @override - void onConfirm() { + void onRemove() { showConfirmDialog( context: Get.context!, content: '确认删除所选收藏吗?', title: '提示', onConfirm: () async { - final checked = allChecked.toSet(); + final removeList = allChecked; var result = await FavHttp.favVideo( - resources: checked.map((item) => '${item.id}:${item.type}').join(','), + resources: removeList + .map((item) => '${item.id}:${item.type}') + .join(','), delIds: mediaId.toString(), ); if (result['status']) { - afterDelete(checked); - onRemove(checked.length); + updateLength(removeList.length); + afterDelete(removeList); SmartDialog.showToast('取消收藏'); } else { SmartDialog.showToast(result['msg']); @@ -120,7 +123,7 @@ class FavDetailController } @override - void onRemove(int count) { + void updateLength(int count) { folderInfo ..value.mediaCount -= count ..refresh(); diff --git a/lib/pages/fav_detail/view.dart b/lib/pages/fav_detail/view.dart index 0fc6e4f32..a4ad0270d 100644 --- a/lib/pages/fav_detail/view.dart +++ b/lib/pages/fav_detail/view.dart @@ -249,7 +249,7 @@ class _FavDetailPageState extends State { context: context, title: '确定删除该收藏夹?', onConfirm: () => - FavHttp.deleteFolder(mediaIds: [mediaId]).then((res) { + FavHttp.deleteFolder(mediaIds: mediaId).then((res) { if (res['status']) { SmartDialog.showToast('删除成功'); Get.back(result: true); @@ -324,7 +324,7 @@ class _FavDetailPageState extends State { style: TextButton.styleFrom( visualDensity: VisualDensity.compact, ), - onPressed: _favDetailController.onConfirm, + onPressed: _favDetailController.onRemove, child: Text( '删除', style: TextStyle(color: theme.colorScheme.error), diff --git a/lib/pages/fav_folder_sort/view.dart b/lib/pages/fav_folder_sort/view.dart index a66da86c0..630ced2c2 100644 --- a/lib/pages/fav_folder_sort/view.dart +++ b/lib/pages/fav_folder_sort/view.dart @@ -33,7 +33,7 @@ class _FavFolderSortPageState extends State { TextButton( onPressed: () async { var res = await FavHttp.sortFavFolder( - sort: sortList.map((item) => item.id).toList(), + sort: sortList.map((item) => item.id).join(','), ); if (res['status']) { SmartDialog.showToast('排序完成'); diff --git a/lib/pages/fav_search/controller.dart b/lib/pages/fav_search/controller.dart index 391816dd5..deb26fcd7 100644 --- a/lib/pages/fav_search/controller.dart +++ b/lib/pages/fav_search/controller.dart @@ -4,8 +4,8 @@ import 'package:PiliPlus/models/common/fav_order_type.dart'; import 'package:PiliPlus/models/common/video/source_type.dart'; import 'package:PiliPlus/models_new/fav/fav_detail/data.dart'; import 'package:PiliPlus/models_new/fav/fav_detail/media.dart'; -import 'package:PiliPlus/pages/common/common_search_controller.dart'; -import 'package:PiliPlus/pages/common/multi_select_controller.dart'; +import 'package:PiliPlus/pages/common/multi_select/base.dart'; +import 'package:PiliPlus/pages/common/search/common_search_controller.dart'; import 'package:PiliPlus/pages/fav_detail/controller.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:get/get.dart'; diff --git a/lib/pages/fav_search/view.dart b/lib/pages/fav_search/view.dart index e58ccba74..759a851fe 100644 --- a/lib/pages/fav_search/view.dart +++ b/lib/pages/fav_search/view.dart @@ -1,7 +1,7 @@ import 'package:PiliPlus/models/common/fav_order_type.dart'; import 'package:PiliPlus/models_new/fav/fav_detail/data.dart'; import 'package:PiliPlus/models_new/fav/fav_detail/media.dart'; -import 'package:PiliPlus/pages/common/common_search_page.dart'; +import 'package:PiliPlus/pages/common/search/common_search_page.dart'; import 'package:PiliPlus/pages/fav_detail/widget/fav_video_card.dart'; import 'package:PiliPlus/pages/fav_search/controller.dart'; import 'package:PiliPlus/utils/grid.dart'; diff --git a/lib/pages/fav_sort/view.dart b/lib/pages/fav_sort/view.dart index d80890872..f6f49a6e4 100644 --- a/lib/pages/fav_sort/view.dart +++ b/lib/pages/fav_sort/view.dart @@ -79,7 +79,7 @@ class _FavSortPageState extends State { } var res = await FavHttp.sortFav( mediaId: _favDetailController.mediaId, - sort: sort, + sort: sort.join(','), ); if (res['status']) { SmartDialog.showToast('排序完成'); diff --git a/lib/pages/follow_search/controller.dart b/lib/pages/follow_search/controller.dart index 347e9bc63..979384137 100644 --- a/lib/pages/follow_search/controller.dart +++ b/lib/pages/follow_search/controller.dart @@ -2,7 +2,7 @@ import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/member.dart'; import 'package:PiliPlus/models_new/follow/data.dart'; import 'package:PiliPlus/models_new/follow/list.dart'; -import 'package:PiliPlus/pages/common/common_search_controller.dart'; +import 'package:PiliPlus/pages/common/search/common_search_controller.dart'; class FollowSearchController extends CommonSearchController { diff --git a/lib/pages/follow_search/view.dart b/lib/pages/follow_search/view.dart index be1b935c2..b7c6a966f 100644 --- a/lib/pages/follow_search/view.dart +++ b/lib/pages/follow_search/view.dart @@ -1,6 +1,6 @@ import 'package:PiliPlus/models_new/follow/data.dart'; import 'package:PiliPlus/models_new/follow/list.dart'; -import 'package:PiliPlus/pages/common/common_search_page.dart'; +import 'package:PiliPlus/pages/common/search/common_search_page.dart'; import 'package:PiliPlus/pages/follow/widgets/follow_item.dart'; import 'package:PiliPlus/pages/follow_search/controller.dart'; import 'package:PiliPlus/utils/utils.dart'; diff --git a/lib/pages/group_panel/view.dart b/lib/pages/group_panel/view.dart index 6ec4e61db..f611e81bf 100644 --- a/lib/pages/group_panel/view.dart +++ b/lib/pages/group_panel/view.dart @@ -75,7 +75,10 @@ class _GroupPanelState extends State { tagidList = [0]; } // 保存 - final res = await MemberHttp.addUsers([widget.mid], tagidList); + final res = await MemberHttp.addUsers( + widget.mid.toString(), + tagidList.join(','), + ); SmartDialog.showToast(res['msg']); if (res['status']) { Get.back(result: tagidList); diff --git a/lib/pages/history/controller.dart b/lib/pages/history/controller.dart index 9e8c096e1..8ae9f1052 100644 --- a/lib/pages/history/controller.dart +++ b/lib/pages/history/controller.dart @@ -4,7 +4,7 @@ import 'package:PiliPlus/http/user.dart'; import 'package:PiliPlus/models_new/history/data.dart'; import 'package:PiliPlus/models_new/history/list.dart'; import 'package:PiliPlus/models_new/history/tab.dart'; -import 'package:PiliPlus/pages/common/multi_select_controller.dart'; +import 'package:PiliPlus/pages/common/multi_select/multi_select_controller.dart'; import 'package:PiliPlus/pages/history/base_controller.dart'; import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/storage.dart'; @@ -89,26 +89,28 @@ class HistoryController } // 删除已看历史记录 - void onDelHistory() { + void onDelViewedHistory() { if (loadingState.value.isSuccess) { - final set = loadingState.value.data! - .where((e) => e.progress == -1) - .toSet(); - if (set.isNotEmpty) { - _onDelete(set); + final viewedList = loadingState.value.data!.where( + (e) => e.progress == -1, + ); + if (viewedList.isNotEmpty) { + _onDelete(viewedList); } else { SmartDialog.showToast('无已看记录'); } } } - Future _onDelete(Set result) async { + Future _onDelete(Iterable removeList) async { SmartDialog.showLoading(msg: '请求中'); final response = await UserHttp.delHistory( - result.map((item) => '${item.history.business}_${item.kid}'), + removeList + .map((item) => '${item.history.business}_${item.kid}') + .join(','), ); if (response['status']) { - afterDelete(result); + afterDelete(removeList); } SmartDialog.dismiss(); SmartDialog.showToast(response['msg']); @@ -116,12 +118,12 @@ class HistoryController // 删除选中的记录 @override - void onConfirm() { + void onRemove() { showConfirmDialog( context: Get.context!, content: '确认删除所选历史记录吗?', title: '提示', - onConfirm: () => _onDelete(allChecked.toSet()), + onConfirm: () => _onDelete(allChecked), ); } diff --git a/lib/pages/history/view.dart b/lib/pages/history/view.dart index 78b7fdbb0..b02977c85 100644 --- a/lib/pages/history/view.dart +++ b/lib/pages/history/view.dart @@ -52,189 +52,175 @@ class _HistoryPageState extends State @override Widget build(BuildContext context) { super.build(context); - return widget.type != null - ? _buildPage - : Obx( - () { - final enableMultiSelect = - _historyController.baseCtr.enableMultiSelect.value; - return PopScope( - canPop: !enableMultiSelect, - onPopInvokedWithResult: (didPop, result) { - if (enableMultiSelect) { - currCtr().handleSelect(); - } - }, - child: Scaffold( - appBar: MultiSelectAppBarWidget( - visible: enableMultiSelect, - ctr: currCtr(), - child: AppBar( - title: const Text('观看记录'), - bottom: _buildPauseTip, - actions: [ - IconButton( - tooltip: '搜索', - onPressed: () => Get.toNamed('/historySearch'), - icon: const Icon(Icons.search_outlined), + Widget child = refreshIndicator( + onRefresh: _historyController.onRefresh, + child: CustomScrollView( + physics: const AlwaysScrollableScrollPhysics(), + controller: _historyController.scrollController, + slivers: [ + SliverPadding( + padding: EdgeInsets.only( + top: StyleString.safeSpace - 5, + bottom: MediaQuery.paddingOf(context).bottom + 80, + ), + sliver: Obx( + () => _buildBody(_historyController.loadingState.value), + ), + ), + ], + ), + ); + if (widget.type != null) { + return child; + } + return Obx( + () { + final enableMultiSelect = + _historyController.baseCtr.enableMultiSelect.value; + return PopScope( + canPop: !enableMultiSelect, + onPopInvokedWithResult: (didPop, result) { + if (enableMultiSelect) { + currCtr().handleSelect(); + } + }, + child: Scaffold( + appBar: MultiSelectAppBarWidget( + visible: enableMultiSelect, + ctr: currCtr(), + child: _buildAppBar, + ), + body: Obx(() { + if (_historyController.tabs.isEmpty) { + return SafeArea( + top: false, + bottom: false, + child: child, + ); + } + return SafeArea( + top: false, + bottom: false, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + TabBar( + controller: _historyController.tabController, + onTap: (index) { + if (!_historyController + .tabController! + .indexIsChanging) { + currCtr().scrollController.animToTop(); + } else { + if (enableMultiSelect) { + currCtr( + _historyController.tabController!.previousIndex, + ).handleSelect(); + } + } + }, + tabs: [ + const Tab(text: '全部'), + ..._historyController.tabs.map( + (item) => Tab(text: item.name), ), - PopupMenuButton( - onSelected: (String type) { - // 处理菜单项选择的逻辑 - switch (type) { - case 'pause': - _historyController.baseCtr.onPauseHistory( - context, - ); - break; - case 'clear': - _historyController.baseCtr.onClearHistory( - context, - () { - _historyController.loadingState.value = - const Success( - null, - ); - if (_historyController.tabController != - null) { - for (final item - in _historyController.tabs) { - try { - Get.find( - tag: item.type, - ).loadingState.value = const Success( - null, - ); - } catch (_) {} - } - } - }, - ); - break; - case 'del': - currCtr().onDelHistory(); - break; - case 'multiple': - _historyController - .baseCtr - .enableMultiSelect - .value = - true; - break; - } - }, - itemBuilder: (BuildContext context) => - >[ - PopupMenuItem( - value: 'pause', - child: Obx( - () => Text( - !_historyController - .baseCtr - .pauseStatus - .value - ? '暂停观看记录' - : '恢复观看记录', - ), - ), - ), - const PopupMenuItem( - value: 'clear', - child: Text('清空观看记录'), - ), - const PopupMenuItem( - value: 'del', - child: Text('删除已看记录'), - ), - const PopupMenuItem( - value: 'multiple', - child: Text('多选删除'), - ), - ], - ), - const SizedBox(width: 6), ], ), - ), - body: Obx( - () => _historyController.tabs.isNotEmpty - ? SafeArea( - top: false, - bottom: false, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - TabBar( - controller: _historyController.tabController, - onTap: (index) { - if (!_historyController - .tabController! - .indexIsChanging) { - currCtr().scrollController.animToTop(); - } else { - if (enableMultiSelect) { - currCtr( - _historyController - .tabController! - .previousIndex, - ).handleSelect(); - } - } - }, - tabs: [ - const Tab(text: '全部'), - ..._historyController.tabs.map( - (item) => Tab(text: item.name), - ), - ], - ), - Expanded( - child: TabBarView( - physics: enableMultiSelect - ? const NeverScrollableScrollPhysics() - : const CustomTabBarViewScrollPhysics(), - controller: - _historyController.tabController, - children: [ - KeepAliveWrapper( - builder: (context) => _buildPage, - ), - ..._historyController.tabs.map( - (item) => HistoryPage(type: item.type), - ), - ], - ), - ), - ], - ), - ) - : SafeArea( - top: false, - bottom: false, - child: _buildPage, + Expanded( + child: TabBarView( + physics: enableMultiSelect + ? const NeverScrollableScrollPhysics() + : const CustomTabBarViewScrollPhysics(), + controller: _historyController.tabController, + children: [ + KeepAliveWrapper(builder: (context) => child), + ..._historyController.tabs.map( + (item) => HistoryPage(type: item.type), ), - ), + ], + ), + ), + ], ), ); - }, - ); + }), + ), + ); + }, + ); } - Widget get _buildPage => refreshIndicator( - onRefresh: _historyController.onRefresh, - child: CustomScrollView( - physics: const AlwaysScrollableScrollPhysics(), - controller: _historyController.scrollController, - slivers: [ - SliverPadding( - padding: EdgeInsets.only( - top: StyleString.safeSpace - 5, - bottom: MediaQuery.paddingOf(context).bottom + 80, + AppBar get _buildAppBar => AppBar( + title: const Text('观看记录'), + bottom: _buildPauseTip, + actions: [ + IconButton( + tooltip: '搜索', + onPressed: () => Get.toNamed('/historySearch'), + icon: const Icon(Icons.search_outlined), + ), + PopupMenuButton( + onSelected: (String type) { + switch (type) { + case 'pause': + _historyController.baseCtr.onPauseHistory( + context, + ); + break; + case 'clear': + _historyController.baseCtr.onClearHistory( + context, + () { + _historyController.loadingState.value = const Success( + null, + ); + if (_historyController.tabController != null) { + for (final item in _historyController.tabs) { + try { + Get.find( + tag: item.type, + ).loadingState.value = const Success( + null, + ); + } catch (_) {} + } + } + }, + ); + break; + case 'viewed': + currCtr().onDelViewedHistory(); + break; + case 'multiple': + _historyController.baseCtr.enableMultiSelect.value = true; + break; + } + }, + itemBuilder: (BuildContext context) => >[ + PopupMenuItem( + value: 'pause', + child: Text( + !_historyController.baseCtr.pauseStatus.value + ? '暂停观看记录' + : '恢复观看记录', + ), ), - sliver: Obx(() => _buildBody(_historyController.loadingState.value)), - ), - ], - ), + const PopupMenuItem( + value: 'clear', + child: Text('清空观看记录'), + ), + const PopupMenuItem( + value: 'viewed', + child: Text('删除已看记录'), + ), + const PopupMenuItem( + value: 'multiple', + child: Text('多选删除'), + ), + ], + ), + const SizedBox(width: 6), + ], ); Widget _buildBody(LoadingState?> loadingState) { diff --git a/lib/pages/history/widgets/item.dart b/lib/pages/history/widgets/item.dart index aaab4ceaa..c5c1868bd 100644 --- a/lib/pages/history/widgets/item.dart +++ b/lib/pages/history/widgets/item.dart @@ -8,7 +8,7 @@ import 'package:PiliPlus/http/user.dart'; import 'package:PiliPlus/models/common/badge_type.dart'; import 'package:PiliPlus/models/common/history_business_type.dart'; import 'package:PiliPlus/models_new/history/list.dart'; -import 'package:PiliPlus/pages/common/multi_select_controller.dart'; +import 'package:PiliPlus/pages/common/multi_select/base.dart'; import 'package:PiliPlus/utils/date_util.dart'; import 'package:PiliPlus/utils/duration_util.dart'; import 'package:PiliPlus/utils/id_utils.dart'; @@ -37,65 +37,63 @@ class HistoryItem extends StatelessWidget { int aid = item.history.oid!; String bvid = item.history.bvid ?? IdUtils.av2bv(aid); final business = item.history.business; + final enableMultiSelect = ctr.enableMultiSelect.value; return Material( type: MaterialType.transparency, child: InkWell( - onTap: () async { - if (ctr.enableMultiSelect.value) { - ctr.onSelect(item); - return; - } - if (business?.contains('article') == true) { - PageUtils.toDupNamed( - '/articlePage', - parameters: { - 'id': business == 'article-list' - ? '${item.history.cid}' - : '${item.history.oid}', - 'type': 'read', + onTap: enableMultiSelect + ? () => ctr.onSelect(item) + : () async { + if (business?.contains('article') == true) { + PageUtils.toDupNamed( + '/articlePage', + parameters: { + 'id': business == 'article-list' + ? '${item.history.cid}' + : '${item.history.oid}', + 'type': 'read', + }, + ); + } else if (business == 'live') { + if (item.liveStatus == 1) { + PageUtils.toLiveRoom(item.history.oid); + } else { + SmartDialog.showToast('直播未开播'); + } + } else if (business == 'pgc') { + PageUtils.viewPgc(epId: item.history.epid); + } else if (business == 'cheese') { + if (item.uri?.isNotEmpty == true) { + PageUtils.viewPgcFromUri( + item.uri!, + isPgc: false, + aid: item.history.oid, + ); + } + } else { + int? cid = + item.history.cid ?? + await SearchHttp.ab2c( + aid: aid, + bvid: bvid, + part: item.history.page, + ); + if (cid != null) { + PageUtils.toVideoPage( + aid: aid, + bvid: bvid, + cid: cid, + cover: item.cover, + title: item.title, + ); + } + } }, - ); - } else if (business == 'live') { - if (item.liveStatus == 1) { - PageUtils.toLiveRoom(item.history.oid); - } else { - SmartDialog.showToast('直播未开播'); - } - } else if (business == 'pgc') { - PageUtils.viewPgc(epId: item.history.epid); - } else if (business == 'cheese') { - if (item.uri?.isNotEmpty == true) { - PageUtils.viewPgcFromUri( - item.uri!, - isPgc: false, - aid: item.history.oid, - ); - } - } else { - int? cid = - item.history.cid ?? - await SearchHttp.ab2c( - aid: aid, - bvid: bvid, - part: item.history.page, - ); - if (cid != null) { - PageUtils.toVideoPage( - aid: aid, - bvid: bvid, - cid: cid, - cover: item.cover, - title: item.title, - ); - } - } - }, - onLongPress: ctr.enableMultiSelect.value + onLongPress: enableMultiSelect ? null - : () { - ctr.enableMultiSelect.value = true; - ctr.onSelect(item); - }, + : () => ctr + ..enableMultiSelect.value = true + ..onSelect(item), child: Stack( clipBehavior: Clip.none, children: [ diff --git a/lib/pages/history_search/controller.dart b/lib/pages/history_search/controller.dart index 0f7a9e22e..00ca87ca6 100644 --- a/lib/pages/history_search/controller.dart +++ b/lib/pages/history_search/controller.dart @@ -3,8 +3,8 @@ import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/user.dart'; import 'package:PiliPlus/models_new/history/data.dart'; import 'package:PiliPlus/models_new/history/list.dart'; -import 'package:PiliPlus/pages/common/common_search_controller.dart'; -import 'package:PiliPlus/pages/common/multi_select_controller.dart'; +import 'package:PiliPlus/pages/common/multi_select/base.dart'; +import 'package:PiliPlus/pages/common/search/common_search_controller.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; @@ -23,16 +23,7 @@ class HistorySearchController } Future onDelHistory(int index, kid, String business) async { - final String resKid; - if (business == 'live') { - resKid = 'live_$kid'; - } else if (business.contains('article')) { - resKid = 'article_$kid'; - } else { - resKid = 'archive_$kid'; - } - - var res = await UserHttp.delHistory([resKid]); + var res = await UserHttp.delHistory('${business}_$kid'); if (res['status']) { loadingState ..value.data!.removeAt(index) @@ -42,20 +33,21 @@ class HistorySearchController } @override - void onConfirm() { + void onRemove() { showConfirmDialog( context: Get.context!, content: '确认删除所选历史记录吗?', title: '提示', onConfirm: () async { SmartDialog.showLoading(msg: '请求中'); - final result = allChecked.toSet(); - final kidList = result.map( - (item) => '${item.history.business!}_${item.kid!}', + final removeList = allChecked; + var response = await UserHttp.delHistory( + removeList + .map((item) => '${item.history.business!}_${item.kid!}') + .join(','), ); - var response = await UserHttp.delHistory(kidList); if (response['status']) { - afterDelete(result); + afterDelete(removeList); } SmartDialog.dismiss(); SmartDialog.showToast(response['msg']); diff --git a/lib/pages/history_search/view.dart b/lib/pages/history_search/view.dart index fcc3561e7..8b44c5b95 100644 --- a/lib/pages/history_search/view.dart +++ b/lib/pages/history_search/view.dart @@ -1,6 +1,6 @@ import 'package:PiliPlus/models_new/history/data.dart'; import 'package:PiliPlus/models_new/history/list.dart'; -import 'package:PiliPlus/pages/common/common_search_page.dart'; +import 'package:PiliPlus/pages/common/search/common_search_page.dart'; import 'package:PiliPlus/pages/history/widgets/item.dart'; import 'package:PiliPlus/pages/history_search/controller.dart'; import 'package:PiliPlus/utils/grid.dart'; diff --git a/lib/pages/later/controller.dart b/lib/pages/later/controller.dart index 6d948f55c..2746f9def 100644 --- a/lib/pages/later/controller.dart +++ b/lib/pages/later/controller.dart @@ -5,7 +5,7 @@ import 'package:PiliPlus/models/common/later_view_type.dart'; import 'package:PiliPlus/models/common/video/source_type.dart'; import 'package:PiliPlus/models_new/later/data.dart'; import 'package:PiliPlus/models_new/later/list.dart'; -import 'package:PiliPlus/pages/common/multi_select_controller.dart'; +import 'package:PiliPlus/pages/common/multi_select/multi_select_controller.dart'; import 'package:PiliPlus/pages/later/base_controller.dart'; import 'package:PiliPlus/services/account_service.dart'; import 'package:PiliPlus/utils/extension.dart'; @@ -15,9 +15,7 @@ import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; class LaterController extends MultiSelectController { - LaterController( - this.laterViewType, - ); + LaterController(this.laterViewType); final LaterViewType laterViewType; AccountService accountService = Get.find(); @@ -77,7 +75,7 @@ class LaterController extends MultiSelectController { TextButton( onPressed: () async { Get.back(); - final res = await UserHttp.toViewDel(aids: {aid!}); + final res = await UserHttp.toViewDel(aids: aid.toString()); if (res['status']) { baseCtr.counts[laterViewType] = baseCtr.counts[laterViewType]! - 1; @@ -124,32 +122,28 @@ class LaterController extends MultiSelectController { } @override - void onConfirm() { + void onRemove() { showConfirmDialog( context: Get.context!, content: '确认删除所选稍后再看吗?', title: '提示', - onConfirm: () => _onDelete(allChecked.toSet()), + onConfirm: () async { + final removeList = allChecked; + SmartDialog.showLoading(msg: '请求中'); + final res = await UserHttp.toViewDel( + aids: removeList.map((item) => item.aid!).join(','), + ); + if (res['status']) { + baseCtr.counts[laterViewType] = + baseCtr.counts[laterViewType]! - removeList.length; + afterDelete(removeList); + } + SmartDialog.dismiss(); + SmartDialog.showToast(res['msg']); + }, ); } - Future _onDelete(Set result) async { - SmartDialog.showLoading(msg: '请求中'); - final res = await UserHttp.toViewDel(aids: result.map((item) => item.aid!)); - if (res['status']) { - afterDelete(result); - - baseCtr.counts[laterViewType] = - baseCtr.counts[laterViewType]! - result.length; - if (baseCtr.enableMultiSelect.value) { - baseCtr.checkedCount.value = 0; - baseCtr.enableMultiSelect.value = false; - } - } - SmartDialog.dismiss(); - SmartDialog.showToast(res['msg']); - } - // 稍后再看播放全部 void toViewPlayAll() { if (loadingState.value.isSuccess) { diff --git a/lib/pages/later_search/controller.dart b/lib/pages/later_search/controller.dart index a44352238..05da91054 100644 --- a/lib/pages/later_search/controller.dart +++ b/lib/pages/later_search/controller.dart @@ -3,8 +3,8 @@ import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/user.dart'; import 'package:PiliPlus/models_new/later/data.dart'; import 'package:PiliPlus/models_new/later/list.dart'; -import 'package:PiliPlus/pages/common/common_search_controller.dart'; -import 'package:PiliPlus/pages/common/multi_select_controller.dart'; +import 'package:PiliPlus/pages/common/multi_select/base.dart'; +import 'package:PiliPlus/pages/common/search/common_search_controller.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; @@ -27,7 +27,7 @@ class LaterSearchController } Future toViewDel(BuildContext context, int index, int aid) async { - var res = await UserHttp.toViewDel(aids: [aid]); + var res = await UserHttp.toViewDel(aids: aid.toString()); if (res['status']) { loadingState.value.data!.removeAt(index); loadingState.refresh(); @@ -36,19 +36,19 @@ class LaterSearchController } @override - void onConfirm() { + void onRemove() { showConfirmDialog( context: Get.context!, content: '确认删除所选稍后再看吗?', title: '提示', onConfirm: () async { - final result = allChecked.toSet(); + final removeList = allChecked; SmartDialog.showLoading(msg: '请求中'); var res = await UserHttp.toViewDel( - aids: result.map((item) => item.aid!), + aids: removeList.map((item) => item.aid).join(','), ); if (res['status']) { - afterDelete(result); + afterDelete(removeList); } SmartDialog.dismiss(); SmartDialog.showToast(res['msg']); diff --git a/lib/pages/later_search/view.dart b/lib/pages/later_search/view.dart index 21cec38ca..324f10b2c 100644 --- a/lib/pages/later_search/view.dart +++ b/lib/pages/later_search/view.dart @@ -1,7 +1,7 @@ import 'package:PiliPlus/models/common/video/source_type.dart'; import 'package:PiliPlus/models_new/later/data.dart'; import 'package:PiliPlus/models_new/later/list.dart'; -import 'package:PiliPlus/pages/common/common_search_page.dart'; +import 'package:PiliPlus/pages/common/search/common_search_page.dart'; import 'package:PiliPlus/pages/later/widgets/video_card_h_later.dart'; import 'package:PiliPlus/pages/later_search/controller.dart'; import 'package:PiliPlus/utils/grid.dart'; diff --git a/lib/pages/live_area/controller.dart b/lib/pages/live_area/controller.dart index 6ba2c150b..6f07adf35 100644 --- a/lib/pages/live_area/controller.dart +++ b/lib/pages/live_area/controller.dart @@ -47,7 +47,7 @@ class LiveAreaController Future setFavTag() async { if (favState.value.isSuccess) { final res = await LiveHttp.setLiveFavTag( - ids: favState.value.data.map((e) => e.id).toList(), + ids: favState.value.data.map((e) => e.id).join(','), ); if (res['status']) { isEditing.value = !isEditing.value; diff --git a/lib/pages/pgc_review/post/view.dart b/lib/pages/pgc_review/post/view.dart index f71252e84..bf2c22916 100644 --- a/lib/pages/pgc_review/post/view.dart +++ b/lib/pages/pgc_review/post/view.dart @@ -1,7 +1,7 @@ import 'package:PiliPlus/common/widgets/button/icon_button.dart'; import 'package:PiliPlus/common/widgets/custom_icon.dart'; import 'package:PiliPlus/http/pgc.dart'; -import 'package:PiliPlus/pages/common/common_collapse_slide_page.dart'; +import 'package:PiliPlus/pages/common/slide/common_collapse_slide_page.dart'; import 'package:PiliPlus/utils/accounts.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; diff --git a/lib/pages/setting/models/extra_settings.dart b/lib/pages/setting/models/extra_settings.dart index eab2544cc..c5ef41fe4 100644 --- a/lib/pages/setting/models/extra_settings.dart +++ b/lib/pages/setting/models/extra_settings.dart @@ -14,7 +14,7 @@ import 'package:PiliPlus/models/common/reply/reply_sort_type.dart'; import 'package:PiliPlus/models/common/settings_type.dart'; import 'package:PiliPlus/models/common/super_resolution_type.dart'; import 'package:PiliPlus/models/dynamics/result.dart'; -import 'package:PiliPlus/pages/common/common_slide_page.dart'; +import 'package:PiliPlus/pages/common/slide/common_slide_page.dart'; import 'package:PiliPlus/pages/home/controller.dart'; import 'package:PiliPlus/pages/hot/controller.dart'; import 'package:PiliPlus/pages/main/controller.dart'; diff --git a/lib/pages/video/ai_conclusion/view.dart b/lib/pages/video/ai_conclusion/view.dart index 93185eeb2..686c4e143 100644 --- a/lib/pages/video/ai_conclusion/view.dart +++ b/lib/pages/video/ai_conclusion/view.dart @@ -1,5 +1,5 @@ import 'package:PiliPlus/models_new/video/video_ai_conclusion/model_result.dart'; -import 'package:PiliPlus/pages/common/common_collapse_slide_page.dart'; +import 'package:PiliPlus/pages/common/slide/common_collapse_slide_page.dart'; import 'package:PiliPlus/pages/video/controller.dart'; import 'package:PiliPlus/utils/duration_util.dart'; import 'package:flutter/gestures.dart'; diff --git a/lib/pages/video/controller.dart b/lib/pages/video/controller.dart index 4137bcbb2..cb90a10d5 100644 --- a/lib/pages/video/controller.dart +++ b/lib/pages/video/controller.dart @@ -379,7 +379,7 @@ class VideoDetailController extends GetxController ? (item, index) async { if (sourceType == SourceType.watchLater) { var res = await UserHttp.toViewDel( - aids: [item.aid!], + aids: item.aid.toString(), ); if (res['status']) { mediaList.removeAt(index); diff --git a/lib/pages/video/introduction/pgc/controller.dart b/lib/pages/video/introduction/pgc/controller.dart index 68025ff41..adf944d8b 100644 --- a/lib/pages/video/introduction/pgc/controller.dart +++ b/lib/pages/video/introduction/pgc/controller.dart @@ -343,7 +343,7 @@ class PgcIntroController extends CommonIntroController { Future pgcUpdate(int status) async { var result = await VideoHttp.pgcUpdate( - seasonId: [pgcItem.seasonId], + seasonId: pgcItem.seasonId.toString(), status: status, ); if (result['status']) { diff --git a/lib/pages/video/introduction/pgc/widgets/intro_detail.dart b/lib/pages/video/introduction/pgc/widgets/intro_detail.dart index 1a348c699..a3f3c023c 100644 --- a/lib/pages/video/introduction/pgc/widgets/intro_detail.dart +++ b/lib/pages/video/introduction/pgc/widgets/intro_detail.dart @@ -6,7 +6,7 @@ import 'package:PiliPlus/common/widgets/stat/stat.dart'; import 'package:PiliPlus/models/common/stat_type.dart'; import 'package:PiliPlus/models_new/pgc/pgc_info_model/result.dart'; import 'package:PiliPlus/models_new/video/video_tag/data.dart'; -import 'package:PiliPlus/pages/common/common_collapse_slide_page.dart'; +import 'package:PiliPlus/pages/common/slide/common_collapse_slide_page.dart'; import 'package:PiliPlus/pages/pgc_review/view.dart'; import 'package:PiliPlus/pages/search/widgets/search_text.dart'; import 'package:PiliPlus/utils/extension.dart'; diff --git a/lib/pages/video/medialist/view.dart b/lib/pages/video/medialist/view.dart index 94b7e423e..e62be8731 100644 --- a/lib/pages/video/medialist/view.dart +++ b/lib/pages/video/medialist/view.dart @@ -10,7 +10,7 @@ import 'package:PiliPlus/models/common/badge_type.dart'; import 'package:PiliPlus/models/common/stat_type.dart'; import 'package:PiliPlus/models_new/media_list/media_list.dart'; import 'package:PiliPlus/models_new/video/video_detail/episode.dart'; -import 'package:PiliPlus/pages/common/common_collapse_slide_page.dart'; +import 'package:PiliPlus/pages/common/slide/common_collapse_slide_page.dart'; import 'package:PiliPlus/utils/duration_util.dart'; import 'package:flutter/material.dart' hide RefreshCallback; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; diff --git a/lib/pages/video/note/view.dart b/lib/pages/video/note/view.dart index af73866f9..b9f934150 100644 --- a/lib/pages/video/note/view.dart +++ b/lib/pages/video/note/view.dart @@ -6,7 +6,7 @@ import 'package:PiliPlus/common/widgets/refresh_indicator.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models/common/image_type.dart'; import 'package:PiliPlus/models_new/video/video_note_list/list.dart'; -import 'package:PiliPlus/pages/common/common_slide_page.dart'; +import 'package:PiliPlus/pages/common/slide/common_slide_page.dart'; import 'package:PiliPlus/pages/video/note/controller.dart'; import 'package:PiliPlus/pages/webview/view.dart'; import 'package:PiliPlus/utils/accounts.dart'; diff --git a/lib/pages/video/post_panel/view.dart b/lib/pages/video/post_panel/view.dart index 8c774d37e..33c6d3090 100644 --- a/lib/pages/video/post_panel/view.dart +++ b/lib/pages/video/post_panel/view.dart @@ -10,7 +10,7 @@ import 'package:PiliPlus/models/common/sponsor_block/action_type.dart'; import 'package:PiliPlus/models/common/sponsor_block/post_segment_model.dart'; import 'package:PiliPlus/models/common/sponsor_block/segment_type.dart'; import 'package:PiliPlus/models_new/sponsor_block/segment_item.dart'; -import 'package:PiliPlus/pages/common/common_collapse_slide_page.dart'; +import 'package:PiliPlus/pages/common/slide/common_collapse_slide_page.dart'; import 'package:PiliPlus/pages/video/controller.dart'; import 'package:PiliPlus/plugin/pl_player/controller.dart'; import 'package:PiliPlus/utils/duration_util.dart'; diff --git a/lib/pages/video/reply_reply/view.dart b/lib/pages/video/reply_reply/view.dart index edfa53279..73b3bc7d1 100644 --- a/lib/pages/video/reply_reply/view.dart +++ b/lib/pages/video/reply_reply/view.dart @@ -4,7 +4,7 @@ import 'package:PiliPlus/common/widgets/refresh_indicator.dart'; import 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart' show ReplyInfo, Mode; import 'package:PiliPlus/http/loading_state.dart'; -import 'package:PiliPlus/pages/common/common_slide_page.dart'; +import 'package:PiliPlus/pages/common/slide/common_slide_page.dart'; import 'package:PiliPlus/pages/video/reply/widgets/reply_item_grpc.dart'; import 'package:PiliPlus/pages/video/reply_reply/controller.dart'; import 'package:PiliPlus/utils/context_ext.dart'; diff --git a/lib/pages/video/view_point/view.dart b/lib/pages/video/view_point/view.dart index 66baa9014..69ca744f6 100644 --- a/lib/pages/video/view_point/view.dart +++ b/lib/pages/video/view_point/view.dart @@ -2,7 +2,7 @@ import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/widgets/button/icon_button.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/progress_bar/segment_progress_bar.dart'; -import 'package:PiliPlus/pages/common/common_collapse_slide_page.dart'; +import 'package:PiliPlus/pages/common/slide/common_collapse_slide_page.dart'; import 'package:PiliPlus/pages/video/controller.dart'; import 'package:PiliPlus/plugin/pl_player/controller.dart'; import 'package:PiliPlus/utils/duration_util.dart'; diff --git a/lib/pages/whisper_link_setting/controller.dart b/lib/pages/whisper_link_setting/controller.dart index 38dafacfb..48de11a7a 100644 --- a/lib/pages/whisper_link_setting/controller.dart +++ b/lib/pages/whisper_link_setting/controller.dart @@ -45,7 +45,7 @@ class WhisperLinkSettingController extends GetxController { LoadingState?>.loading().obs; Future getUserInfo() async { - userState.value = await MsgHttp.imUserInfos(uids: [talkerUid]); + userState.value = await MsgHttp.imUserInfos(uids: talkerUid.toString()); } Future getSessionSs() async { diff --git a/lib/utils/request_utils.dart b/lib/utils/request_utils.dart index 899bfcd1b..fb24c5ea5 100644 --- a/lib/utils/request_utils.dart +++ b/lib/utils/request_utils.dart @@ -18,7 +18,8 @@ import 'package:PiliPlus/http/validate.dart'; import 'package:PiliPlus/http/video.dart'; import 'package:PiliPlus/models/dynamics/result.dart'; import 'package:PiliPlus/models/login/model.dart'; -import 'package:PiliPlus/pages/common/multi_select_controller.dart'; +import 'package:PiliPlus/pages/common/multi_select/base.dart'; +import 'package:PiliPlus/pages/common/multi_select/multi_select_controller.dart'; import 'package:PiliPlus/pages/dynamics_tab/controller.dart'; import 'package:PiliPlus/pages/group_panel/view.dart'; import 'package:PiliPlus/pages/later/controller.dart'; @@ -419,29 +420,28 @@ class RequestUtils { TextButton( onPressed: () { if (checkedId != null) { - Set resources = ctr.allChecked.toSet(); + Iterable removeList = ctr.allChecked; SmartDialog.showLoading(); FavHttp.copyOrMoveFav( isCopy: isCopy, isFav: ctr is! LaterController, srcMediaId: mediaId, tarMediaId: checkedId, - resources: resources + resources: removeList .map( (item) => ctr is LaterController ? item.aid : '${item.id}:${item.type}', ) - .toList(), + .join(','), mid: isCopy ? mid : null, ).then((res) { if (res.isSuccess) { ctr.handleSelect(false); if (!isCopy) { - ctr.loadingState.value.data!.removeWhere( - resources.contains, - ); - ctr.loadingState.refresh(); + ctr.loadingState + ..value.data!.removeWhere(removeList.contains) + ..refresh(); } SmartDialog.dismiss(); SmartDialog.showToast('${isCopy ? '复制' : '移动'}成功');