diff --git a/lib/grpc/grpc_repo.dart b/lib/grpc/grpc_repo.dart index 2b876997..468a453f 100644 --- a/lib/grpc/grpc_repo.dart +++ b/lib/grpc/grpc_repo.dart @@ -51,6 +51,7 @@ class GrpcUrl { static const sendMsg = '$im/SendMsg'; static const shareList = '$im/ShareList'; static const sessionMain = '$im2/SessionMain'; + static const clearUnread = '$im2/ClearUnread'; } class GrpcRepo { @@ -382,4 +383,18 @@ class GrpcRepo { SessionMainReply.fromBuffer, ); } + + static Future clearUnread({ + SessionPageType? pageType, + SessionId? sessionId, + }) async { + return await _request( + GrpcUrl.clearUnread, + ClearUnreadReq( + pageType: pageType, + sessionId: sessionId, + ), + ClearUnreadReply.fromBuffer, + ); + } } diff --git a/lib/pages/whisper/controller.dart b/lib/pages/whisper/controller.dart index 820ae517..b7dceea8 100644 --- a/lib/pages/whisper/controller.dart +++ b/lib/pages/whisper/controller.dart @@ -1,4 +1,6 @@ -import 'package:PiliPlus/grpc/bilibili/app/im/v1.pb.dart'; +import 'package:PiliPlus/grpc/bilibili/app/im/v1.pb.dart' + show SessionMainReply, Session, Offset, SessionPageType; +import 'package:PiliPlus/grpc/grpc_repo.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/msg.dart'; import 'package:PiliPlus/models/msg/msgfeed_unread.dart'; @@ -117,4 +119,25 @@ class WhisperController loadingState.refresh(); } } + + Future onClearUnread() async { + final res = await GrpcRepo.clearUnread( + pageType: SessionPageType.SESSION_PAGE_TYPE_HOME); + if (res['status']) { + if (loadingState.value is Success) { + List? list = loadingState.value.data; + if (list?.isNotEmpty == true) { + for (var item in list!) { + if (item.hasUnread()) { + item.clearUnread(); + } + } + loadingState.refresh(); + } + } + SmartDialog.showToast('已标记为已读'); + } else { + SmartDialog.showToast(res['msg']); + } + } } diff --git a/lib/pages/whisper/view.dart b/lib/pages/whisper/view.dart index 02735816..f6e6db90 100644 --- a/lib/pages/whisper/view.dart +++ b/lib/pages/whisper/view.dart @@ -1,4 +1,5 @@ import 'package:PiliPlus/common/skeleton/whisper_item.dart'; +import 'package:PiliPlus/common/widgets/dialog/dialog.dart'; import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/common/widgets/refresh_indicator.dart'; import 'package:PiliPlus/grpc/bilibili/app/im/v1.pb.dart'; @@ -22,7 +23,27 @@ class _WhisperPageState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar(title: const Text('消息')), + appBar: AppBar( + title: const Text('消息'), + actions: [ + IconButton( + tooltip: '一键已读', + onPressed: () { + showConfirmDialog( + context: context, + title: '一键已读', + content: '是否清除全部新消息提醒?', + onConfirm: _whisperController.onClearUnread, + ); + }, + icon: const Icon( + size: 20, + Icons.cleaning_services, + ), + ), + const SizedBox(width: 16), + ], + ), body: refreshIndicator( onRefresh: () async { await _whisperController.onRefresh();