|
| 1 | +import 'package:collection/collection.dart'; |
1 | 2 | import 'package:flutter/foundation.dart';
|
2 | 3 |
|
| 4 | +import '../api/model/events.dart'; |
3 | 5 | import '../api/model/model.dart';
|
4 | 6 | import '../api/route/messages.dart';
|
5 | 7 | import 'content.dart';
|
@@ -86,6 +88,68 @@ class MessageListView extends ChangeNotifier {
|
86 | 88 | notifyListeners();
|
87 | 89 | }
|
88 | 90 |
|
| 91 | + applyChangesToMessage(UpdateMessageEvent event, Message message) { |
| 92 | + if (event.renderingOnly != null && event.renderingOnly == true) { |
| 93 | + //TODO update inline preview |
| 94 | + return; |
| 95 | + } |
| 96 | + |
| 97 | + if (!event.flags.equals(message.flags)) { |
| 98 | + //TODO Possibly a new @alert on this message. Update alerts. |
| 99 | + message.flags = event.flags; |
| 100 | + } |
| 101 | + |
| 102 | + if (event.renderedContent != null) { |
| 103 | + |
| 104 | + message.content = event.renderedContent as String; |
| 105 | + } |
| 106 | + |
| 107 | + if (event.editTimestamp != null) { |
| 108 | + message.lastEditTimestamp = event.editTimestamp; |
| 109 | + } |
| 110 | + |
| 111 | + if (event.isMeMessage != null) { |
| 112 | + message.isMeMessage = event.isMeMessage as bool; |
| 113 | + } |
| 114 | + |
| 115 | + } |
| 116 | + |
| 117 | + ///This is almost directly copied from package:collection/algorithms.dart. |
| 118 | + ///The way that package was set up doesn't allow us to search |
| 119 | + ///for a message ID among a bunch of message objects - this is a quick |
| 120 | + ///modification of that method to work here for us. |
| 121 | + int findMessageWithId(int messageId) { |
| 122 | + var min = 0; |
| 123 | + var max = messages.length; |
| 124 | + |
| 125 | + while (min < max) { |
| 126 | + var mid = min + ((max - min) >> 1); |
| 127 | + Message message = messages[mid]; |
| 128 | + var comp = message.id.compareTo(messageId); |
| 129 | + if (comp == 0) return mid; |
| 130 | + if (comp < 0) { |
| 131 | + min = mid + 1; |
| 132 | + } else { |
| 133 | + max = mid; |
| 134 | + } |
| 135 | + } |
| 136 | + return -1; |
| 137 | + } |
| 138 | + |
| 139 | + void maybeUpdateMessage(UpdateMessageEvent event) { |
| 140 | + int idx = findMessageWithId(event.messageId); |
| 141 | + |
| 142 | + if (idx == -1) { |
| 143 | + return; |
| 144 | + } |
| 145 | + |
| 146 | + Message message = messages[idx]; |
| 147 | + applyChangesToMessage(event, message); |
| 148 | + |
| 149 | + contents[idx] = parseContent(message.content); |
| 150 | + notifyListeners(); |
| 151 | + } |
| 152 | + |
89 | 153 | /// Called when the app is reassembled during debugging, e.g. for hot reload.
|
90 | 154 | ///
|
91 | 155 | /// This will redo from scratch any computations we can, such as parsing
|
|
0 commit comments