Skip to content

Commit fd10d4f

Browse files
PIG208gnprice
authored andcommitted
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 5af5c76 commit fd10d4f

File tree

7 files changed

+339
-0
lines changed

7 files changed

+339
-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);
@@ -942,6 +944,41 @@ class UpdateMessageFlagsMessageDetail {
942944
Map<String, dynamic> toJson() => _$UpdateMessageFlagsMessageDetailToJson(this);
943945
}
944946

947+
/// A Zulip event of type `submessage`: https://zulip.com/api/get-events#submessage
948+
@JsonSerializable(fieldRename: FieldRename.snake)
949+
class SubmessageEvent extends Event {
950+
@override
951+
@JsonKey(includeToJson: true)
952+
String get type => 'submessage';
953+
954+
@JsonKey(unknownEnumValue: SubmessageType.unknown)
955+
final SubmessageType msgType;
956+
/// [SubmessageData] encoded in JSON.
957+
// We cannot parse the String into one of the [SubmessageData] classes because
958+
// information from other submessages are required. Specifically, we need
959+
// the parsed [WidgetData] from the first [Message.submessages] of the
960+
// corresponding message.
961+
final String content;
962+
final int messageId;
963+
final int senderId;
964+
final int submessageId;
965+
966+
SubmessageEvent({
967+
required super.id,
968+
required this.msgType,
969+
required this.content,
970+
required this.messageId,
971+
required this.senderId,
972+
required this.submessageId,
973+
});
974+
975+
factory SubmessageEvent.fromJson(Map<String, dynamic> json) =>
976+
_$SubmessageEventFromJson(json);
977+
978+
@override
979+
Map<String, dynamic> toJson() => _$SubmessageEventToJson(this);
980+
}
981+
945982
/// A Zulip event of type `typing`:
946983
/// https://zulip.com/api/get-events#typing-start
947984
/// 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/api/model/submessage.dart

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'dart:convert';
33
import 'package:json_annotation/json_annotation.dart';
44

55
import '../../log.dart';
6+
import 'events.dart';
67

78
part 'submessage.g.dart';
89

@@ -402,6 +403,17 @@ class Poll {
402403
final Set<String> _existingOptionTexts = {};
403404
final Map<PollOptionKey, PollOption> _options = {};
404405

406+
void handleSubmessageEvent(SubmessageEvent event) {
407+
final PollEventSubmessage? pollEventSubmessage;
408+
try {
409+
pollEventSubmessage = PollEventSubmessage.fromJson(jsonDecode(event.content) as Map<String, Object?>);
410+
} catch (e) {
411+
assert(debugLog('Malformed submessage event data for poll: $e\n${jsonEncode(event)}')); // TODO(log)
412+
return;
413+
}
414+
_applyEvent(event.senderId, pollEventSubmessage);
415+
}
416+
405417
void _applyEvent(int senderId, PollEventSubmessage event) {
406418
switch (event) {
407419
case PollNewOptionEventSubmessage():

lib/model/message.dart

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import 'dart:convert';
2+
13
import '../api/model/events.dart';
24
import '../api/model/model.dart';
35
import '../log.dart';
@@ -310,4 +312,21 @@ class MessageStoreImpl with MessageStore {
310312
view.notifyListenersIfMessagePresent(event.messageId);
311313
}
312314
}
315+
316+
void handleSubmessageEvent(SubmessageEvent event) {
317+
final message = messages[event.messageId];
318+
if (message == null) return;
319+
320+
final poll = message.poll;
321+
if (poll == null) {
322+
assert(debugLog('Missing poll for submessage event:\n${jsonEncode(event)}')); // TODO(log)
323+
return;
324+
}
325+
326+
poll.handleSubmessageEvent(event);
327+
328+
for (final view in _messageListViews) {
329+
view.notifyListenersIfMessagePresent(event.messageId);
330+
}
331+
}
313332
}

lib/model/store.dart

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

540+
case SubmessageEvent():
541+
assert(debugLog("server event: submessage ${event.content}"));
542+
_messages.handleSubmessageEvent(event);
543+
540544
case TypingEvent():
541545
assert(debugLog("server event: typing/${event.op} ${event.messageType}"));
542546
typingStatus.handleTypingEvent(event);

test/example_data.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -647,6 +647,21 @@ UpdateMessageFlagsRemoveEvent updateMessageFlagsRemoveEvent(
647647
})));
648648
}
649649

650+
SubmessageEvent submessageEvent(
651+
int messageId,
652+
int senderId, {
653+
required SubmessageData? content,
654+
}) {
655+
return SubmessageEvent(
656+
id: 0,
657+
msgType: SubmessageType.widget,
658+
content: jsonEncode(content),
659+
messageId: messageId,
660+
senderId: senderId,
661+
submessageId: 100,
662+
);
663+
}
664+
650665
TypingEvent typingEvent(SendableNarrow narrow, TypingOp op, int senderId) {
651666
switch (narrow) {
652667
case TopicNarrow():

0 commit comments

Comments
 (0)