diff --git a/lib/pages/common/common_whisper_controller.dart b/lib/pages/common/common_whisper_controller.dart new file mode 100644 index 00000000..4e64be96 --- /dev/null +++ b/lib/pages/common/common_whisper_controller.dart @@ -0,0 +1,70 @@ +import 'package:PiliPlus/grpc/bilibili/app/im/v1.pb.dart'; +import 'package:PiliPlus/grpc/im.dart'; +import 'package:PiliPlus/http/loading_state.dart'; +import 'package:PiliPlus/http/msg.dart'; +import 'package:PiliPlus/pages/common/common_list_controller.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; + +abstract class CommonWhisperController + extends CommonListController { + SessionPageType get sessionPageType; + + Future onRemove(int index, int? talkerId) async { + var res = await MsgHttp.removeMsg(talkerId); + if (res['status']) { + loadingState + ..value.data!.removeAt(index) + ..refresh(); + SmartDialog.showToast('删除成功'); + } else { + SmartDialog.showToast(res['msg']); + } + } + + Future onSetTop(int index, bool isTop, SessionId sessionId) async { + var res = isTop + ? await ImGrpc.unpinSession(sessionId: sessionId) + : await ImGrpc.pinSession(sessionId: sessionId); + + if (res['status']) { + List list = loadingState.value.data!; + list[index].isPinned = isTop ? false : true; + if (!isTop) { + list.insert(0, list.removeAt(index)); + } + loadingState.refresh(); + SmartDialog.showToast('${isTop ? '移除' : ''}置顶成功'); + } else { + SmartDialog.showToast(res['msg']); + } + } + + Future onClearUnread() async { + final res = await ImGrpc.clearUnread(pageType: sessionPageType); + 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']); + } + } + + Future onDeleteList() async { + var res = await ImGrpc.deleteSessionList(pageType: sessionPageType); + if (res['status']) { + loadingState.value = LoadingState.success(null); + } else { + SmartDialog.showToast(res['msg']); + } + } +} diff --git a/lib/pages/whisper/controller.dart b/lib/pages/whisper/controller.dart index 4ac44e13..34f66180 100644 --- a/lib/pages/whisper/controller.dart +++ b/lib/pages/whisper/controller.dart @@ -1,24 +1,20 @@ import 'package:PiliPlus/grpc/bilibili/app/im/v1.pb.dart' - show - Offset, - Session, - SessionId, - SessionMainReply, - SessionPageType, - ThreeDotItem; + show Offset, Session, SessionMainReply, SessionPageType, ThreeDotItem; import 'package:PiliPlus/grpc/im.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/msg.dart'; import 'package:PiliPlus/models/msg/msgfeed_unread.dart'; -import 'package:PiliPlus/pages/common/common_list_controller.dart'; +import 'package:PiliPlus/pages/common/common_whisper_controller.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:protobuf/protobuf.dart' show PbMap; -class WhisperController - extends CommonListController { +class WhisperController extends CommonWhisperController { + @override + SessionPageType sessionPageType = SessionPageType.SESSION_PAGE_TYPE_HOME; + late final List msgFeedTopItems; late final RxList unreadCounts; @@ -101,72 +97,4 @@ class WhisperController queryMsgFeedUnread(); return super.onRefresh(); } - - Future onRemove(int index, int? talkerId) async { - var res = await MsgHttp.removeMsg(talkerId); - if (res['status']) { - loadingState.value.data!.removeAt(index); - loadingState.refresh(); - SmartDialog.showToast('删除成功'); - } else { - SmartDialog.showToast(res['msg']); - } - } - - Future onSetTop(int index, bool isTop, SessionId sessionId) async { - var res = isTop - ? await ImGrpc.unpinSession(sessionId: sessionId) - : await ImGrpc.pinSession(sessionId: sessionId); - - if (res['status']) { - List list = loadingState.value.data!; - list[index].isPinned = isTop ? false : true; - if (!isTop) { - list.insert(0, list.removeAt(index)); - } - loadingState.refresh(); - SmartDialog.showToast('${isTop ? '移除' : ''}置顶成功'); - } else { - SmartDialog.showToast(res['msg']); - } - } - - void onTap(int index) { - Session item = loadingState.value.data![index]; - if (item.hasUnread()) { - item.clearUnread(); - loadingState.refresh(); - } - } - - Future onClearUnread() async { - final res = await ImGrpc.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']); - } - } - - Future onDeleteList() async { - var res = await ImGrpc.deleteSessionList( - pageType: SessionPageType.SESSION_PAGE_TYPE_HOME); - if (res['status']) { - loadingState.value = LoadingState.success(null); - } else { - SmartDialog.showToast(res['msg']); - } - } } diff --git a/lib/pages/whisper/view.dart b/lib/pages/whisper/view.dart index 85e78aba..c226cf2e 100644 --- a/lib/pages/whisper/view.dart +++ b/lib/pages/whisper/view.dart @@ -126,7 +126,6 @@ class _WhisperPageState extends State { onSetTop: (isTop, id) => _controller.onSetTop(index, isTop, id), onRemove: (talkerId) => _controller.onRemove(index, talkerId), - onTap: () => _controller.onTap(index), ); }, separatorBuilder: (context, index) => Divider( diff --git a/lib/pages/whisper/widgets/item.dart b/lib/pages/whisper/widgets/item.dart index 24c0f56d..76810525 100644 --- a/lib/pages/whisper/widgets/item.dart +++ b/lib/pages/whisper/widgets/item.dart @@ -18,13 +18,11 @@ class WhisperSessionItem extends StatelessWidget { required this.item, required this.onSetTop, required this.onRemove, - required this.onTap, }); final Session item; final Function(bool isTop, SessionId id) onSetTop; final ValueChanged onRemove; - final VoidCallback onTap; @override Widget build(BuildContext context) { @@ -77,7 +75,12 @@ class WhisperSessionItem extends StatelessWidget { ); }, onTap: () { - onTap(); + if (item.hasUnread()) { + item.clearUnread(); + if (context.mounted) { + (context as Element).markNeedsBuild(); + } + } if (item.id.privateId.hasTalkerUid()) { Get.toNamed( '/whisperDetail', diff --git a/lib/pages/whisper_secondary/controller.dart b/lib/pages/whisper_secondary/controller.dart index 439ed8d4..6d694cb5 100644 --- a/lib/pages/whisper_secondary/controller.dart +++ b/lib/pages/whisper_secondary/controller.dart @@ -1,26 +1,19 @@ import 'package:PiliPlus/grpc/bilibili/app/im/v1.pb.dart' - show - Offset, - Session, - SessionId, - SessionPageType, - SessionSecondaryReply, - ThreeDotItem; + show Offset, Session, SessionPageType, SessionSecondaryReply, ThreeDotItem; import 'package:PiliPlus/grpc/im.dart'; import 'package:PiliPlus/http/loading_state.dart'; -import 'package:PiliPlus/http/msg.dart'; -import 'package:PiliPlus/pages/common/common_list_controller.dart'; -import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; +import 'package:PiliPlus/pages/common/common_whisper_controller.dart'; import 'package:get/get.dart'; import 'package:protobuf/protobuf.dart' show PbMap; class WhisperSecController - extends CommonListController { + extends CommonWhisperController { WhisperSecController({ required this.sessionPageType, }); PbMap? offset; + @override final SessionPageType sessionPageType; Rx?> threeDotItems = Rx?>(null); @@ -60,71 +53,4 @@ class WhisperSecController offset: offset, pageType: sessionPageType, ); - - Future onRemove(int index, int? talkerId) async { - var res = await MsgHttp.removeMsg(talkerId); - if (res['status']) { - loadingState - ..value.data!.removeAt(index) - ..refresh(); - SmartDialog.showToast('删除成功'); - } else { - SmartDialog.showToast(res['msg']); - } - } - - Future onSetTop(int index, bool isTop, SessionId sessionId) async { - var res = isTop - ? await ImGrpc.unpinSession(sessionId: sessionId) - : await ImGrpc.pinSession(sessionId: sessionId); - - if (res['status']) { - List list = loadingState.value.data!; - list[index].isPinned = isTop ? false : true; - if (!isTop) { - list.insert(0, list.removeAt(index)); - } - loadingState.refresh(); - SmartDialog.showToast('${isTop ? '移除' : ''}置顶成功'); - } else { - SmartDialog.showToast(res['msg']); - } - } - - void onTap(int index) { - Session item = loadingState.value.data![index]; - if (item.hasUnread()) { - item.clearUnread(); - loadingState.refresh(); - } - } - - Future onClearUnread() async { - final res = await ImGrpc.clearUnread(pageType: sessionPageType); - 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']); - } - } - - Future onDeleteList() async { - var res = await ImGrpc.deleteSessionList(pageType: sessionPageType); - if (res['status']) { - loadingState.value = LoadingState.success(null); - } else { - SmartDialog.showToast(res['msg']); - } - } } diff --git a/lib/pages/whisper_secondary/view.dart b/lib/pages/whisper_secondary/view.dart index a67d83fa..126003af 100644 --- a/lib/pages/whisper_secondary/view.dart +++ b/lib/pages/whisper_secondary/view.dart @@ -107,7 +107,6 @@ class _WhisperSecPageState extends State { onSetTop: (isTop, talkerId) => _controller.onSetTop(index, isTop, talkerId), onRemove: (talkerId) => _controller.onRemove(index, talkerId), - onTap: () => _controller.onTap(index), ); }, separatorBuilder: (context, index) => Divider(