From 08862e7f725a532d39a933c671b5d6b7378e1515 Mon Sep 17 00:00:00 2001 From: guozhigq Date: Fri, 18 Aug 2023 10:11:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=A8=8D=E5=90=8E=E5=86=8D=E7=9C=8B?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/http/api.dart | 3 ++ lib/http/user.dart | 22 ++++++++++ lib/pages/later/controller.dart | 39 ++++++++++++++++- lib/pages/later/view.dart | 77 ++++++++++++++++++++++----------- 4 files changed, 113 insertions(+), 28 deletions(-) diff --git a/lib/http/api.dart b/lib/http/api.dart index 5f171349..5074ccfe 100644 --- a/lib/http/api.dart +++ b/lib/http/api.dart @@ -248,6 +248,9 @@ class Api { // 移除已观看 static const String toViewDel = '/x/v2/history/toview/del'; + // 清空稍后再看 + static const String toViewClear = '/x/v2/history/toview/clear'; + // 追番 static const String bangumiAdd = '/pgc/web/follow/add'; diff --git a/lib/http/user.dart b/lib/http/user.dart index 1724a53c..050470fb 100644 --- a/lib/http/user.dart +++ b/lib/http/user.dart @@ -85,6 +85,12 @@ class UserHttp { static Future seeYouLater() async { var res = await Request().get(Api.seeYouLater); if (res.data['code'] == 0) { + if (res.data['data']['count'] == 0) { + return { + 'status': true, + 'data': {'list': [], 'count': 0} + }; + } List list = []; for (var i in res.data['data']['list']) { list.add(HotVideoItemModel.fromJson(i)); @@ -195,4 +201,20 @@ class UserHttp { Request().get(res.data['data']['confirm_uri']); } } + + // 清空稍后再看 + static Future toViewClear() async { + var res = await Request().post( + Api.toViewClear, + queryParameters: { + 'jsonp': 'jsonp', + 'csrf': await Request.getCsrf(), + }, + ); + if (res.data['code'] == 0) { + return {'status': true, 'msg': '操作完成'}; + } else { + return {'status': false, 'msg': res.data['message']}; + } + } } diff --git a/lib/pages/later/controller.dart b/lib/pages/later/controller.dart index 960e7891..6de9254c 100644 --- a/lib/pages/later/controller.dart +++ b/lib/pages/later/controller.dart @@ -6,15 +6,20 @@ import 'package:pilipala/models/model_hot_video_item.dart'; class LaterController extends GetxController { final ScrollController scrollController = ScrollController(); - RxList laterList = [HotVideoItemModel()].obs; + RxList laterList = [].obs; int count = 0; + RxBool isLoading = false.obs; Future queryLaterList() async { + isLoading.value = true; var res = await UserHttp.seeYouLater(); if (res['status']) { - laterList.value = res['data']['list']; count = res['data']['count']; + if (count > 0) { + laterList.value = res['data']['list']; + } } + isLoading.value = false; return res; } @@ -47,4 +52,34 @@ class LaterController extends GetxController { }, ); } + + // 一键清空 + Future toViewClear() async { + SmartDialog.show( + useSystem: true, + animationType: SmartAnimationType.centerFade_otherSlide, + builder: (BuildContext context) { + return AlertDialog( + title: const Text('清空确认'), + content: const Text('确定要清空你的稍后再看列表吗?'), + actions: [ + TextButton( + onPressed: () => SmartDialog.dismiss(), + child: const Text('取消')), + TextButton( + onPressed: () async { + var res = await UserHttp.toViewClear(); + if (res['status']) { + laterList.clear(); + } + SmartDialog.dismiss(); + SmartDialog.showToast(res['msg']); + }, + child: const Text('确认'), + ) + ], + ); + }, + ); + } } diff --git a/lib/pages/later/view.dart b/lib/pages/later/view.dart index d3306b25..fa524157 100644 --- a/lib/pages/later/view.dart +++ b/lib/pages/later/view.dart @@ -29,25 +29,38 @@ class _LaterPageState extends State { titleSpacing: 0, centerTitle: false, title: Obx( - () => Text( - '稍后再看 (${_laterController.laterList.length}/100)', - style: Theme.of(context).textTheme.titleMedium, - ), + () => _laterController.laterList.isNotEmpty + ? Text( + '稍后再看 (${_laterController.laterList.length}/100)', + style: Theme.of(context).textTheme.titleMedium, + ) + : Text( + '稍后再看', + style: Theme.of(context).textTheme.titleMedium, + ), ), actions: [ - TextButton( - onPressed: () => _laterController.toViewDel(), - child: const Text('移除已看'), + Obx( + () => _laterController.laterList.isNotEmpty + ? TextButton( + onPressed: () => _laterController.toViewDel(), + child: const Text('移除已看'), + ) + : const SizedBox(), + ), + Obx( + () => _laterController.laterList.isNotEmpty + ? IconButton( + tooltip: '一键清空', + onPressed: () => _laterController.toViewClear(), + icon: Icon( + Icons.clear_all_outlined, + size: 21, + color: Theme.of(context).colorScheme.primary, + ), + ) + : const SizedBox(), ), - // IconButton( - // tooltip: '一键清空', - // onPressed: () {}, - // icon: Icon( - // Icons.clear_all_outlined, - // size: 21, - // color: Theme.of(context).colorScheme.primary, - // ), - // ), const SizedBox(width: 8), ], ), @@ -61,19 +74,31 @@ class _LaterPageState extends State { Map data = snapshot.data as Map; if (data['status']) { return Obx( - () => SliverList( - delegate: SliverChildBuilderDelegate((context, index) { - return VideoCardH( - videoItem: _laterController.laterList[index], - source: 'later', - ); - }, childCount: _laterController.laterList.length), - ), + () => _laterController.laterList.isNotEmpty && + !_laterController.isLoading.value + ? SliverList( + delegate: + SliverChildBuilderDelegate((context, index) { + return VideoCardH( + videoItem: _laterController.laterList[index], + source: 'later', + ); + }, childCount: _laterController.laterList.length), + ) + : SliverToBoxAdapter( + child: Center( + child: Text(_laterController.isLoading.value + ? '加载中' + : '没有数据'), + ), + ), ); } else { return HttpError( errMsg: data['msg'], - fn: () => setState(() {}), + fn: () => setState(() { + _futureBuilderFuture = _laterController.queryLaterList(); + }), ); } } else { @@ -81,7 +106,7 @@ class _LaterPageState extends State { return SliverList( delegate: SliverChildBuilderDelegate((context, index) { return const VideoCardHSkeleton(); - }, childCount: 5), + }, childCount: 10), ); } },