mirror of
https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios.git
synced 2026-04-19 16:13:42 +02:00
Read receipts: Manage live update in the kit too
This commit is contained in:
@@ -120,89 +120,6 @@
|
||||
[super destroy];
|
||||
}
|
||||
|
||||
- (void)didReceiveReceiptEvent:(MXEvent *)receiptEvent roomState:(MXRoomState *)roomState
|
||||
{
|
||||
// Do the processing on the same processing queue as MXKRoomDataSource
|
||||
dispatch_async(MXKRoomDataSource.processingQueue, ^{
|
||||
|
||||
// Remove the previous displayed read receipt for each user who sent a
|
||||
// new read receipt.
|
||||
// To implement it, we need to find the sender id of each new read receipt
|
||||
// among the read receipts array of all events in all bubbles.
|
||||
NSArray *readReceiptSenders = receiptEvent.readReceiptSenders;
|
||||
|
||||
@synchronized(bubbles)
|
||||
{
|
||||
for (RoomBubbleCellData *cellData in bubbles)
|
||||
{
|
||||
NSMutableDictionary<NSString* /* eventId */, NSArray<MXReceiptData*> *> *updatedCellDataReadReceipts = [NSMutableDictionary dictionary];
|
||||
|
||||
for (NSString *eventId in cellData.readReceipts)
|
||||
{
|
||||
for (MXReceiptData *receiptData in cellData.readReceipts[eventId])
|
||||
{
|
||||
for (NSString *senderId in readReceiptSenders)
|
||||
{
|
||||
if ([receiptData.userId isEqualToString:senderId])
|
||||
{
|
||||
if (!updatedCellDataReadReceipts[eventId])
|
||||
{
|
||||
updatedCellDataReadReceipts[eventId] = cellData.readReceipts[eventId];
|
||||
}
|
||||
|
||||
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"userId!=%@", receiptData.userId];
|
||||
updatedCellDataReadReceipts[eventId] = [updatedCellDataReadReceipts[eventId] filteredArrayUsingPredicate:predicate];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// Flush found changed to the cell data
|
||||
for (NSString *eventId in updatedCellDataReadReceipts)
|
||||
{
|
||||
if (updatedCellDataReadReceipts[eventId].count)
|
||||
{
|
||||
cellData.readReceipts[eventId] = updatedCellDataReadReceipts[eventId];
|
||||
}
|
||||
else
|
||||
{
|
||||
cellData.readReceipts[eventId] = nil;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Update cell data we have received a read receipt for
|
||||
NSArray *readEventIds = receiptEvent.readReceiptEventIds;
|
||||
for (NSString* eventId in readEventIds)
|
||||
{
|
||||
RoomBubbleCellData *cellData = [self cellDataOfEventWithEventId:eventId];
|
||||
if (cellData)
|
||||
{
|
||||
@synchronized(bubbles)
|
||||
{
|
||||
if (!cellData.hasNoDisplay)
|
||||
{
|
||||
cellData.readReceipts[eventId] = [self.room getEventReceipts:eventId sorted:YES];
|
||||
}
|
||||
else
|
||||
{
|
||||
// Ignore the read receipts on the events without an actual display.
|
||||
cellData.readReceipts[eventId] = nil;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
// TODO: Be smarter and update only updated cells
|
||||
[super didReceiveReceiptEvent:receiptEvent roomState:roomState];
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
|
||||
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
|
||||
|
||||
Reference in New Issue
Block a user