diff --git a/lib/http/api.dart b/lib/http/api.dart index e4356840..06c9fd9b 100644 --- a/lib/http/api.dart +++ b/lib/http/api.dart @@ -148,6 +148,15 @@ class Api { // 获取历史记录 static const String historyList = '/x/web-interface/history/cursor'; + // 暂停历史记录 + static const String pauseHistory = '/x/v2/history/shadow/set'; + + // 查询历史记录暂停状态 + static const String historyStatus = '/x/v2/history/shadow?jsonp=jsonp'; + + // 清空历史记录 + static const String clearHistory = '/x/v2/history/clear'; + // 热搜 static const String hotSearchList = 'https://s.search.bilibili.com/main/hotword'; diff --git a/lib/http/user.dart b/lib/http/user.dart index b38050e0..d4b126e5 100644 --- a/lib/http/user.dart +++ b/lib/http/user.dart @@ -112,4 +112,36 @@ class UserHttp { return {'status': false, 'data': [], 'msg': res.data['message']}; } } + + // 暂停观看历史 + static Future pauseHistory(bool switchStatus) async { + // 暂停switchStatus传true 否则false + var res = await Request().post( + Api.pauseHistory, + queryParameters: { + 'switch': switchStatus, + 'jsonp': 'jsonp', + 'csrf': await Request.getCsrf(), + }, + ); + return res; + } + + // 观看历史暂停状态 + static Future historyStatus() async { + var res = await Request().get(Api.historyStatus); + return res; + } + + // 清空历史记录 + static Future clearHistory() async { + var res = await Request().post( + Api.clearHistory, + queryParameters: { + 'jsonp': 'jsonp', + 'csrf': await Request.getCsrf(), + }, + ); + return res; + } } diff --git a/lib/pages/history/controller.dart b/lib/pages/history/controller.dart index d3d340d2..0b248a08 100644 --- a/lib/pages/history/controller.dart +++ b/lib/pages/history/controller.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:pilipala/http/user.dart'; import 'package:pilipala/models/user/history.dart'; @@ -7,10 +8,12 @@ class HistoryController extends GetxController { final ScrollController scrollController = ScrollController(); RxList historyList = [HisListItem()].obs; bool isLoadingMore = false; + RxBool pauseStatus = false.obs; @override void onInit() { super.onInit(); + historyStatus(); } Future queryHistoryList({type = 'init'}) async { @@ -40,4 +43,76 @@ class HistoryController extends GetxController { Future onRefresh() async { queryHistoryList(type: 'onRefresh'); } + + // 暂停观看历史 + Future onPauseHistory() async { + SmartDialog.show( + useSystem: true, + animationType: SmartAnimationType.centerFade_otherSlide, + builder: (BuildContext context) { + return AlertDialog( + title: const Text('提示'), + content: + Text(!pauseStatus.value ? '啊叻?你要暂停历史记录功能吗?' : '啊叻?要恢复历史记录功能吗?'), + actions: [ + TextButton( + onPressed: () => SmartDialog.dismiss(), + child: const Text('取消')), + TextButton( + onPressed: () async { + SmartDialog.showLoading(msg: '请求中'); + var res = await UserHttp.pauseHistory(!pauseStatus.value); + SmartDialog.dismiss(); + if (res.data['code'] == 0) { + SmartDialog.showToast( + !pauseStatus.value ? '暂停观看历史' : '恢复观看历史'); + pauseStatus.value = !pauseStatus.value; + } + SmartDialog.dismiss(); + }, + child: Text(!pauseStatus.value ? '确认暂停' : '确认恢复'), + ) + ], + ); + }, + ); + } + +// 观看历史暂停状态 + Future historyStatus() async { + var res = await UserHttp.historyStatus(); + pauseStatus.value = res.data['data']; + } + + // 清空观看历史 + Future onClearHistory() 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 { + SmartDialog.showLoading(msg: '请求中'); + var res = await UserHttp.clearHistory(); + SmartDialog.dismiss(); + if (res.data['code'] == 0) { + SmartDialog.showToast('清空观看历史'); + } + SmartDialog.dismiss(); + historyList.clear(); + }, + child: const Text('确认清空'), + ) + ], + ); + }, + ); + } } diff --git a/lib/pages/history/view.dart b/lib/pages/history/view.dart index f0142a3e..3de41366 100644 --- a/lib/pages/history/view.dart +++ b/lib/pages/history/view.dart @@ -39,8 +39,43 @@ class _HistoryPageState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: const Text('观看记录'), + titleSpacing: 0, centerTitle: false, + title: Text( + '观看记录', + style: Theme.of(context).textTheme.titleMedium, + ), + actions: [ + PopupMenuButton( + onSelected: (String type) { + // 处理菜单项选择的逻辑 + switch (type) { + case 'pause': + _historyController.onPauseHistory(); + break; + case 'clear': + _historyController.onClearHistory(); + break; + default: + } + }, + itemBuilder: (BuildContext context) => >[ + PopupMenuItem( + value: 'pause', + child: Obx( + () => Text(!_historyController.pauseStatus.value + ? '暂停观看记录' + : '恢复观看记录'), + ), + ), + const PopupMenuItem( + value: 'clear', + child: Text('清空观看记录'), + ), + ], + ), + const SizedBox(width: 6), + ], ), body: RefreshIndicator( onRefresh: () async { @@ -57,13 +92,23 @@ class _HistoryPageState extends State { Map data = snapshot.data; if (data['status']) { return Obx( - () => SliverList( - delegate: SliverChildBuilderDelegate((context, index) { - return HistoryItem( - videoItem: _historyController.historyList[index], - ); - }, childCount: _historyController.historyList.length), - ), + () => _historyController.historyList.isEmpty + ? const SliverToBoxAdapter( + child: Center( + child: Text('没数据'), + ), + ) + : SliverList( + delegate: SliverChildBuilderDelegate( + (context, index) { + return HistoryItem( + videoItem: + _historyController.historyList[index], + ); + }, + childCount: + _historyController.historyList.length), + ), ); } else { return HttpError(