import 'package:PiliPlus/common/widgets/dialog/dialog.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/user.dart'; 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/common_list_controller.dart' show CommonListController; import 'package:PiliPlus/pages/common/multi_select/base.dart'; import 'package:PiliPlus/pages/common/multi_select/multi_select_controller.dart'; import 'package:PiliPlus/pages/later/base_controller.dart'; import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/extension/scroll_controller_ext.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; mixin BaseLaterController on CommonListController, CommonMultiSelectMixin, DeleteItemMixin { ValueChanged? updateCount; @override void onRemove() { showConfirmDialog( context: Get.context!, title: const Text('提示'), content: const Text('确认删除所选稍后再看吗?'), onConfirm: () async { final removeList = allChecked.toSet(); SmartDialog.showLoading(msg: '请求中'); final res = await UserHttp.toViewDel( aids: removeList.map((item) => item.aid).join(','), ); if (res.isSuccess) { updateCount?.call(removeList.length); afterDelete(removeList); } SmartDialog.dismiss(); }, ); } // single void toViewDel( BuildContext context, int index, int? aid, ) { showDialog( context: context, builder: (context) => AlertDialog( title: const Text('提示'), content: const Text('即将移除该视频,确定是否移除'), actions: [ TextButton( onPressed: Get.back, child: Text( '取消', style: TextStyle(color: Theme.of(context).colorScheme.outline), ), ), TextButton( onPressed: () async { Get.back(); final res = await UserHttp.toViewDel(aids: aid.toString()); if (res.isSuccess) { loadingState ..value.data!.removeAt(index) ..refresh(); updateCount?.call(1); } }, child: const Text('确认移除'), ), ], ), ); } } class LaterController extends MultiSelectController with BaseLaterController { LaterController(this.laterViewType); final LaterViewType laterViewType; late final mid = Accounts.main.mid; final RxBool asc = false.obs; final LaterBaseController baseCtr = Get.put(LaterBaseController()); @override RxBool get enableMultiSelect => baseCtr.enableMultiSelect; @override RxInt get rxCount => baseCtr.checkedCount; @override Future> customGetData() => UserHttp.seeYouLater( page: page, viewed: laterViewType.type, asc: asc.value, ); @override void onInit() { super.onInit(); queryData(); } @override List? getDataList(response) { baseCtr.counts[laterViewType.index] = response.count ?? 0; return response.list; } @override void checkIsEnd(int length) { if (length >= baseCtr.counts[laterViewType.index]) { isEnd = true; } } // 一键清空 void toViewClear(BuildContext context, [int? cleanType]) { String content = switch (cleanType) { 1 => '确定清空已失效视频吗?', 2 => '确定清空已看完视频吗?', _ => '确定清空稍后再看列表吗?', }; showConfirmDialog( context: context, title: const Text('确认'), content: Text(content), onConfirm: () async { final res = await UserHttp.toViewClear(cleanType); if (res.isSuccess) { onReload(); final restTypes = List.from(LaterViewType.values) ..remove(laterViewType); for (final item in restTypes) { try { Get.find(tag: item.type.toString()).onReload(); } catch (_) {} } SmartDialog.showToast('已清空'); } else { res.toast(); } }, ); } // 稍后再看播放全部 void toViewPlayAll() { if (loadingState.value case Success(:final response)) { if (response == null || response.isEmpty) return; for (LaterItemModel item in response) { if (item.cid == null || item.pgcLabel?.isNotEmpty == true) { continue; } else { PageUtils.toVideoPage( bvid: item.bvid, cid: item.cid!, cover: item.pic, title: item.title, extraArguments: { 'sourceType': SourceType.watchLater, 'count': baseCtr.counts[LaterViewType.all.index], 'favTitle': '稍后再看', 'mediaId': mid, 'desc': asc.value, }, ); break; } } } } @override ValueChanged? get updateCount => (count) => baseCtr.counts[laterViewType.index] -= count; @override Future onReload() { scrollController.jumpToTop(); return super.onReload(); } }