Skip to content

Commit 80192ae

Browse files
committed
api: Add reaction/add and reaction/remove events (not yet handled)
Ongoing discussion about how to handle these: https://chat.zulip.org/#narrow/stream/243-mobile-team/topic/flutter.3A.20reaction.20events/near/1619282 But for now, at least we can represent the events in the API model, before we handle them. Related: zulip#121
1 parent bdd2317 commit 80192ae

File tree

3 files changed

+130
-0
lines changed

3 files changed

+130
-0
lines changed

lib/api/model/events.dart

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,12 @@ sealed class Event {
3333
case 'message': return MessageEvent.fromJson(json);
3434
case 'update_message': return UpdateMessageEvent.fromJson(json);
3535
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+
}
3642
case 'heartbeat': return HeartbeatEvent.fromJson(json);
3743
// TODO add many more event types
3844
default: return UnexpectedEvent.fromJson(json);
@@ -370,6 +376,75 @@ enum MessageType {
370376
private;
371377
}
372378

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+
373448
/// A Zulip event of type `heartbeat`: https://zulip.com/api/get-events#heartbeat
374449
@JsonSerializable(fieldRename: FieldRename.snake)
375450
class HeartbeatEvent extends Event {

lib/api/model/events.g.dart

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

lib/model/store.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,12 @@ class PerAccountStore extends ChangeNotifier {
278278
} else if (event is DeleteMessageEvent) {
279279
assert(debugLog("server event: delete_message ${event.messageIds}"));
280280
// TODO handle
281+
} else if (event is ReactionAddEvent) {
282+
assert(debugLog("server event: reaction/add"));
283+
// TODO handle
284+
} else if (event is ReactionRemoveEvent) {
285+
assert(debugLog("server event: reaction/remove"));
286+
// TODO handle
281287
} else if (event is UnexpectedEvent) {
282288
assert(debugLog("server event: ${jsonEncode(event.toJson())}")); // TODO log better
283289
} else {

0 commit comments

Comments
 (0)