Skip to content

Commit b8516c5

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

File tree

6 files changed

+79
-3
lines changed

6 files changed

+79
-3
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: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,13 @@ class Submessage {
2323

2424
@JsonKey(unknownEnumValue: SubmessageType.unknown)
2525
final SubmessageType msgType;
26-
@JsonKey(readValue: _readContent, toJson: _contentToJson)
26+
@JsonKey(readValue: readContent, toJson: _contentToJson)
2727
final Object? content;
2828
final int messageId;
2929
final int senderId;
3030
final int id;
3131

32-
static Object? _readContent(Map<Object?, Object?> json, String key) {
32+
static Object? readContent(Map<Object?, Object?> json, String key) {
3333
try {
3434
return (const JsonDecoder().convert(json[key] as String)) as Object?;
3535
} catch (e) {

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/message.dart

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import '../api/model/events.dart';
22
import '../api/model/model.dart';
3+
import '../api/model/submessage.dart';
34
import '../log.dart';
45
import 'message_list.dart';
56

@@ -267,4 +268,15 @@ class MessageStoreImpl with MessageStore {
267268
view.notifyListenersIfMessagePresent(event.messageId);
268269
}
269270
}
271+
272+
void handleSubmessageEvent(SubmessageEvent event) {
273+
messages[event.messageId]?.poll?.applyEvent(
274+
event.senderId,
275+
PollEvent.fromJson(event.content as Map<String, Object?>)
276+
);
277+
278+
for (final view in _messageListViews) {
279+
view.notifyListenersIfMessagePresent(event.messageId);
280+
}
281+
}
270282
}

lib/model/store.dart

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

513+
case SubmessageEvent():
514+
assert(debugLog("server event: submessage ${event.content}"));
515+
_messages.handleSubmessageEvent(event);
516+
513517
case TypingEvent():
514518
assert(debugLog("server event: typing/${event.op} ${event.messageType}"));
515519
typingStatus.handleTypingEvent(event);

0 commit comments

Comments
 (0)