@@ -33,6 +33,12 @@ sealed class Event {
33
33
case 'message' : return MessageEvent .fromJson (json);
34
34
case 'update_message' : return UpdateMessageEvent .fromJson (json);
35
35
case 'delete_message' : return DeleteMessageEvent .fromJson (json);
36
+ case 'reaction' :
37
+ switch (json['op' ] as String ) {
38
+ case 'add' : return ReactionAddEvent .fromJson (json);
39
+ case 'remove' : return ReactionRemoveEvent .fromJson (json);
40
+ default : return UnexpectedEvent .fromJson (json);
41
+ }
36
42
case 'heartbeat' : return HeartbeatEvent .fromJson (json);
37
43
// TODO add many more event types
38
44
default : return UnexpectedEvent .fromJson (json);
@@ -370,6 +376,75 @@ enum MessageType {
370
376
private;
371
377
}
372
378
379
+ /// A Zulip event of type `reaction` .
380
+ abstract class ReactionEvent extends Event {
381
+ @override
382
+ @JsonKey (includeToJson: true )
383
+ String get type => 'reaction' ;
384
+
385
+ String get op;
386
+
387
+ ReactionEvent ({required super .id});
388
+ }
389
+
390
+ /// A [ReactionEvent] with op `add` : https://zulip.com/api/get-events#reaction-add
391
+ @JsonSerializable (fieldRename: FieldRename .snake)
392
+ class ReactionAddEvent extends ReactionEvent {
393
+ @override
394
+ String get op => 'add' ;
395
+
396
+ final String emojiName;
397
+ final String emojiCode;
398
+ final ReactionType reactionType;
399
+ final int userId;
400
+ // final Map<String, dynamic> user; // deprecated; ignore
401
+ final int messageId;
402
+
403
+ ReactionAddEvent ({
404
+ required super .id,
405
+ required this .emojiName,
406
+ required this .emojiCode,
407
+ required this .reactionType,
408
+ required this .userId,
409
+ required this .messageId,
410
+ });
411
+
412
+ factory ReactionAddEvent .fromJson (Map <String , dynamic > json) =>
413
+ _$ReactionAddEventFromJson (json);
414
+
415
+ @override
416
+ Map <String , dynamic > toJson () => _$ReactionAddEventToJson (this );
417
+ }
418
+
419
+ /// A [ReactionEvent] with op `remove` : https://zulip.com/api/get-events#reaction-remove
420
+ @JsonSerializable (fieldRename: FieldRename .snake)
421
+ class ReactionRemoveEvent extends ReactionEvent {
422
+ @override
423
+ String get op => 'remove' ;
424
+
425
+ final String emojiName;
426
+ final String emojiCode;
427
+ final ReactionType reactionType;
428
+ final int userId;
429
+ // final Map<String, dynamic> user; // deprecated; ignore
430
+ final int messageId;
431
+
432
+ ReactionRemoveEvent ({
433
+ required super .id,
434
+ required this .emojiName,
435
+ required this .emojiCode,
436
+ required this .reactionType,
437
+ required this .userId,
438
+ required this .messageId,
439
+ });
440
+
441
+ factory ReactionRemoveEvent .fromJson (Map <String , dynamic > json) =>
442
+ _$ReactionRemoveEventFromJson (json);
443
+
444
+ @override
445
+ Map <String , dynamic > toJson () => _$ReactionRemoveEventToJson (this );
446
+ }
447
+
373
448
/// A Zulip event of type `heartbeat` : https://zulip.com/api/get-events#heartbeat
374
449
@JsonSerializable (fieldRename: FieldRename .snake)
375
450
class HeartbeatEvent extends Event {
0 commit comments