Skip to content

Commit a57ce95

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 6220d6f commit a57ce95

File tree

6 files changed

+320
-0
lines changed

6 files changed

+320
-0
lines changed

lib/api/model/events.dart

Lines changed: 33 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,37 @@ 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+
final String content;
892+
final int messageId;
893+
final int senderId;
894+
final int submessageId;
895+
896+
SubmessageEvent({
897+
required super.id,
898+
required this.msgType,
899+
required this.content,
900+
required this.messageId,
901+
required this.senderId,
902+
required this.submessageId,
903+
});
904+
905+
factory SubmessageEvent.fromJson(Map<String, dynamic> json) =>
906+
_$SubmessageEventFromJson(json);
907+
908+
@override
909+
Map<String, dynamic> toJson() => _$SubmessageEventToJson(this);
910+
}
911+
879912
/// A Zulip event of type `typing`:
880913
/// https://zulip.com/api/get-events#typing-start
881914
/// 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
@@ -641,6 +641,21 @@ final pollWidgetDataFavoriteLetter = {
641641
}
642642
};
643643

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

0 commit comments

Comments
 (0)