|
1 | 1 | import '../api/model/events.dart';
|
2 | 2 | import '../api/model/model.dart';
|
| 3 | +import '../log.dart'; |
3 | 4 | import 'message_list.dart';
|
4 | 5 |
|
5 | 6 | /// The portion of [PerAccountStore] for messages and message lists.
|
@@ -96,8 +97,7 @@ class MessageStoreImpl with MessageStore {
|
96 | 97 | assert(event.messageIds.contains(event.messageId), "See https://github.com/zulip/zulip-flutter/pull/753#discussion_r1649463633");
|
97 | 98 | _handleUpdateMessageEventTimestamp(event);
|
98 | 99 | _handleUpdateMessageEventContent(event);
|
99 |
| - // TODO(#150): Handle message moves. The views' recipient headers |
100 |
| - // may need updating, and consequently showSender too. |
| 100 | + _handleUpdateMessageEventMove(event); |
101 | 101 | for (final view in _messageListViews) {
|
102 | 102 | view.notifyListenersIfAnyMessagePresent(event.messageIds);
|
103 | 103 | }
|
@@ -139,6 +139,41 @@ class MessageStoreImpl with MessageStore {
|
139 | 139 | }
|
140 | 140 | }
|
141 | 141 |
|
| 142 | + void _handleUpdateMessageEventMove(UpdateMessageEvent event) { |
| 143 | + // The interaction between the fields of these events are a bit tricky. |
| 144 | + // For reference, see: https://zulip.com/api/get-events#update_message |
| 145 | + |
| 146 | + if (event.origTopic == null) { |
| 147 | + // There was no move. |
| 148 | + assert(() { |
| 149 | + if (event.newStreamId != null && event.origStreamId != null |
| 150 | + && event.newStreamId != event.origStreamId) { |
| 151 | + // This should be impossible; `orig_subject` (aka origTopic) is |
| 152 | + // documented to be present when either the stream or topic changed. |
| 153 | + debugLog('Malformed UpdateMessageEvent: stream move but no origTopic'); // TODO(log) |
| 154 | + } |
| 155 | + return true; |
| 156 | + }()); |
| 157 | + return; |
| 158 | + } |
| 159 | + |
| 160 | + if (event.newTopic == null) { |
| 161 | + // The `subject` field (aka newTopic) is documented to be present on moves. |
| 162 | + assert(debugLog('Malformed UpdateMessageEvent: move but no newTopic')); // TODO(log) |
| 163 | + return; |
| 164 | + } |
| 165 | + if (event.origStreamId == null) { |
| 166 | + // The `stream_id` field (aka origStreamId) is documented to be present on moves. |
| 167 | + assert(debugLog('Malformed UpdateMessageEvent: move but no origStreamId')); // TODO(log) |
| 168 | + return; |
| 169 | + } |
| 170 | + |
| 171 | + // final newStreamId = event.newStreamId; // null if topic-only move |
| 172 | + // final newTopic = event.newTopic!; |
| 173 | + // TODO(#150): Handle message moves. The views' recipient headers |
| 174 | + // may need updating, and consequently showSender too. |
| 175 | + } |
| 176 | + |
142 | 177 | void handleDeleteMessageEvent(DeleteMessageEvent event) {
|
143 | 178 | // TODO handle DeleteMessageEvent, particularly in MessageListView
|
144 | 179 | }
|
|
0 commit comments