diff --git a/lib/common/widgets/dialog.dart b/lib/common/widgets/dialog.dart new file mode 100644 index 00000000..d0f1e202 --- /dev/null +++ b/lib/common/widgets/dialog.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +void showConfirmDialog({ + required BuildContext context, + required String title, + String? content, + required VoidCallback onConfirm, +}) { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: Text(title), + content: content == null ? null : Text(content), + actions: [ + TextButton( + onPressed: Get.back, + child: Text( + '取消', + style: TextStyle(color: Theme.of(context).colorScheme.outline), + ), + ), + TextButton( + onPressed: onConfirm, + child: Text('确认'), + ), + ], + ); + }, + ); +} diff --git a/lib/http/api.dart b/lib/http/api.dart index bc9359e9..0aa05e51 100644 --- a/lib/http/api.dart +++ b/lib/http/api.dart @@ -182,6 +182,8 @@ class Api { static const String deleteFolder = '/x/v3/fav/folder/del'; + static const String cleanFav = '/x/v3/fav/resource/clean'; + /// 收藏夹 详情 /// media_id 当前收藏夹id 搜索全部时为默认收藏夹id /// pn int 当前页 diff --git a/lib/http/user.dart b/lib/http/user.dart index 10dcd376..46ec0a4d 100644 --- a/lib/http/user.dart +++ b/lib/http/user.dart @@ -62,6 +62,27 @@ class UserHttp { } } + static Future cleanFav({ + required dynamic mediaId, + }) async { + var res = await Request().post( + Api.cleanFav, + data: { + 'media_id': mediaId, + 'platform': 'web', + 'csrf': await Request.getCsrf(), + }, + options: Options( + contentType: Headers.formUrlEncodedContentType, + ), + ); + if (res.data['code'] == 0) { + return {'status': true, 'data': res.data['data']}; + } else { + return {'status': false, 'msg': res.data['message']}; + } + } + static Future deleteFolder({ required List mediaIds, }) async { diff --git a/lib/main.dart b/lib/main.dart index 6dcaf118..2148be5c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -275,6 +275,9 @@ class MyApp extends StatelessWidget { progressIndicatorTheme: ProgressIndicatorThemeData( refreshBackgroundColor: colorScheme.onSecondary, ), + dialogTheme: DialogTheme( + titleTextStyle: TextStyle(fontSize: 18), + ), ); } } diff --git a/lib/pages/about/index.dart b/lib/pages/about/index.dart index 6dafb593..c5d4d620 100644 --- a/lib/pages/about/index.dart +++ b/lib/pages/about/index.dart @@ -53,7 +53,8 @@ class _AboutPageState extends State { TextStyle subTitleStyle = TextStyle(fontSize: 13, color: Theme.of(context).colorScheme.outline); return Scaffold( - appBar: widget.showAppBar == false ? null : AppBar(title: Text('关于')), + appBar: + widget.showAppBar == false ? null : AppBar(title: const Text('关于')), body: ListView( children: [ GestureDetector( diff --git a/lib/pages/dynamics/detail/view.dart b/lib/pages/dynamics/detail/view.dart index 060ef433..95db3b4d 100644 --- a/lib/pages/dynamics/detail/view.dart +++ b/lib/pages/dynamics/detail/view.dart @@ -156,7 +156,7 @@ class _DynamicDetailPageState extends State Scaffold( resizeToAvoidBottomInset: false, appBar: AppBar( - title: Text('评论详情'), + title: const Text('评论详情'), titleSpacing: automaticallyImplyLeading ? null : 12, automaticallyImplyLeading: automaticallyImplyLeading, ), diff --git a/lib/pages/dynamics/widgets/author_panel.dart b/lib/pages/dynamics/widgets/author_panel.dart index d412ed62..0d6be4c6 100644 --- a/lib/pages/dynamics/widgets/author_panel.dart +++ b/lib/pages/dynamics/widgets/author_panel.dart @@ -309,10 +309,7 @@ class AuthorPanel extends StatelessWidget { context: context, builder: (context) { return AlertDialog( - title: Text( - '举报动态', - style: TextStyle(fontSize: 18), - ), + title: const Text('举报动态'), titlePadding: const EdgeInsets.only(left: 22, top: 16, right: 22), contentPadding: const EdgeInsets.only(top: 5), actionsPadding: diff --git a/lib/pages/fav/view.dart b/lib/pages/fav/view.dart index 799d812e..19f4e696 100644 --- a/lib/pages/fav/view.dart +++ b/lib/pages/fav/view.dart @@ -26,7 +26,7 @@ class _FavPageState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text('我的收藏'), + title: const Text('我的收藏'), actions: [ IconButton( onPressed: () { diff --git a/lib/pages/fav_detail/view.dart b/lib/pages/fav_detail/view.dart index 60396c0b..961f15dc 100644 --- a/lib/pages/fav_detail/view.dart +++ b/lib/pages/fav_detail/view.dart @@ -1,3 +1,4 @@ +import 'package:PiliPlus/common/widgets/dialog.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/user.dart'; import 'package:PiliPlus/models/user/fav_folder.dart'; @@ -159,23 +160,51 @@ class _FavDetailPageState extends State { }, child: Text('编辑信息'), ), + PopupMenuItem( + onTap: () { + UserHttp.cleanFav(mediaId: mediaId) + .then((data) { + if (data['status']) { + SmartDialog.showToast('清除成功'); + _favDetailController.onReload(); + } else { + SmartDialog.showToast(data['msg']); + } + }); + }, + child: Text('清除失效内容'), + ), if (!Utils.isDefault( _favDetailController.item.value.attr ?? 0)) PopupMenuItem( onTap: () { - UserHttp.deleteFolder( - mediaIds: [mediaId]).then((data) { - if (data['status']) { - SmartDialog.showToast('删除成功'); - Get.back(result: true); - } else { - SmartDialog.showToast( - data['msg']); - } - }); + showConfirmDialog( + context: context, + title: '确定删除该收藏夹?', + onConfirm: () { + UserHttp.deleteFolder( + mediaIds: [mediaId]) + .then((data) { + if (data['status']) { + SmartDialog.showToast('删除成功'); + Get.back(result: true); + } else { + SmartDialog.showToast( + data['msg']); + } + }); + }, + ); }, - child: Text('删除'), + child: Text( + '删除', + style: TextStyle( + color: Theme.of(context) + .colorScheme + .error, + ), + ), ), ], ) diff --git a/lib/pages/history/view.dart b/lib/pages/history/view.dart index c03f9df8..4a696a95 100644 --- a/lib/pages/history/view.dart +++ b/lib/pages/history/view.dart @@ -36,7 +36,7 @@ class _HistoryPageState extends State { appBar: AppBarWidget( visible: _historyController.enableMultiSelect.value, child1: AppBar( - title: Text('观看记录'), + title: const Text('观看记录'), actions: [ IconButton( tooltip: '搜索', diff --git a/lib/pages/html/view.dart b/lib/pages/html/view.dart index dbd66b95..5c78c6b9 100644 --- a/lib/pages/html/view.dart +++ b/lib/pages/html/view.dart @@ -145,7 +145,7 @@ class _HtmlRenderPageState extends State Scaffold( resizeToAvoidBottomInset: false, appBar: AppBar( - title: Text('评论详情'), + title: const Text('评论详情'), titleSpacing: automaticallyImplyLeading ? null : 12, automaticallyImplyLeading: automaticallyImplyLeading, ), diff --git a/lib/pages/later/controller.dart b/lib/pages/later/controller.dart index b0d1285e..5ec90a42 100644 --- a/lib/pages/later/controller.dart +++ b/lib/pages/later/controller.dart @@ -1,3 +1,4 @@ +import 'package:PiliPlus/common/widgets/dialog.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models/model_hot_video_item.dart'; import 'package:PiliPlus/pages/common/multi_select_controller.dart'; @@ -79,34 +80,18 @@ class LaterController extends MultiSelectController { } // 一键清空 - Future toViewClear(BuildContext context) async { - await showDialog( + void toViewClear(BuildContext context) { + showConfirmDialog( context: context, - builder: (context) { - return 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 { - var res = await UserHttp.toViewClear(); - if (res['status']) { - loadingState.value = LoadingState.success([]); - } - Get.back(); - SmartDialog.showToast(res['msg']); - }, - child: const Text('确认'), - ) - ], - ); + title: '清空确认', + content: '确定要清空你的稍后再看列表吗?', + onConfirm: () async { + var res = await UserHttp.toViewClear(); + if (res['status']) { + loadingState.value = LoadingState.success([]); + } + Get.back(); + SmartDialog.showToast(res['msg']); }, ); } diff --git a/lib/pages/login/controller.dart b/lib/pages/login/controller.dart index 1de2fbf7..327bcea6 100644 --- a/lib/pages/login/controller.dart +++ b/lib/pages/login/controller.dart @@ -313,7 +313,6 @@ class LoginPageController extends GetxController title: const Text( "本次登录需要验证您的手机号", textAlign: TextAlign.center, - style: TextStyle(fontSize: 18), ), content: Column( mainAxisSize: MainAxisSize.min, diff --git a/lib/pages/member/new/widget/edit_profile_page.dart b/lib/pages/member/new/widget/edit_profile_page.dart index e559bd69..272e8aa0 100644 --- a/lib/pages/member/new/widget/edit_profile_page.dart +++ b/lib/pages/member/new/widget/edit_profile_page.dart @@ -276,10 +276,7 @@ class _EditProfilePageState extends State { context: context, builder: (BuildContext context) { return AlertDialog( - title: Text( - '修改$title', - style: TextStyle(fontSize: 18), - ), + title: Text('修改$title'), content: TextField( controller: _textController, minLines: type == ProfileType.uname ? 1 : 4, diff --git a/lib/pages/member_archive/view.dart b/lib/pages/member_archive/view.dart index c5a1cd56..203d8295 100644 --- a/lib/pages/member_archive/view.dart +++ b/lib/pages/member_archive/view.dart @@ -53,7 +53,7 @@ class _MemberArchivePageState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text('Ta的投稿'), + title: const Text('Ta的投稿'), actions: [ Obx( () => TextButton.icon( diff --git a/lib/pages/member_dynamics/view.dart b/lib/pages/member_dynamics/view.dart index aa2bb04c..66256768 100644 --- a/lib/pages/member_dynamics/view.dart +++ b/lib/pages/member_dynamics/view.dart @@ -46,7 +46,7 @@ class _MemberDynamicsPageState extends State super.build(context); return widget.mid == null ? Scaffold( - appBar: AppBar(title: Text('Ta的动态')), + appBar: AppBar(title: const Text('Ta的动态')), body: _buildBody, ) : _buildBody; diff --git a/lib/pages/member_seasons/view.dart b/lib/pages/member_seasons/view.dart index f5625b5a..cdebebd3 100644 --- a/lib/pages/member_seasons/view.dart +++ b/lib/pages/member_seasons/view.dart @@ -47,7 +47,7 @@ class _MemberSeasonsPageState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar(title: Text('Ta的专栏')), + appBar: AppBar(title: const Text('Ta的专栏')), body: Padding( padding: const EdgeInsets.only( left: StyleString.safeSpace, diff --git a/lib/pages/setting/pages/logs.dart b/lib/pages/setting/pages/logs.dart index b1fd386f..faa02755 100644 --- a/lib/pages/setting/pages/logs.dart +++ b/lib/pages/setting/pages/logs.dart @@ -95,7 +95,7 @@ class _LogsPageState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text('日志'), + title: const Text('日志'), actions: [ PopupMenuButton( onSelected: (String type) { diff --git a/lib/pages/setting/pages/play_speed_set.dart b/lib/pages/setting/pages/play_speed_set.dart index 27d23240..7d6fb0b7 100644 --- a/lib/pages/setting/pages/play_speed_set.dart +++ b/lib/pages/setting/pages/play_speed_set.dart @@ -191,7 +191,7 @@ class _PlaySpeedPageState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text('倍速设置'), + title: const Text('倍速设置'), actions: [ TextButton( onPressed: () async { diff --git a/lib/pages/setting/play_setting.dart b/lib/pages/setting/play_setting.dart index 87c4c7f4..f4853daa 100644 --- a/lib/pages/setting/play_setting.dart +++ b/lib/pages/setting/play_setting.dart @@ -23,7 +23,9 @@ class _PlaySettingState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: widget.showAppBar == false ? null : AppBar(title: Text('播放器设置')), + appBar: widget.showAppBar == false + ? null + : AppBar(title: const Text('播放器设置')), body: ListView( children: [ ...playSettings.map((item) => item.widget), diff --git a/lib/pages/setting/privacy_setting.dart b/lib/pages/setting/privacy_setting.dart index c5c0af13..1f1f6444 100644 --- a/lib/pages/setting/privacy_setting.dart +++ b/lib/pages/setting/privacy_setting.dart @@ -9,7 +9,7 @@ class PrivacySetting extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: showAppBar == false ? null : AppBar(title: Text('隐私设置')), + appBar: showAppBar == false ? null : AppBar(title: const Text('隐私设置')), body: ListView( children: [ ...privacySettings.map((item) => item.widget), diff --git a/lib/pages/setting/recommend_setting.dart b/lib/pages/setting/recommend_setting.dart index 55929b01..4c1bfebf 100644 --- a/lib/pages/setting/recommend_setting.dart +++ b/lib/pages/setting/recommend_setting.dart @@ -9,7 +9,7 @@ class RecommendSetting extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: showAppBar == false ? null : AppBar(title: Text('推荐流设置')), + appBar: showAppBar == false ? null : AppBar(title: const Text('推荐流设置')), body: ListView( children: [ ...recommendSettings.map((item) => item.widget), diff --git a/lib/pages/setting/video_setting.dart b/lib/pages/setting/video_setting.dart index eccc1577..2dd347df 100644 --- a/lib/pages/setting/video_setting.dart +++ b/lib/pages/setting/video_setting.dart @@ -9,7 +9,7 @@ class VideoSetting extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: showAppBar == false ? null : AppBar(title: Text('音视频设置')), + appBar: showAppBar == false ? null : AppBar(title: const Text('音视频设置')), body: ListView( children: [ ...videoSettings.map((item) => item.widget), diff --git a/lib/pages/setting/widgets/model.dart b/lib/pages/setting/widgets/model.dart index b3b10f20..0365fa29 100644 --- a/lib/pages/setting/widgets/model.dart +++ b/lib/pages/setting/widgets/model.dart @@ -1268,10 +1268,7 @@ List get recommendSettings => [ builder: (context) { String duration = ''; return AlertDialog( - title: Text( - '自定义时长', - style: TextStyle(fontSize: 18), - ), + title: const Text('自定义时长'), content: TextField( autofocus: true, onChanged: (value) => duration = value, @@ -1415,7 +1412,7 @@ List get extraSettings => [ context: Get.context!, builder: (context) { return AlertDialog( - title: Text('检查周期', style: TextStyle(fontSize: 18)), + title: const Text('检查周期'), content: TextFormField( autofocus: true, initialValue: dynamicPeriod.toString(), @@ -1543,7 +1540,7 @@ List get extraSettings => [ context: Get.context!, builder: (context) { return AlertDialog( - title: Text('评论折叠行数', style: TextStyle(fontSize: 18)), + title: const Text('评论折叠行数'), content: TextFormField( autofocus: true, initialValue: replyLengthLimit, @@ -1601,7 +1598,7 @@ List get extraSettings => [ context: Get.context!, builder: (context) { return AlertDialog( - title: Text('弹幕行高', style: TextStyle(fontSize: 18)), + title: const Text('弹幕行高'), content: TextFormField( autofocus: true, initialValue: danmakuLineHeight, @@ -1824,10 +1821,7 @@ List get extraSettings => [ context: Get.context!, builder: (context) { return AlertDialog( - title: const Text( - '自定义参数', - style: TextStyle(fontSize: 18), - ), + title: const Text('自定义参数'), content: TextField( autofocus: true, onChanged: (value) => param = value, @@ -2178,10 +2172,7 @@ SettingsModel getBanwordModel({ context: Get.context!, builder: (context) { return AlertDialog( - title: Text( - title, - style: TextStyle(fontSize: 18), - ), + title: Text(title), content: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/pages/setting/widgets/multi_select_dialog.dart b/lib/pages/setting/widgets/multi_select_dialog.dart index 210444e3..4a011a0e 100644 --- a/lib/pages/setting/widgets/multi_select_dialog.dart +++ b/lib/pages/setting/widgets/multi_select_dialog.dart @@ -30,10 +30,7 @@ class _MultiSelectDialogState extends State> { Widget build(BuildContext context) { return AlertDialog( clipBehavior: Clip.hardEdge, - title: Text( - widget.title, - style: TextStyle(fontSize: 18), - ), + title: Text(widget.title), contentPadding: const EdgeInsets.only(top: 12), content: StatefulBuilder(builder: (context, StateSetter setState) { return SingleChildScrollView( diff --git a/lib/pages/setting/widgets/select_dialog.dart b/lib/pages/setting/widgets/select_dialog.dart index cc2a12c6..995079a4 100644 --- a/lib/pages/setting/widgets/select_dialog.dart +++ b/lib/pages/setting/widgets/select_dialog.dart @@ -107,10 +107,7 @@ class _SelectDialogState extends State> { Widget build(BuildContext context) { return AlertDialog( clipBehavior: Clip.hardEdge, - title: Text( - widget.title, - style: TextStyle(fontSize: 18), - ), + title: Text(widget.title), contentPadding: const EdgeInsets.fromLTRB(0, 12, 0, 12), content: StatefulBuilder(builder: (context, StateSetter setState) { return SingleChildScrollView( diff --git a/lib/pages/setting/widgets/slide_dialog.dart b/lib/pages/setting/widgets/slide_dialog.dart index f2272ba3..df1f25d2 100644 --- a/lib/pages/setting/widgets/slide_dialog.dart +++ b/lib/pages/setting/widgets/slide_dialog.dart @@ -37,10 +37,7 @@ class _SlideDialogState extends State> { @override Widget build(BuildContext context) { return AlertDialog( - title: Text( - widget.title, - style: TextStyle(fontSize: 18), - ), + title: Text(widget.title), contentPadding: const EdgeInsets.only(top: 20, left: 8, right: 8, bottom: 8), content: SizedBox( diff --git a/lib/pages/setting/widgets/switch_item.dart b/lib/pages/setting/widgets/switch_item.dart index ca37b632..9db72c13 100644 --- a/lib/pages/setting/widgets/switch_item.dart +++ b/lib/pages/setting/widgets/switch_item.dart @@ -49,10 +49,7 @@ class _SetSwitchItemState extends State { showDialog( context: context, builder: (context) => AlertDialog( - title: Text( - '确定禁用 SSL 证书验证?', - style: TextStyle(fontSize: 18), - ), + title: const Text('确定禁用 SSL 证书验证?'), content: const Text('禁用容易受到中间人攻击'), actions: [ TextButton( diff --git a/lib/pages/subscription/view.dart b/lib/pages/subscription/view.dart index c182d7c9..3ee1ea63 100644 --- a/lib/pages/subscription/view.dart +++ b/lib/pages/subscription/view.dart @@ -21,7 +21,7 @@ class _SubPageState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar(title: Text('我的订阅')), + appBar: AppBar(title: const Text('我的订阅')), body: CustomScrollView( slivers: [ Obx(() => _buildBody(_subController.loadingState.value)), diff --git a/lib/pages/video/detail/controller.dart b/lib/pages/video/detail/controller.dart index c85de8a4..008fd46e 100644 --- a/lib/pages/video/detail/controller.dart +++ b/lib/pages/video/detail/controller.dart @@ -1662,10 +1662,7 @@ class VideoDetailController extends GetxController showDialog( context: context, builder: (context) => AlertDialog( - title: const Text( - '确定无误再提交', - style: TextStyle(fontSize: 18), - ), + title: const Text('确定无误再提交'), actions: [ TextButton( onPressed: Get.back, diff --git a/lib/pages/video/detail/introduction/widgets/fav_panel.dart b/lib/pages/video/detail/introduction/widgets/fav_panel.dart index cd567059..92510737 100644 --- a/lib/pages/video/detail/introduction/widgets/fav_panel.dart +++ b/lib/pages/video/detail/introduction/widgets/fav_panel.dart @@ -56,7 +56,7 @@ class _FavPanelState extends State { onPressed: Get.back, icon: const Icon(Icons.close_outlined), ), - title: Text('添加到收藏夹'), + title: const Text('添加到收藏夹'), actions: [ TextButton.icon( onPressed: () { diff --git a/lib/pages/video/detail/introduction/widgets/group_panel.dart b/lib/pages/video/detail/introduction/widgets/group_panel.dart index c426f348..69c2c165 100644 --- a/lib/pages/video/detail/introduction/widgets/group_panel.dart +++ b/lib/pages/video/detail/introduction/widgets/group_panel.dart @@ -94,7 +94,7 @@ class _GroupPanelState extends State { tooltip: '关闭', onPressed: Get.back, icon: const Icon(Icons.close_outlined)), - title: Text('设置关注分组'), + title: const Text('设置关注分组'), ), Expanded( child: Material( diff --git a/lib/pages/video/detail/view.dart b/lib/pages/video/detail/view.dart index 589cef3e..c403f6d9 100644 --- a/lib/pages/video/detail/view.dart +++ b/lib/pages/video/detail/view.dart @@ -1826,7 +1826,7 @@ class _VideoDetailPageState extends State appBar: AppBar( automaticallyImplyLeading: false, titleSpacing: 16, - title: Text('分段信息'), + title: const Text('分段信息'), actions: [ Text( '分段进度条', diff --git a/lib/pages/video/detail/widgets/header_control.dart b/lib/pages/video/detail/widgets/header_control.dart index c7f3be41..d0f6b49b 100644 --- a/lib/pages/video/detail/widgets/header_control.dart +++ b/lib/pages/video/detail/widgets/header_control.dart @@ -659,10 +659,7 @@ class _HeaderControlState extends State { builder: (context) { String duration = ''; return AlertDialog( - title: Text( - '自定义时长', - style: TextStyle(fontSize: 18), - ), + title: const Text('自定义时长'), content: TextField( autofocus: true, onChanged: (value) => duration = value, diff --git a/lib/utils/app_scheme.dart b/lib/utils/app_scheme.dart index fc0747ee..5656d0c8 100644 --- a/lib/utils/app_scheme.dart +++ b/lib/utils/app_scheme.dart @@ -49,7 +49,7 @@ class PiliScheme { () => Scaffold( resizeToAvoidBottomInset: false, appBar: AppBar( - title: Text('评论详情'), + title: const Text('评论详情'), actions: [ IconButton( tooltip: '前往原视频', @@ -133,7 +133,7 @@ class PiliScheme { () => Scaffold( resizeToAvoidBottomInset: false, appBar: AppBar( - title: Text('评论详情'), + title: const Text('评论详情'), actions: [ IconButton( tooltip: '前往', @@ -173,7 +173,7 @@ class PiliScheme { () => Scaffold( resizeToAvoidBottomInset: false, appBar: AppBar( - title: Text('评论详情'), + title: const Text('评论详情'), actions: [ IconButton( tooltip: '前往',