Skip to content

Commit c794815

Browse files
committed
event: Handle submessage event for polls.
Signed-off-by: Zixuan James Li <[email protected]>
1 parent 3d631a1 commit c794815

File tree

6 files changed

+81
-9
lines changed

6 files changed

+81
-9
lines changed

lib/api/model/events.dart

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

33
import 'json.dart';
44
import 'model.dart';
5+
import 'submessage.dart';
56

67
part 'events.g.dart';
78

@@ -62,6 +63,7 @@ sealed class Event {
6263
case 'remove': return UpdateMessageFlagsRemoveEvent.fromJson(json);
6364
default: return UnexpectedEvent.fromJson(json);
6465
}
66+
case 'submessage': return SubmessageEvent.fromJson(json);
6567
case 'typing': return TypingEvent.fromJson(json);
6668
case 'reaction': return ReactionEvent.fromJson(json);
6769
case 'heartbeat': return HeartbeatEvent.fromJson(json);
@@ -873,6 +875,37 @@ class UpdateMessageFlagsMessageDetail {
873875
Map<String, dynamic> toJson() => _$UpdateMessageFlagsMessageDetailToJson(this);
874876
}
875877

878+
/// A Zulip event of type `submessage`: https://zulip.com/api/get-events#submessage
879+
@JsonSerializable(fieldRename: FieldRename.snake)
880+
class SubmessageEvent extends Event {
881+
@override
882+
@JsonKey(includeToJson: true)
883+
String get type => 'submessage';
884+
885+
@JsonKey(unknownEnumValue: SubmessageType.unknown)
886+
final SubmessageType msgType;
887+
@JsonKey(readValue: Submessage.readContent)
888+
final Object? content;
889+
final int messageId;
890+
final int senderId;
891+
final int submessageId;
892+
893+
SubmessageEvent({
894+
required super.id,
895+
required this.msgType,
896+
required this.content,
897+
required this.messageId,
898+
required this.senderId,
899+
required this.submessageId,
900+
});
901+
902+
factory SubmessageEvent.fromJson(Map<String, dynamic> json) =>
903+
_$SubmessageEventFromJson(json);
904+
905+
@override
906+
Map<String, dynamic> toJson() => _$SubmessageEventToJson(this);
907+
}
908+
876909
/// A Zulip event of type `typing`:
877910
/// https://zulip.com/api/get-events#typing-start
878911
/// 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: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,14 @@ class Submessage {
1717

1818
@JsonKey(unknownEnumValue: SubmessageType.unknown)
1919
final SubmessageType msgType;
20-
@JsonKey(readValue: _readContent, toJson: _contentToJson)
20+
/// JSON-encoded [SubmessageData].
21+
@JsonKey(readValue: readContent, toJson: _contentToJson)
2122
final Object? content;
2223
final int messageId;
2324
final int senderId;
2425
final int id;
2526

26-
static Object? _readContent(Map<Object?, Object?> json, String key) {
27+
static Object? readContent(Map<Object?, Object?> json, String key) {
2728
try {
2829
return (const JsonDecoder().convert(json[key] as String)) as Object?;
2930
}
@@ -59,7 +60,7 @@ sealed class WidgetData extends SubmessageData {
5960
static Object? readFromMessage(Map<Object?, Object?> json, String key) {
6061
final submessages = json['submessages'] as List<Object?>;
6162
if (submessages.isEmpty) return null;
62-
return Submessage._readContent(submessages[0] as Map<String, Object?>, 'content');
63+
return Submessage.readContent(submessages[0] as Map<String, Object?>, 'content');
6364
}
6465

6566
factory WidgetData.fromJson(Object? json) {

lib/api/model/submessage.g.dart

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/model/polls.dart

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class Poll {
3636

3737
for (final submessage in widgetEventSubmessages) {
3838
final event = PollEvent.fromJson(submessage.content as Map<String, Object?>);
39-
poll._handlePollEvent(submessage.senderId, event);
39+
poll.handlePollEvent(submessage.senderId, event);
4040
}
4141
return poll;
4242
}
@@ -48,7 +48,7 @@ class Poll {
4848
latestOptionIndexByUser[senderId] = index + 1;
4949
}
5050

51-
void _handlePollEvent(int senderId, PollEvent event) {
51+
void handlePollEvent(int senderId, PollEvent event) {
5252
switch (event) {
5353
case PollOptionEvent():
5454
latestOptionIndexByUser[senderId] = event.latestOptionIndex;
@@ -104,7 +104,14 @@ class Polls extends ChangeNotifier {
104104
handleMessages([event.message]);
105105
}
106106

107-
// void handleSubmessageEvent(SubmessageEvent event) {
108-
109-
// }
107+
void handleSubmessageEvent(SubmessageEvent event) {
108+
final poll = pollsByMessageId[event.messageId];
109+
if (poll == null) {
110+
return;
111+
}
112+
poll.handlePollEvent(
113+
event.senderId,
114+
PollEvent.fromJson(event.content as Map<String, Object?>));
115+
notifyListeners();
116+
}
110117
}

lib/model/store.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,10 @@ class PerAccountStore extends ChangeNotifier with StreamStore, MessageStore {
518518
_messages.handleUpdateMessageFlagsEvent(event);
519519
unreads.handleUpdateMessageFlagsEvent(event);
520520

521+
case SubmessageEvent():
522+
assert(debugLog("server event: submessage ${event.content}"));
523+
polls.handleSubmessageEvent(event);
524+
521525
case TypingEvent():
522526
assert(debugLog("server event: typing/${event.op} ${event.messageType}"));
523527
typingStatus.handleTypingEvent(event);

0 commit comments

Comments
 (0)