diff --git a/lib/src/event.dart b/lib/src/event.dart index e0e3d5d..f3729cf 100644 --- a/lib/src/event.dart +++ b/lib/src/event.dart @@ -146,7 +146,9 @@ class Event extends MatrixEvent { final unsigned = Event.getMapFromPayload(jsonPayload['unsigned']); final prevContent = Event.getMapFromPayload(jsonPayload['prev_content']); return Event( - status: jsonPayload['status'] ?? defaultStatus, + status: jsonPayload['status'] ?? + unsigned[MessageSendingStatusKey] ?? + defaultStatus, stateKey: jsonPayload['state_key'], prevContent: prevContent, content: content, diff --git a/lib/src/room.dart b/lib/src/room.dart index be97100..234ad39 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -39,6 +39,8 @@ enum PushRuleState { notify, mentions_only, dont_notify } enum JoinRules { public, knock, invite, private } enum GuestAccess { can_join, forbidden } enum HistoryVisibility { invited, joined, shared, world_readable } +const String MessageSendingStatusKey = + 'com.famedly.famedlysdk.message_sending_status'; /// Represents a Matrix room. class Room { @@ -678,27 +680,20 @@ class Room { } } - final sortOrder = newSortOrder; - // Display a *sending* event and store it. - var eventUpdate = EventUpdate( - type: 'timeline', - roomID: id, - eventType: type, - sortOrder: sortOrder, - content: { - 'type': type, - 'event_id': messageID, - 'sender': client.userID, - 'status': 0, - 'origin_server_ts': DateTime.now().millisecondsSinceEpoch, - 'content': content - }, - ); - client.onEvent.add(eventUpdate); - await client.database?.transaction(() async { - await client.database.storeEventUpdate(client.id, eventUpdate); - await updateSortOrder(); - }); + final syncUpdate = SyncUpdate() + ..rooms = (RoomsUpdate() + ..join = ({}..[id] = (JoinedRoomUpdate() + ..timeline = (TimelineUpdate() + ..events = [ + MatrixEvent() + ..content = content + ..type = type + ..eventId = messageID + ..senderId = client.userID + ..originServerTs = DateTime.now() + ..unsigned = {MessageSendingStatusKey: 0}, + ])))); + await client.handleSync(syncUpdate); // Send the text and on success, store and display a *sent* event. try { @@ -712,23 +707,18 @@ class Room { messageID, sendMessageContent, ); - eventUpdate.content['status'] = 1; - eventUpdate.content['unsigned'] = {'transaction_id': messageID}; - eventUpdate.content['event_id'] = res; - client.onEvent.add(eventUpdate); - await client.database?.transaction(() async { - await client.database.storeEventUpdate(client.id, eventUpdate); - }); + syncUpdate.rooms.join.values.first.timeline.events.first + .unsigned[MessageSendingStatusKey] = 1; + syncUpdate.rooms.join.values.first.timeline.events.first + .unsigned['transaction_id'] = messageID; + syncUpdate.rooms.join.values.first.timeline.events.first.eventId = res; + await client.handleSync(syncUpdate); return res; } catch (exception) { print('[Client] Error while sending: ' + exception.toString()); - // On error, set status to -1 - eventUpdate.content['status'] = -1; - eventUpdate.content['unsigned'] = {'transaction_id': messageID}; - client.onEvent.add(eventUpdate); - await client.database?.transaction(() async { - await client.database.storeEventUpdate(client.id, eventUpdate); - }); + syncUpdate.rooms.join.values.first.timeline.events.first + .unsigned[MessageSendingStatusKey] = -1; + await client.handleSync(syncUpdate); } return null; } diff --git a/test/timeline_test.dart b/test/timeline_test.dart index 385a67d..f76eb6c 100644 --- a/test/timeline_test.dart +++ b/test/timeline_test.dart @@ -186,8 +186,12 @@ void main() { }, sortOrder: room.newSortOrder)); await Future.delayed(Duration(milliseconds: 50)); + + expect(updateCount, 7); await room.sendTextEvent('test', txid: 'errortxid'); await Future.delayed(Duration(milliseconds: 50)); + + expect(updateCount, 9); await room.sendTextEvent('test', txid: 'errortxid2'); await Future.delayed(Duration(milliseconds: 50)); await room.sendTextEvent('test', txid: 'errortxid3');