Merge branch 'krille/timeline-auto-update-list' into 'main'
feat: Add onInsert, onRemove and onUpdate cb to timeline See merge request famedly/company/frontend/famedlysdk!880
This commit is contained in:
		
						commit
						7f9a75a43d
					
				|  | @ -35,7 +35,9 @@ class Timeline { | |||
|   final Map<String, Map<String, Set<Event>>> aggregatedEvents = {}; | ||||
| 
 | ||||
|   final void Function()? onUpdate; | ||||
|   final void Function(int insertID)? onInsert; | ||||
|   final void Function(int index)? onChange; | ||||
|   final void Function(int index)? onInsert; | ||||
|   final void Function(int index)? onRemove; | ||||
| 
 | ||||
|   StreamSubscription<EventUpdate>? sub; | ||||
|   StreamSubscription<SyncUpdate>? roomSub; | ||||
|  | @ -86,6 +88,11 @@ class Timeline { | |||
|       ); | ||||
|       if (eventsFromStore != null && eventsFromStore.isNotEmpty) { | ||||
|         events.addAll(eventsFromStore); | ||||
|         final startIndex = events.length - eventsFromStore.length; | ||||
|         final endIndex = events.length; | ||||
|         for (var i = startIndex; i < endIndex; i++) { | ||||
|           onInsert?.call(i); | ||||
|         } | ||||
|       } else { | ||||
|         Logs().v('No more events found in the store. Request from server...'); | ||||
|         await room.requestHistory( | ||||
|  | @ -102,9 +109,14 @@ class Timeline { | |||
|     } | ||||
|   } | ||||
| 
 | ||||
|   Timeline( | ||||
|       {required this.room, List<Event>? events, this.onUpdate, this.onInsert}) | ||||
|       : events = events ?? [] { | ||||
|   Timeline({ | ||||
|     required this.room, | ||||
|     List<Event>? events, | ||||
|     this.onUpdate, | ||||
|     this.onChange, | ||||
|     this.onInsert, | ||||
|     this.onRemove, | ||||
|   }) : events = events ?? [] { | ||||
|     sub = room.client.onEvent.stream.listen(_handleEventUpdate); | ||||
|     // If the timeline is limited we want to clear our events cache | ||||
|     roomSub = room.client.onSync.stream | ||||
|  | @ -142,6 +154,7 @@ class Timeline { | |||
|             events[i].content['session_id'] == sessionId) { | ||||
|           events[i] = await encryption.decryptRoomEvent(room.id, events[i], | ||||
|               store: true); | ||||
|           onChange?.call(i); | ||||
|           if (events[i].type != EventTypes.Encrypted) { | ||||
|             decryptAtLeastOneEvent = true; | ||||
|           } | ||||
|  | @ -249,19 +262,21 @@ class Timeline { | |||
|           EventStatus.synced.intValue); | ||||
|       // Redaction events are handled as modification for existing events. | ||||
|       if (eventUpdate.content['type'] == EventTypes.Redaction) { | ||||
|         final eventId = _findEvent(event_id: eventUpdate.content['redacts']); | ||||
|         if (eventId < events.length) { | ||||
|           removeAggregatedEvent(events[eventId]); | ||||
|           events[eventId].setRedactionEvent(Event.fromJson( | ||||
|         final index = _findEvent(event_id: eventUpdate.content['redacts']); | ||||
|         if (index < events.length) { | ||||
|           removeAggregatedEvent(events[index]); | ||||
|           events[index].setRedactionEvent(Event.fromJson( | ||||
|             eventUpdate.content, | ||||
|             room, | ||||
|           )); | ||||
|           onChange?.call(index); | ||||
|         } | ||||
|       } else if (status.isRemoved) { | ||||
|         final i = _findEvent(event_id: eventUpdate.content['event_id']); | ||||
|         if (i < events.length) { | ||||
|           removeAggregatedEvent(events[i]); | ||||
|           events.removeAt(i); | ||||
|           onRemove?.call(i); | ||||
|         } | ||||
|       } else { | ||||
|         final i = _findEvent( | ||||
|  | @ -283,6 +298,7 @@ class Timeline { | |||
|             events[i].status = oldStatus; | ||||
|           } | ||||
|           addAggregatedEvent(events[i]); | ||||
|           onChange?.call(i); | ||||
|         } else { | ||||
|           final newEvent = Event.fromJson( | ||||
|             eventUpdate.content, | ||||
|  | @ -293,14 +309,16 @@ class Timeline { | |||
|               events.indexWhere( | ||||
|                       (e) => e.eventId == eventUpdate.content['event_id']) != | ||||
|                   -1) return; | ||||
|           var index = events.length; | ||||
|           if (eventUpdate.type == EventUpdateType.history) { | ||||
|             events.add(newEvent); | ||||
|           } else { | ||||
|             events.insert(events.firstIndexWhereNotError, newEvent); | ||||
|             index = events.firstIndexWhereNotError; | ||||
|             events.insert(index, newEvent); | ||||
|           } | ||||
| 
 | ||||
|           addAggregatedEvent(newEvent); | ||||
|           onInsert?.call(0); | ||||
|           onInsert?.call(index); | ||||
|         } | ||||
|       } | ||||
|       if (update && !_collectHistoryUpdates) { | ||||
|  |  | |||
|  | @ -34,6 +34,8 @@ void main() { | |||
|     final testTimeStamp = DateTime.now().millisecondsSinceEpoch; | ||||
|     var updateCount = 0; | ||||
|     final insertList = <int>[]; | ||||
|     final changeList = <int>[]; | ||||
|     final removeList = <int>[]; | ||||
|     var olmEnabled = true; | ||||
| 
 | ||||
|     late Client client; | ||||
|  | @ -54,14 +56,15 @@ void main() { | |||
|       room = Room( | ||||
|           id: roomID, client: client, prev_batch: '1234', roomAccountData: {}); | ||||
|       timeline = Timeline( | ||||
|           room: room, | ||||
|           events: [], | ||||
|           onUpdate: () { | ||||
|             updateCount++; | ||||
|           }, | ||||
|           onInsert: (int insertID) { | ||||
|             insertList.add(insertID); | ||||
|           }); | ||||
|         room: room, | ||||
|         events: [], | ||||
|         onUpdate: () { | ||||
|           updateCount++; | ||||
|         }, | ||||
|         onInsert: insertList.add, | ||||
|         onChange: changeList.add, | ||||
|         onRemove: removeList.add, | ||||
|       ); | ||||
|     }); | ||||
| 
 | ||||
|     test('Create', () async { | ||||
|  | @ -100,6 +103,8 @@ void main() { | |||
|       expect(updateCount, 2); | ||||
|       expect(insertList, [0, 0]); | ||||
|       expect(insertList.length, timeline.events.length); | ||||
|       expect(changeList, []); | ||||
|       expect(removeList, []); | ||||
|       expect(timeline.events.length, 2); | ||||
|       expect(timeline.events[0].eventId, '1'); | ||||
|       expect(timeline.events[0].sender.id, '@alice:example.com'); | ||||
|  | @ -146,6 +151,8 @@ void main() { | |||
|       expect(updateCount, 3); | ||||
|       expect(insertList, [0, 0]); | ||||
|       expect(insertList.length, timeline.events.length); | ||||
|       expect(changeList, [1]); | ||||
|       expect(removeList, []); | ||||
|       expect(timeline.events.length, 2); | ||||
|       expect(timeline.events[1].redacted, true); | ||||
|     }); | ||||
|  | @ -211,8 +218,10 @@ void main() { | |||
|       await Future.delayed(Duration(milliseconds: 50)); | ||||
| 
 | ||||
|       expect(updateCount, 13); | ||||
|       expect(insertList, [0, 0, 0, 0, 0, 0, 0]); | ||||
|       expect(insertList, [0, 0, 0, 0, 0, 1, 2]); | ||||
|       expect(insertList.length, timeline.events.length); | ||||
|       expect(changeList, [1, 0, 0, 0, 1, 2]); | ||||
|       expect(removeList, []); | ||||
|       expect(timeline.events[0].status, EventStatus.error); | ||||
|       expect(timeline.events[1].status, EventStatus.error); | ||||
|       expect(timeline.events[2].status, EventStatus.error); | ||||
|  | @ -225,7 +234,9 @@ void main() { | |||
| 
 | ||||
|       expect(updateCount, 14); | ||||
| 
 | ||||
|       expect(insertList, [0, 0, 0, 0, 0, 0, 0]); | ||||
|       expect(insertList, [0, 0, 0, 0, 0, 1, 2]); | ||||
|       expect(changeList, [1, 0, 0, 0, 1, 2]); | ||||
|       expect(removeList, [0]); | ||||
|       expect(timeline.events.length, 6); | ||||
|       expect(timeline.events[0].status, EventStatus.error); | ||||
|     }); | ||||
|  | @ -270,7 +281,9 @@ void main() { | |||
| 
 | ||||
|       expect(updateCount, 17); | ||||
| 
 | ||||
|       expect(insertList, [0, 0, 0, 0, 0, 0, 0, 0]); | ||||
|       expect(insertList, [0, 0, 0, 0, 0, 1, 2, 0]); | ||||
|       expect(changeList, [1, 0, 0, 0, 1, 2, 0, 0]); | ||||
|       expect(removeList, [0]); | ||||
|       expect(timeline.events.length, 1); | ||||
|       expect(timeline.events[0].status, EventStatus.sent); | ||||
|     }); | ||||
|  | @ -283,6 +296,7 @@ void main() { | |||
|       await Future.delayed(Duration(milliseconds: 50)); | ||||
| 
 | ||||
|       expect(updateCount, 20); | ||||
|       expect(insertList, [0, 0, 0, 0, 0, 1, 2, 0, 0, 1, 2]); | ||||
|       expect(timeline.events.length, 3); | ||||
|       expect(timeline.events[0].eventId, '3143273582443PhrSn:example.org'); | ||||
|       expect(timeline.events[1].eventId, '2143273582443PhrSn:example.org'); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue