Fix channel deletion state

This commit is contained in:
Janez T
2026-03-13 18:49:54 +01:00
parent dc19296804
commit 36584be0ab
3 changed files with 51 additions and 0 deletions

View File

@@ -836,6 +836,9 @@ class AppProvider with ChangeNotifier {
' 🗑️ Channel $channelIdx deleted - removing from providers', ' 🗑️ Channel $channelIdx deleted - removing from providers',
); );
messagesProvider.clearChannelMessages(channelIdx);
debugPrint(' ✅ Cleared channel messages');
// Remove from ChannelsProvider // Remove from ChannelsProvider
channelsProvider.removeChannel(channelIdx); channelsProvider.removeChannel(channelIdx);
debugPrint(' ✅ Removed from ChannelsProvider'); debugPrint(' ✅ Removed from ChannelsProvider');

View File

@@ -1115,6 +1115,10 @@ class ConnectionProvider with ChangeNotifier {
'✅ [Provider] Channel deleted successfully from slot $channelIdx', '✅ [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 // Small delay to allow the response to propagate
await Future.delayed(const Duration(milliseconds: 100)); await Future.delayed(const Duration(milliseconds: 100));

View File

@@ -916,6 +916,50 @@ class MessagesProvider with ChangeNotifier {
.toList(); .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) /// Get recent messages (last N messages)
List<Message> getRecentMessages({int count = 50}) { List<Message> getRecentMessages({int count = 50}) {
final sorted = List<Message>.from(_messages) final sorted = List<Message>.from(_messages)