Skip to content

Commit de62dba

Browse files
committed
event: Handle submessage event for polls.
We could potentially avoid notifying listeners in some cases when handling submessage event, but it wouldn't be critically necessary. Signed-off-by: Zixuan James Li <[email protected]>
1 parent 2043822 commit de62dba

File tree

6 files changed

+322
-0
lines changed

6 files changed

+322
-0
lines changed

lib/api/model/events.dart

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'package:json_annotation/json_annotation.dart';
33
import '../../model/algorithms.dart';
44
import 'json.dart';
55
import 'model.dart';
6+
import 'submessage.dart';
67

78
part 'events.g.dart';
89

@@ -63,6 +64,7 @@ sealed class Event {
6364
case 'remove': return UpdateMessageFlagsRemoveEvent.fromJson(json);
6465
default: return UnexpectedEvent.fromJson(json);
6566
}
67+
case 'submessage': return SubmessageEvent.fromJson(json);
6668
case 'typing': return TypingEvent.fromJson(json);
6769
case 'reaction': return ReactionEvent.fromJson(json);
6870
case 'heartbeat': return HeartbeatEvent.fromJson(json);
@@ -876,6 +878,41 @@ class UpdateMessageFlagsMessageDetail {
876878
Map<String, dynamic> toJson() => _$UpdateMessageFlagsMessageDetailToJson(this);
877879
}
878880

881+
/// A Zulip event of type `submessage`: https://zulip.com/api/get-events#submessage
882+
@JsonSerializable(fieldRename: FieldRename.snake)
883+
class SubmessageEvent extends Event {
884+
@override
885+
@JsonKey(includeToJson: true)
886+
String get type => 'submessage';
887+
888+
@JsonKey(unknownEnumValue: SubmessageType.unknown)
889+
final SubmessageType msgType;
890+
/// [SubmessageData] encoded in JSON.
891+
// We cannot parse the String into one of the [SubmessageData] classes because
892+
// information from other submessages are required. Specifically, we need
893+
// the parsed [WidgetData] from the first [Message.submessages] of the
894+
// corresponding message.
895+
final String content;
896+
final int messageId;
897+
final int senderId;
898+
final int submessageId;
899+
900+
SubmessageEvent({
901+
required super.id,
902+
required this.msgType,
903+
required this.content,
904+
required this.messageId,
905+
required this.senderId,
906+
required this.submessageId,
907+
});
908+
909+
factory SubmessageEvent.fromJson(Map<String, dynamic> json) =>
910+
_$SubmessageEventFromJson(json);
911+
912+
@override
913+
Map<String, dynamic> toJson() => _$SubmessageEventToJson(this);
914+
}
915+
879916
/// A Zulip event of type `typing`:
880917
/// https://zulip.com/api/get-events#typing-start
881918
/// https://zulip.com/api/get-events#typing-stop

lib/api/model/events.g.dart

Lines changed: 27 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/model/message.dart

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1+
import 'dart:convert';
2+
13
import '../api/model/events.dart';
24
import '../api/model/model.dart';
5+
import '../api/model/submessage.dart';
36
import '../log.dart';
47
import 'message_list.dart';
58

@@ -296,4 +299,24 @@ class MessageStoreImpl with MessageStore {
296299
view.notifyListenersIfMessagePresent(event.messageId);
297300
}
298301
}
302+
303+
void handleSubmessageEvent(SubmessageEvent event) {
304+
final poll = messages[event.messageId]?.poll;
305+
if (poll == null) return;
306+
PollEventSubmessage? pollEventSubmessage;
307+
try {
308+
pollEventSubmessage = PollEventSubmessage.fromJson(jsonDecode(event.content) as Map<String, Object?>);
309+
} on TypeError catch (e) {
310+
assert(debugLog('Malformed submessage event data for poll: $e\n${jsonEncode(event)}')); // TODO(log)
311+
return;
312+
}
313+
poll.applyEvent(
314+
event.senderId,
315+
pollEventSubmessage,
316+
);
317+
318+
for (final view in _messageListViews) {
319+
view.notifyListenersIfMessagePresent(event.messageId);
320+
}
321+
}
299322
}

lib/model/store.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,10 @@ class PerAccountStore extends ChangeNotifier with ChannelStore, MessageStore {
535535
_messages.handleUpdateMessageFlagsEvent(event);
536536
unreads.handleUpdateMessageFlagsEvent(event);
537537

538+
case SubmessageEvent():
539+
assert(debugLog("server event: submessage ${event.content}"));
540+
_messages.handleSubmessageEvent(event);
541+
538542
case TypingEvent():
539543
assert(debugLog("server event: typing/${event.op} ${event.messageType}"));
540544
typingStatus.handleTypingEvent(event);

test/example_data.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -639,6 +639,21 @@ final pollWidgetDataFavoriteLetter = {
639639
}
640640
};
641641

642+
SubmessageEvent submessageEvent(
643+
int messageId,
644+
int senderId,
645+
{required String content}
646+
) {
647+
return SubmessageEvent(
648+
id: 1,
649+
msgType: SubmessageType.widget,
650+
content: content,
651+
messageId: messageId,
652+
senderId: senderId,
653+
submessageId: 1,
654+
);
655+
}
656+
642657
////////////////////////////////////////////////////////////////
643658
// The entire per-account or global state.
644659
//

0 commit comments

Comments
 (0)