Skip to content

Commit 47cc913

Browse files
committed
api: Add Submessage.
We are not storing the list of `Submessage`s directly on the Message objects as they are pretty obscure until we further parse them into meaningful data structures for things like polls and todos. Signed-off-by: Zixuan James Li <[email protected]>
1 parent 0d7a464 commit 47cc913

File tree

6 files changed

+110
-1
lines changed

6 files changed

+110
-1
lines changed

lib/api/model/model.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,6 @@ sealed class Message {
481481
final String senderRealmStr;
482482
@JsonKey(name: 'subject')
483483
String topic;
484-
// final List<string> submessages; // TODO handle
485484
final int timestamp;
486485
String get type;
487486

lib/api/model/submessage.dart

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import 'package:json_annotation/json_annotation.dart';
2+
3+
part 'submessage.g.dart';
4+
5+
/// Data used for certain experimental Zulip widgets including polls and todo
6+
/// lists.
7+
///
8+
/// See:
9+
/// https://zulip.com/api/get-messages#response
10+
/// https://zulip.readthedocs.io/en/latest/subsystems/widgets.html
11+
@JsonSerializable(fieldRename: FieldRename.snake)
12+
class Submessage {
13+
const Submessage({
14+
required this.msgType,
15+
required this.content,
16+
required this.senderId,
17+
});
18+
19+
@JsonKey(unknownEnumValue: SubmessageType.unknown)
20+
final SubmessageType msgType;
21+
final String content;
22+
// final int messageId; // ignored; redundant with [Message.id]
23+
final int senderId;
24+
// final int id; // ignored because it is unused
25+
26+
factory Submessage.fromJson(Map<String, Object?> json) =>
27+
_$SubmessageFromJson(json);
28+
29+
Map<String, Object?> toJson() => _$SubmessageToJson(this);
30+
}
31+
32+
/// As in [Submessage.msgType].
33+
enum SubmessageType {
34+
widget,
35+
unknown,
36+
}

lib/api/model/submessage.g.dart

Lines changed: 28 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/api/model/submessage_checks.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
2+
import 'package:checks/checks.dart';
3+
import 'package:zulip/api/model/submessage.dart';
4+
5+
extension SubmessageChecks on Subject<Submessage> {
6+
Subject<SubmessageType> get msgType => has((e) => e.msgType, 'msgType');
7+
Subject<Object?> get content => has((e) => e.content, 'content');
8+
Subject<int> get senderId => has((e) => e.senderId, 'senderId');
9+
}

test/api/model/submessage_test.dart

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import 'package:checks/checks.dart';
2+
import 'package:test/scaffolding.dart';
3+
import 'package:zulip/api/model/submessage.dart';
4+
5+
import '../../example_data.dart' as eg;
6+
import 'submessage_checks.dart';
7+
8+
void main() {
9+
group('Message.submessages', () {
10+
test('no crash on unrecognized submessage type', () {
11+
final submessageJson = {
12+
'content': '[]',
13+
'message_id': 123,
14+
'sender_id': eg.selfUser.userId,
15+
'id': 1,
16+
};
17+
18+
check(Submessage.fromJson({
19+
...submessageJson,
20+
'msg_type': 'widget',
21+
})).msgType.equals(SubmessageType.widget);
22+
23+
check(Submessage.fromJson({
24+
...submessageJson,
25+
'msg_type': 'unknown_widget',
26+
})).msgType.equals(SubmessageType.unknown);
27+
});
28+
});
29+
}

test/example_data.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -614,6 +614,14 @@ ReactionEvent reactionEvent(Reaction reaction, ReactionOp op, int messageId) {
614614
);
615615
}
616616

617+
final pollWidgetDataFavoriteLetter = {
618+
'widget_type': 'poll',
619+
'extra_data': {
620+
'question': 'favorite letter',
621+
'options': ['A', 'B', 'C'],
622+
}
623+
};
624+
617625
////////////////////////////////////////////////////////////////
618626
// The entire per-account or global state.
619627
//

0 commit comments

Comments
 (0)