Skip to content

Commit 828324b

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: #121
1 parent 2295598 commit 828324b

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);
@@ -363,6 +369,75 @@ enum MessageType {
363369
private;
364370
}
365371

372+
/// A Zulip event of type `reaction`.
373+
abstract class ReactionEvent extends Event {
374+
@override
375+
@JsonKey(includeToJson: true)
376+
String get type => 'reaction';
377+
378+
String get op;
379+
380+
ReactionEvent({required super.id});
381+
}
382+
383+
/// A [ReactionEvent] with op `add`: https://zulip.com/api/get-events#reaction-add
384+
@JsonSerializable(fieldRename: FieldRename.snake)
385+
class ReactionAddEvent extends ReactionEvent {
386+
@override
387+
String get op => 'add';
388+
389+
final String emojiName;
390+
final String emojiCode;
391+
final ReactionType reactionType;
392+
final int userId;
393+
// final Map<String, dynamic> user; // deprecated; ignore
394+
final int messageId;
395+
396+
ReactionAddEvent({
397+
required super.id,
398+
required this.emojiName,
399+
required this.emojiCode,
400+
required this.reactionType,
401+
required this.userId,
402+
required this.messageId,
403+
});
404+
405+
factory ReactionAddEvent.fromJson(Map<String, dynamic> json) =>
406+
_$ReactionAddEventFromJson(json);
407+
408+
@override
409+
Map<String, dynamic> toJson() => _$ReactionAddEventToJson(this);
410+
}
411+
412+
/// A [ReactionEvent] with op `remove`: https://zulip.com/api/get-events#reaction-remove
413+
@JsonSerializable(fieldRename: FieldRename.snake)
414+
class ReactionRemoveEvent extends ReactionEvent {
415+
@override
416+
String get op => 'remove';
417+
418+
final String emojiName;
419+
final String emojiCode;
420+
final ReactionType reactionType;
421+
final int userId;
422+
// final Map<String, dynamic> user; // deprecated; ignore
423+
final int messageId;
424+
425+
ReactionRemoveEvent({
426+
required super.id,
427+
required this.emojiName,
428+
required this.emojiCode,
429+
required this.reactionType,
430+
required this.userId,
431+
required this.messageId,
432+
});
433+
434+
factory ReactionRemoveEvent.fromJson(Map<String, dynamic> json) =>
435+
_$ReactionRemoveEventFromJson(json);
436+
437+
@override
438+
Map<String, dynamic> toJson() => _$ReactionRemoveEventToJson(this);
439+
}
440+
366441
@JsonSerializable(fieldRename: FieldRename.snake)
367442
class HeartbeatEvent extends Event {
368443
@override

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
@@ -276,6 +276,12 @@ class PerAccountStore extends ChangeNotifier {
276276
} else if (event is DeleteMessageEvent) {
277277
assert(debugLog("server event: delete_message ${event.messageIds}"));
278278
// TODO handle
279+
} else if (event is ReactionAddEvent) {
280+
assert(debugLog("server event: reaction/add"));
281+
// TODO handle
282+
} else if (event is ReactionRemoveEvent) {
283+
assert(debugLog("server event: reaction/remove"));
284+
// TODO handle
279285
} else if (event is UnexpectedEvent) {
280286
assert(debugLog("server event: ${jsonEncode(event.toJson())}")); // TODO log better
281287
} else {

0 commit comments

Comments
 (0)