diff --git a/lib/providers/app_provider.dart b/lib/providers/app_provider.dart index 515d5ee..7771600 100644 --- a/lib/providers/app_provider.dart +++ b/lib/providers/app_provider.dart @@ -836,6 +836,9 @@ class AppProvider with ChangeNotifier { ' 🗑️ Channel $channelIdx deleted - removing from providers', ); + messagesProvider.clearChannelMessages(channelIdx); + debugPrint(' ✅ Cleared channel messages'); + // Remove from ChannelsProvider channelsProvider.removeChannel(channelIdx); debugPrint(' ✅ Removed from ChannelsProvider'); diff --git a/lib/providers/connection_provider.dart b/lib/providers/connection_provider.dart index b61458f..5133cb8 100644 --- a/lib/providers/connection_provider.dart +++ b/lib/providers/connection_provider.dart @@ -1115,6 +1115,10 @@ class ConnectionProvider with ChangeNotifier { '✅ [Provider] Channel deleted successfully from slot $channelIdx', ); + // Soft-reset local UI state immediately, matching meshcore-open's + // behavior, then reconcile with an on-device refresh below. + onChannelInfoReceived?.call(channelIdx, '', Uint8List(16), null); + // Small delay to allow the response to propagate await Future.delayed(const Duration(milliseconds: 100)); diff --git a/lib/providers/messages_provider.dart b/lib/providers/messages_provider.dart index 856b9ca..ea78167 100644 --- a/lib/providers/messages_provider.dart +++ b/lib/providers/messages_provider.dart @@ -916,6 +916,50 @@ class MessagesProvider with ChangeNotifier { .toList(); } + /// Remove all messages associated with a specific channel. + void clearChannelMessages(int channelIdx) { + final messageIdsToRemove = _messages + .where((message) => message.isChannelMessage && message.channelIdx == channelIdx) + .map((message) => message.id) + .toList(); + + if (messageIdsToRemove.isEmpty) { + return; + } + + _messages.removeWhere( + (message) => message.isChannelMessage && message.channelIdx == channelIdx, + ); + + for (final messageId in messageIdsToRemove) { + _timeoutTimers[messageId]?.cancel(); + _timeoutTimers.remove(messageId); + _messageContactMap.remove(messageId); + _groupedMessageMapping.remove(messageId); + _messageContactLocations.remove(messageId); + _messageReceptionDetails.remove(messageId); + _messageTransferDetails.remove(messageId); + _messageRouteMetadata.remove(messageId); + } + + _pendingSentMessages.removeWhere( + (_, message) => message.isChannelMessage && message.channelIdx == channelIdx, + ); + _messageAckHistory.removeWhere( + (messageId, _) => messageIdsToRemove.contains(messageId), + ); + _ackHistoryLookup.removeWhere( + (_, value) => messageIdsToRemove.contains(value.$1), + ); + + debugPrint( + '🗑️ [MessagesProvider] Cleared ${messageIdsToRemove.length} message(s) for channel $channelIdx', + ); + + _persistMessages(); + notifyListeners(); + } + /// Get recent messages (last N messages) List getRecentMessages({int count = 50}) { final sorted = List.from(_messages)