From 065df414dff778e240b2bf16c4f38c58f054365d Mon Sep 17 00:00:00 2001 From: Deven Joshi Date: Thu, 25 Nov 2021 16:54:23 +0530 Subject: [PATCH] fixed deletion off the main list and offline storage --- packages/stream_chat/lib/src/client/channel.dart | 13 ++++++++++--- packages/stream_chat/lib/src/client/client.dart | 10 ++++++++-- packages/stream_chat/lib/src/core/models/event.dart | 7 +++++++ .../stream_chat/lib/src/core/models/event.g.dart | 2 ++ 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/packages/stream_chat/lib/src/client/channel.dart b/packages/stream_chat/lib/src/client/channel.dart index 482427d6..b4a29ca4 100644 --- a/packages/stream_chat/lib/src/client/channel.dart +++ b/packages/stream_chat/lib/src/client/channel.dart @@ -1663,7 +1663,11 @@ class ChannelClientState { void _listenMessageDeleted() { _subscriptions.add(_channel.on(EventType.messageDeleted).listen((event) { final message = event.message!; - addMessage(message); + if (event.hardDelete == true) { + removeMessage(message, hardDelete: true); + } else { + addMessage(message); + } })); } @@ -1718,7 +1722,7 @@ class ChannelClientState { } /// Remove a [message] from this [channelState]. - void removeMessage(Message message) { + void removeMessage(Message message, {bool hardDelete = false}) { final parentId = message.parentId; // i.e. it's a thread message // 1. Remove the thread message @@ -1740,7 +1744,10 @@ class ChannelClientState { } else { // Remove regular message final allMessages = [...messages]; - if (allMessages.remove(message)) { + if (hardDelete) { + allMessages.removeWhere((e) => e.id == message.id); + _channelState = _channelState.copyWith(messages: allMessages); + } else if (allMessages.remove(message)) { _channelState = _channelState.copyWith(messages: allMessages); } } diff --git a/packages/stream_chat/lib/src/client/client.dart b/packages/stream_chat/lib/src/client/client.dart index ef03288d..d6b9e8b5 100644 --- a/packages/stream_chat/lib/src/client/client.dart +++ b/packages/stream_chat/lib/src/client/client.dart @@ -1213,8 +1213,14 @@ class StreamChatClient { ); /// Deletes the given message - Future deleteMessage(String messageId, {bool? hard}) => - _chatApi.message.deleteMessage(messageId, hard: hard); + Future deleteMessage(String messageId, {bool? hard}) async { + final response = + await _chatApi.message.deleteMessage(messageId, hard: hard); + if (hard == true) { + await _chatPersistenceClient?.deleteMessageById(messageId); + } + return response; + } /// Get a message by [messageId] Future getMessage(String messageId) => diff --git a/packages/stream_chat/lib/src/core/models/event.dart b/packages/stream_chat/lib/src/core/models/event.dart index aed35696..b8ddafa7 100644 --- a/packages/stream_chat/lib/src/core/models/event.dart +++ b/packages/stream_chat/lib/src/core/models/event.dart @@ -27,6 +27,7 @@ class Event { this.channelId, this.channelType, this.parentId, + this.hardDelete, this.extraData = const {}, this.isLocal = true, }) : createdAt = createdAt?.toUtc() ?? DateTime.now().toUtc(); @@ -91,6 +92,9 @@ class Event { @JsonKey(defaultValue: false) final bool isLocal; + /// This is true if the message has been hard deleted + final bool? hardDelete; + /// Map of custom channel extraData final Map extraData; @@ -113,6 +117,7 @@ class Event { 'channel_id', 'channel_type', 'parent_id', + 'hard_delete', 'is_local', ]; @@ -139,6 +144,7 @@ class Event { int? unreadChannels, bool? online, String? parentId, + bool? hardDelete, Map? extraData, }) => Event( @@ -158,6 +164,7 @@ class Event { channelId: channelId ?? this.channelId, channelType: channelType ?? this.channelType, parentId: parentId ?? this.parentId, + hardDelete: hardDelete ?? this.hardDelete, extraData: extraData ?? this.extraData, isLocal: isLocal, ); diff --git a/packages/stream_chat/lib/src/core/models/event.g.dart b/packages/stream_chat/lib/src/core/models/event.g.dart index 29a4482b..3a521c9a 100644 --- a/packages/stream_chat/lib/src/core/models/event.g.dart +++ b/packages/stream_chat/lib/src/core/models/event.g.dart @@ -37,6 +37,7 @@ Event _$EventFromJson(Map json) => Event( channelId: json['channel_id'] as String?, channelType: json['channel_type'] as String?, parentId: json['parent_id'] as String?, + hardDelete: json['hard_delete'] as bool?, extraData: json['extra_data'] as Map? ?? const {}, isLocal: json['is_local'] as bool? ?? false, ); @@ -59,6 +60,7 @@ Map _$EventToJson(Event instance) => { 'online': instance.online, 'parent_id': instance.parentId, 'is_local': instance.isLocal, + 'hard_delete': instance.hardDelete, 'extra_data': instance.extraData, };