Skip to content

Commit 8388936

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 144d5af commit 8388936

File tree

6 files changed

+322
-0
lines changed

6 files changed

+322
-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);
@@ -876,6 +878,41 @@ 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+
// We cannot parse the String into one of the [SubmessageData] classes because
892+
// information from other submessages are required. Specifically, we need
893+
// the parsed [WidgetData] from the first [Message.submessages] of the
894+
// corresponding message.
895+
final String content;
896+
final int messageId;
897+
final int senderId;
898+
final int submessageId;
899+
900+
SubmessageEvent({
901+
required super.id,
902+
required this.msgType,
903+
required this.content,
904+
required this.messageId,
905+
required this.senderId,
906+
required this.submessageId,
907+
});
908+
909+
factory SubmessageEvent.fromJson(Map<String, dynamic> json) =>
910+
_$SubmessageEventFromJson(json);
911+
912+
@override
913+
Map<String, dynamic> toJson() => _$SubmessageEventToJson(this);
914+
}
915+
879916
/// A Zulip event of type `typing`:
880917
/// https://zulip.com/api/get-events#typing-start
881918
/// 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

@@ -302,4 +305,24 @@ class MessageStoreImpl with MessageStore {
302305
view.notifyListenersIfMessagePresent(event.messageId);
303306
}
304307
}
308+
309+
void handleSubmessageEvent(SubmessageEvent event) {
310+
final poll = messages[event.messageId]?.poll;
311+
if (poll == null) return;
312+
PollEventSubmessage? pollEventSubmessage;
313+
try {
314+
pollEventSubmessage = PollEventSubmessage.fromJson(jsonDecode(event.content) as Map<String, Object?>);
315+
} on TypeError catch (e) {
316+
assert(debugLog('Malformed submessage event data for poll: $e\n${jsonEncode(event)}')); // TODO(log)
317+
return;
318+
}
319+
poll.applyEvent(
320+
event.senderId,
321+
pollEventSubmessage,
322+
);
323+
324+
for (final view in _messageListViews) {
325+
view.notifyListenersIfMessagePresent(event.messageId);
326+
}
327+
}
305328
}

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
@@ -675,6 +675,21 @@ ReactionEvent reactionEvent(Reaction reaction, ReactionOp op, int messageId) {
675675
);
676676
}
677677

678+
SubmessageEvent submessageEvent(
679+
int messageId,
680+
int senderId,
681+
{required String content}
682+
) {
683+
return SubmessageEvent(
684+
id: 1,
685+
msgType: SubmessageType.widget,
686+
content: content,
687+
messageId: messageId,
688+
senderId: senderId,
689+
submessageId: 1,
690+
);
691+
}
692+
678693
////////////////////////////////////////////////////////////////
679694
// The entire per-account or global state.
680695
//

0 commit comments

Comments
 (0)