Skip to content

Commit 48f73c3

Browse files
committed
event: Handle submessage event for polls.
Signed-off-by: Zixuan James Li <[email protected]>
1 parent 923af1f commit 48f73c3

File tree

9 files changed

+245
-120
lines changed

9 files changed

+245
-120
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/model.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -482,7 +482,10 @@ sealed class Message {
482482
final String senderRealmStr;
483483
@JsonKey(name: 'subject')
484484
final String topic;
485-
final List<Submessage> submessages;
485+
// Only null when processed by store.
486+
// See [Polls].
487+
@JsonKey(disallowNullValue: true, required: true)
488+
List<Submessage>? submessages;
486489
@JsonKey(readValue: WidgetData.readFromMessage)
487490
WidgetData? widgetData;
488491
final int timestamp;

lib/api/model/model.g.dart

Lines changed: 142 additions & 110 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) {

0 commit comments

Comments
 (0)