From 0d1ad9354686d6e7053d0673542d1570144290a0 Mon Sep 17 00:00:00 2001 From: Gaetan Butault Date: Sat, 14 Feb 2026 19:42:01 -0500 Subject: [PATCH 1/2] call _onRemove with value AFTER the list update --- commet/lib/client/alert.dart | 4 +- commet/lib/client/client.dart | 10 +-- commet/lib/client/client_manager.dart | 39 ++++----- .../photo_album_timeline.dart | 6 +- .../matrix_direct_messages_component.dart | 6 +- .../matrix_photo_album_timeline.dart | 6 +- commet/lib/client/matrix/matrix_client.dart | 10 +-- commet/lib/client/matrix/matrix_space.dart | 18 ++-- .../matrix_background_client.dart | 10 +-- commet/lib/client/space.dart | 12 +-- .../photo_albums/photo_album_view.dart | 6 +- .../sidebar_call_icon/sidebar_calls_list.dart | 2 +- .../background_task_manager.dart | 4 +- commet/lib/utils/notifying_list.dart | 87 +++++++++---------- 14 files changed, 104 insertions(+), 116 deletions(-) diff --git a/commet/lib/client/alert.dart b/commet/lib/client/alert.dart index 50ab51659..c0547e27d 100644 --- a/commet/lib/client/alert.dart +++ b/commet/lib/client/alert.dart @@ -24,9 +24,9 @@ class Alert { class AlertManager { final NotifyingList _alerts = NotifyingList.empty(growable: true); - Stream get onAlertAdded => _alerts.onAdd; + Stream get onAlertAdded => _alerts.onAdd; - Stream get onAlertRemoved => _alerts.onRemove; + Stream get onAlertRemoved => _alerts.onRemove; List get alerts => _alerts; diff --git a/commet/lib/client/client.dart b/commet/lib/client/client.dart index e504ddec4..045617d65 100644 --- a/commet/lib/client/client.dart +++ b/commet/lib/client/client.dart @@ -106,19 +106,19 @@ abstract class Client { List get peers; /// When a room is added, this will be called with the index of the new room - Stream get onRoomAdded; + Stream get onRoomAdded; /// When a space is added, this will be called with the index of the new space - Stream get onSpaceAdded; + Stream get onSpaceAdded; /// When a room is removed, this will be called with the index of the room which was removed - Stream get onRoomRemoved; + Stream get onRoomRemoved; /// When a space is removed, this will be called with the index of the space which was removed - Stream get onSpaceRemoved; + Stream get onSpaceRemoved; /// When a new peer is found, this will be called with the index of the new peer - Stream get onPeerAdded; + Stream get onPeerAdded; /// When the client receives an update from the server, this will be called Stream get onSync; diff --git a/commet/lib/client/client_manager.dart b/commet/lib/client/client_manager.dart index 454ebd719..8a00bd802 100644 --- a/commet/lib/client/client_manager.dart +++ b/commet/lib/client/client_manager.dart @@ -66,13 +66,13 @@ class ClientManager { late StreamController onSync = StreamController.broadcast(); - Stream get onRoomAdded => _rooms.onAdd; + Stream get onRoomAdded => _rooms.onAdd; - Stream get onRoomRemoved => _rooms.onRemove; + Stream get onRoomRemoved => _rooms.onRemove; - Stream get onSpaceAdded => _spaces.onAdd; + Stream get onSpaceAdded => _spaces.onAdd; - Stream get onSpaceRemoved => _spaces.onRemove; + Stream get onSpaceRemoved => _spaces.onRemove; late StreamController onClientAdded = StreamController.broadcast(); @@ -108,22 +108,22 @@ class ClientManager { _clientsList.add(client); - for (int i = 0; i < client.rooms.length; i++) { - _onClientAddedRoom(client, i); + for (final e in client.rooms) { + _onClientAddedRoom(client, e); } - for (int i = 0; i < client.spaces.length; i++) { - _addSpace(client, i); + for (final e in client.spaces) { + _addSpace(client, e); } _clientSubscriptions[client] = [ client.onSync.listen((_) => _synced()), - client.onRoomAdded.listen((index) => _onClientAddedRoom(client, index)), + client.onRoomAdded.listen((room) => _onClientAddedRoom(client, room)), client.onRoomRemoved - .listen((index) => _onClientRemovedRoom(client, index)), - client.onSpaceAdded.listen((index) => _addSpace(client, index)), + .listen((room) => _onClientRemovedRoom(client, room)), + client.onSpaceAdded.listen((space) => _addSpace(client, space)), client.onSpaceRemoved - .listen((index) => _onClientRemovedSpace(client, index)), + .listen((space) => _onClientRemovedSpace(client, space)), client.connectionStatusChanged.stream .listen((event) => _onClientConnectionStatusChanged(client, event)), ]; @@ -146,25 +146,22 @@ class ClientManager { } } - void _onClientAddedRoom(Client client, int index) { - rooms.add(client.rooms[index]); + void _onClientAddedRoom(Client client, Room room) { + rooms.add(room); } - void _onClientRemovedRoom(Client client, int index) { - var room = client.rooms[index]; + void _onClientRemovedRoom(Client client, Room room) { _rooms.remove(room); } - void _onClientRemovedSpace(Client client, int index) { - var space = client.spaces[index]; + void _onClientRemovedSpace(Client client, Space space) { _spaces.remove(space); } - void _addSpace(Client client, int index) { - var space = client.spaces[index]; + void _addSpace(Client client, Space space) { space.onUpdate.listen((_) => spaceUpdated(space)); space.onChildRoomUpdated.listen((_) => spaceChildUpdated(space)); - spaces.add(client.spaces[index]); + spaces.add(space); } void spaceUpdated(Space space) { diff --git a/commet/lib/client/components/photo_album_room/photo_album_timeline.dart b/commet/lib/client/components/photo_album_room/photo_album_timeline.dart index ba34200e0..0b6e5a929 100644 --- a/commet/lib/client/components/photo_album_room/photo_album_timeline.dart +++ b/commet/lib/client/components/photo_album_room/photo_album_timeline.dart @@ -1,9 +1,9 @@ import 'package:commet/client/components/photo_album_room/photo.dart'; abstract class PhotoAlbumTimeline { - Stream get onAdded; - Stream get onChanged; - Stream get onRemoved; + Stream get onAdded; + Stream get onChanged; + Stream get onRemoved; List get photos; diff --git a/commet/lib/client/matrix/components/direct_messages/matrix_direct_messages_component.dart b/commet/lib/client/matrix/components/direct_messages/matrix_direct_messages_component.dart index 777ee5d88..bd5a9a92b 100644 --- a/commet/lib/client/matrix/components/direct_messages/matrix_direct_messages_component.dart +++ b/commet/lib/client/matrix/components/direct_messages/matrix_direct_messages_component.dart @@ -81,8 +81,7 @@ class MatrixDirectMessagesComponent return client.getRoom(roomId); } - void onRoomAdded(int index) { - var room = client.rooms[index]; + void onRoomAdded(Room room) { if (isRoomDirectMessage(room)) { updateRoomsList(); } @@ -107,8 +106,7 @@ class MatrixDirectMessagesComponent } } - void onRoomRemoved(int index) { - var room = client.rooms[index]; + void onRoomRemoved(Room room) { directMessageRooms.remove(room); listUpdated.add(null); } diff --git a/commet/lib/client/matrix/components/photo_album_room/matrix_photo_album_timeline.dart b/commet/lib/client/matrix/components/photo_album_room/matrix_photo_album_timeline.dart index 97c3e2151..1ee11e104 100644 --- a/commet/lib/client/matrix/components/photo_album_room/matrix_photo_album_timeline.dart +++ b/commet/lib/client/matrix/components/photo_album_room/matrix_photo_album_timeline.dart @@ -19,13 +19,13 @@ class MatrixPhotoAlbumTimeline implements PhotoAlbumTimeline { MatrixPhotoAlbumTimeline(this.room); @override - Stream get onAdded => _photos.onAdd; + Stream get onAdded => _photos.onAdd; @override - Stream get onChanged => _photos.onItemUpdated; + Stream get onChanged => _photos.onItemUpdated; @override - Stream get onRemoved => _photos.onRemove; + Stream get onRemoved => _photos.onRemove; Future initTimeline() async { matrixTimeline = await room.getTimeline(); diff --git a/commet/lib/client/matrix/matrix_client.dart b/commet/lib/client/matrix/matrix_client.dart index fba2ee803..9e10081bd 100644 --- a/commet/lib/client/matrix/matrix_client.dart +++ b/commet/lib/client/matrix/matrix_client.dart @@ -109,19 +109,19 @@ class MatrixClient extends Client { String get identifier => _id; @override - Stream get onPeerAdded => _peers.onAdd; + Stream get onPeerAdded => _peers.onAdd; @override - Stream get onRoomAdded => _rooms.onAdd; + Stream get onRoomAdded => _rooms.onAdd; @override - Stream get onSpaceAdded => _spaces.onAdd; + Stream get onSpaceAdded => _spaces.onAdd; @override - Stream get onRoomRemoved => _rooms.onRemove; + Stream get onRoomRemoved => _rooms.onRemove; @override - Stream get onSpaceRemoved => _spaces.onRemove; + Stream get onSpaceRemoved => _spaces.onRemove; @override Stream get onSync => _onSync.stream; diff --git a/commet/lib/client/matrix/matrix_space.dart b/commet/lib/client/matrix/matrix_space.dart index 0978853ac..d8fc3fb9f 100644 --- a/commet/lib/client/matrix/matrix_space.dart +++ b/commet/lib/client/matrix/matrix_space.dart @@ -100,10 +100,10 @@ class MatrixSpace extends Space { String get identifier => _matrixRoom.id; @override - Stream get onChildRoomPreviewAdded => _previews.onAdd; + Stream get onChildRoomPreviewAdded => _previews.onAdd; @override - Stream get onChildRoomPreviewRemoved => _previews.onRemove; + Stream get onChildRoomPreviewRemoved => _previews.onRemove; @override Stream get onChildRoomPreviewsUpdated => _previews.onListUpdated; @@ -118,16 +118,16 @@ class MatrixSpace extends Space { List get subspaces => _subspaces; @override - Stream get onChildSpaceAdded => _subspaces.onAdd; + Stream get onChildSpaceAdded => _subspaces.onAdd; @override - Stream get onChildSpaceRemoved => _subspaces.onRemove; + Stream get onChildSpaceRemoved => _subspaces.onRemove; @override - Stream get onRoomAdded => _rooms.onAdd; + Stream get onRoomAdded => _rooms.onAdd; @override - Stream get onRoomRemoved => _rooms.onRemove; + Stream get onRoomRemoved => _rooms.onRemove; @override Stream get onUpdate => _onUpdate.stream; @@ -216,8 +216,7 @@ class MatrixSpace extends Space { _avatar = avatar; } - void onClientRoomRemoved(int index) { - var leftRoom = client.rooms[index]; + void onClientRoomRemoved(Room leftRoom) { if (containsRoom(leftRoom.identifier)) { _rooms.remove(leftRoom); } @@ -270,8 +269,7 @@ class MatrixSpace extends Space { }); } - void _onRoomAdded(int index) { - var room = _rooms[index]; + void _onRoomAdded(Room room) { _subscriptions.add(room.onUpdate.listen((event) { _onChildUpdated.add(room); })); diff --git a/commet/lib/client/matrix_background/matrix_background_client.dart b/commet/lib/client/matrix_background/matrix_background_client.dart index a1a894c75..477ab0799 100644 --- a/commet/lib/client/matrix_background/matrix_background_client.dart +++ b/commet/lib/client/matrix_background/matrix_background_client.dart @@ -51,19 +51,19 @@ class MatrixBackgroundClient implements Client { int? get maxFileSize => 0; @override - Stream get onPeerAdded => Stream.empty(); + Stream get onPeerAdded => Stream.empty(); @override - Stream get onRoomAdded => Stream.empty(); + Stream get onRoomAdded => Stream.empty(); @override - Stream get onRoomRemoved => Stream.empty(); + Stream get onRoomRemoved => Stream.empty(); @override - Stream get onSpaceAdded => Stream.empty(); + Stream get onSpaceAdded => Stream.empty(); @override - Stream get onSpaceRemoved => Stream.empty(); + Stream get onSpaceRemoved => Stream.empty(); @override Stream get onSync => Stream.empty(); diff --git a/commet/lib/client/space.dart b/commet/lib/client/space.dart index c07bc9a5b..af10ec00e 100644 --- a/commet/lib/client/space.dart +++ b/commet/lib/client/space.dart @@ -62,19 +62,19 @@ abstract class Space { Stream get onChildRoomUpdated; - Stream get onRoomAdded; + Stream get onRoomAdded; - Stream get onRoomRemoved; + Stream get onRoomRemoved; Stream get onChildRoomsUpdated; - Stream get onChildRoomPreviewAdded; + Stream get onChildRoomPreviewAdded; - Stream get onChildRoomPreviewRemoved; + Stream get onChildRoomPreviewRemoved; - Stream get onChildSpaceAdded; + Stream get onChildSpaceAdded; - Stream get onChildSpaceRemoved; + Stream get onChildSpaceRemoved; Stream get onChildRoomPreviewsUpdated; diff --git a/commet/lib/ui/organisms/photo_albums/photo_album_view.dart b/commet/lib/ui/organisms/photo_albums/photo_album_view.dart index 39c6293d1..21b5e88b8 100644 --- a/commet/lib/ui/organisms/photo_albums/photo_album_view.dart +++ b/commet/lib/ui/organisms/photo_albums/photo_album_view.dart @@ -43,7 +43,7 @@ class _PhotoAlbumViewState extends State { late List subs; - void onAdded(int event) { + void onAdded(Photo event) { setState(() { numItems = timeline!.photos.length; }); @@ -397,13 +397,13 @@ class _PhotoAlbumViewState extends State { builder: (_) => PhotosAlbumUploadView(f, widget.component)); } - void onChanged(int event) { + void onChanged(Photo event) { setState(() { numItems = timeline!.photos.length; }); } - void onRemoved(int event) { + void onRemoved(Photo event) { setState(() { numItems = timeline!.photos.length; }); diff --git a/commet/lib/ui/organisms/sidebar_call_icon/sidebar_calls_list.dart b/commet/lib/ui/organisms/sidebar_call_icon/sidebar_calls_list.dart index 0cf197ae4..056e63f0d 100644 --- a/commet/lib/ui/organisms/sidebar_call_icon/sidebar_calls_list.dart +++ b/commet/lib/ui/organisms/sidebar_call_icon/sidebar_calls_list.dart @@ -44,7 +44,7 @@ class _SidebarCallsListState extends State { }); sessions.onRemove.listen((event) { - if (sessions[event] == selectedSession) { + if (event == selectedSession) { setState(() { selectedSession = null; link = null; diff --git a/commet/lib/utils/background_tasks/background_task_manager.dart b/commet/lib/utils/background_tasks/background_task_manager.dart index fe4043ad3..5be02867d 100644 --- a/commet/lib/utils/background_tasks/background_task_manager.dart +++ b/commet/lib/utils/background_tasks/background_task_manager.dart @@ -6,9 +6,9 @@ import 'package:commet/utils/notifying_list.dart'; class BackgroundTaskManager { NotifyingList tasks = NotifyingList.empty(growable: true); - Stream get onTaskAdded => tasks.onAdd; + Stream get onTaskAdded => tasks.onAdd; - Stream get onTaskRemoved => tasks.onRemove; + Stream get onTaskRemoved => tasks.onRemove; Stream get onListUpdate => tasks.onListUpdated; diff --git a/commet/lib/utils/notifying_list.dart b/commet/lib/utils/notifying_list.dart index 77978ddca..c1d2e85ae 100644 --- a/commet/lib/utils/notifying_list.dart +++ b/commet/lib/utils/notifying_list.dart @@ -4,24 +4,24 @@ import 'dart:math'; class NotifyingList implements List { List _internalList; - late StreamController _onAdd = StreamController.broadcast(); + late StreamController _onAdd = StreamController.broadcast(); - late StreamController _onRemove = StreamController.broadcast(); + late StreamController _onRemove = StreamController.broadcast(); late StreamController _onListUpdated = StreamController.broadcast(); - late StreamController _onItemUpdated = StreamController.broadcast(); + late StreamController _onItemUpdated = StreamController.broadcast(); // This stream is called after an item is added to the list - Stream get onAdd => _onAdd.stream; + Stream get onAdd => _onAdd.stream; // This stream is called just before an item is removed from the list, the item will still be accessible at this index until the stream is completed - Stream get onRemove => _onRemove.stream; + Stream get onRemove => _onRemove.stream; // This stream is called whenever the items in the list are changed Stream get onListUpdated => _onListUpdated.stream; - Stream get onItemUpdated => _onItemUpdated.stream; + Stream get onItemUpdated => _onItemUpdated.stream; @override T get first => _internalList.first; @@ -42,13 +42,13 @@ class NotifyingList implements List { @override set first(T value) { _internalList.first = value; - _onItemUpdated.add(0); + _onItemUpdated.add(value); } @override set last(T value) { _internalList.last = value; - _onItemUpdated.add(_internalList.length - 1); + _onItemUpdated.add(value); } @override @@ -89,24 +89,20 @@ class NotifyingList implements List { @override void operator []=(int index, T value) { _internalList[index] = value; - _onItemUpdated.add(index); + _onItemUpdated.add(value); } @override void add(T value) { _internalList.add(value); - _onAdd.add(_internalList.length - 1); + _onAdd.add(value); } @override void addAll(Iterable iterable) { - int prevLength = _internalList.length; - _internalList.addAll(iterable); - for (int i = 0; i < iterable.length; i++) { - _onAdd.add(prevLength + i); + for (final e in iterable) { + add(e); } - - _onAnyUpdate(null); } @override @@ -126,11 +122,11 @@ class NotifyingList implements List { @override void clear() { - for (int i = 0; i < _internalList.length; i++) { - _onRemove.add(i); + List oldList = _internalList; + this._internalList = List.empty(growable: true); + for (final entry in oldList) { + _onRemove.add(entry); } - - _internalList.clear(); } @override @@ -196,7 +192,7 @@ class NotifyingList implements List { @override void insert(int index, T element) { _internalList.insert(index, element); - _onAdd.add(index); + _onAdd.add(element); } @override @@ -204,7 +200,7 @@ class NotifyingList implements List { int oldLength = iterable.length; _internalList.insertAll(index, iterable); for (int i = 0; i < oldLength; i++) { - _onAdd.add(oldLength + i); + _onAdd.add(_internalList[oldLength + i]); } } @@ -249,10 +245,8 @@ class NotifyingList implements List { @override bool remove(Object? value) { - var index = _internalList.indexWhere((element) => element == value); - if (index != -1) { - _onRemove.add(index); - _internalList.removeAt(index); + if (_internalList.remove(value)) { + _onRemove.add(value as T); return true; } @@ -261,33 +255,36 @@ class NotifyingList implements List { @override T removeAt(int index) { - _onRemove.add(index); - return _internalList.removeAt(index); + T value = _internalList.removeAt(index); + _onRemove.add(value); + return value; } @override T removeLast() { - _onRemove.add(_internalList.length - 1); - return _internalList.removeLast(); + T value = _internalList.removeLast(); + _onRemove.add(value); + return value; } @override void removeRange(int start, int end) { + List removed = List.empty(growable: true); for (int i = start; i < end; i++) { - _onRemove.add(i); + removed.add(i); + } + _internalList.removeRange(start, end); + for (final e in removed) { + _onRemove.add(e); } - - return _internalList.removeRange(start, end); } @override void removeWhere(bool Function(T element) test) { - for (int i = 0; i < _internalList.length; i++) { - var item = _internalList[i]; - if (test(item)) { - _onRemove.add(i); - _internalList.removeAt(i); - } + List removed = List.empty(growable: true); + _internalList.removeWhere((element) {if (test(element)) {removed.add(element);return true;}; return false;}); + for (final entry in removed) { + _onRemove.add(entry); } } @@ -296,7 +293,7 @@ class NotifyingList implements List { _internalList.replaceRange(start, end, replacements); for (int i = start; i < end; i++) { - _onItemUpdated.add(i); + _onItemUpdated.add(_internalList[i]); } } @@ -310,20 +307,18 @@ class NotifyingList implements List { @override void setAll(int index, Iterable iterable) { + _internalList.setAll(index, iterable); for (int i = 0; i < iterable.length; i++) { - _onItemUpdated.add(index + i); + _onItemUpdated.add(_internalList[index + i]); } - - return _internalList.setAll(index, iterable); } @override void setRange(int start, int end, Iterable iterable, [int skipCount = 0]) { + _internalList.setRange(start, end, iterable); for (int i = start; i < end; i++) { - _onItemUpdated.add(i); + _onItemUpdated.add(_internalList[i]); } - - return _internalList.setRange(start, end, iterable); } @override From 015323ef69bf0da8d35fa4791cccdba4cf6b7b28 Mon Sep 17 00:00:00 2001 From: Gaetan Butault Date: Mon, 16 Feb 2026 19:21:21 -0500 Subject: [PATCH 2/2] formating --- commet/lib/utils/notifying_list.dart | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/commet/lib/utils/notifying_list.dart b/commet/lib/utils/notifying_list.dart index c1d2e85ae..6bf8d37bf 100644 --- a/commet/lib/utils/notifying_list.dart +++ b/commet/lib/utils/notifying_list.dart @@ -282,7 +282,14 @@ class NotifyingList implements List { @override void removeWhere(bool Function(T element) test) { List removed = List.empty(growable: true); - _internalList.removeWhere((element) {if (test(element)) {removed.add(element);return true;}; return false;}); + _internalList.removeWhere((element) { + if (test(element)) { + removed.add(element); + return true; + } + ; + return false; + }); for (final entry in removed) { _onRemove.add(entry); }