From bc5caf24f2eb150dfb3b92af3d30b8faa12ee23c Mon Sep 17 00:00:00 2001 From: "neiljp (Neil Pilgrim)" Date: Sat, 11 Mar 2023 15:29:23 -0800 Subject: [PATCH 01/15] api: Add personal user_id and process from InitialSnapshot into store. This can't be updated, so there's no need to add a matching event. --- lib/api/model/initial_snapshot.dart | 3 +++ lib/api/model/initial_snapshot.g.dart | 2 ++ lib/model/store.dart | 5 +++++ 3 files changed, 10 insertions(+) diff --git a/lib/api/model/initial_snapshot.dart b/lib/api/model/initial_snapshot.dart index 312c637824..34048e48d3 100644 --- a/lib/api/model/initial_snapshot.dart +++ b/lib/api/model/initial_snapshot.dart @@ -15,6 +15,8 @@ class InitialSnapshot { final String zulip_version; final String? zulip_merge_base; // TODO(server-5) + final int user_id; + final List alert_words; final List custom_profile_fields; @@ -31,6 +33,7 @@ class InitialSnapshot { required this.zulip_feature_level, required this.zulip_version, this.zulip_merge_base, + required this.user_id, required this.alert_words, required this.custom_profile_fields, required this.subscriptions, diff --git a/lib/api/model/initial_snapshot.g.dart b/lib/api/model/initial_snapshot.g.dart index 42bbb4bf86..48c6a1e8b4 100644 --- a/lib/api/model/initial_snapshot.g.dart +++ b/lib/api/model/initial_snapshot.g.dart @@ -13,6 +13,7 @@ InitialSnapshot _$InitialSnapshotFromJson(Map json) => zulip_feature_level: json['zulip_feature_level'] as int, zulip_version: json['zulip_version'] as String, zulip_merge_base: json['zulip_merge_base'] as String?, + user_id: json['user_id'] as int, alert_words: (json['alert_words'] as List) .map((e) => e as String) .toList(), @@ -31,6 +32,7 @@ Map _$InitialSnapshotToJson(InitialSnapshot instance) => 'zulip_feature_level': instance.zulip_feature_level, 'zulip_version': instance.zulip_version, 'zulip_merge_base': instance.zulip_merge_base, + 'user_id': instance.user_id, 'alert_words': instance.alert_words, 'custom_profile_fields': instance.custom_profile_fields, 'subscriptions': instance.subscriptions, diff --git a/lib/model/store.dart b/lib/model/store.dart index 96d3080106..db3cbc91e1 100644 --- a/lib/model/store.dart +++ b/lib/model/store.dart @@ -65,6 +65,7 @@ class PerAccountStore extends ChangeNotifier { required this.last_event_id, required this.zulip_version, required this.subscriptions, + required this.user_id, }); /// Load the user's data from the server, and start an event queue going. @@ -93,6 +94,9 @@ class PerAccountStore extends ChangeNotifier { final String zulip_version; final Map subscriptions; + // The user's personal data + final int user_id; + // TODO lots more data. When adding, be sure to update handleEvent too. final Set _messageListViews = {}; @@ -201,5 +205,6 @@ PerAccountStore processInitialSnapshot(Account account, last_event_id: initialSnapshot.last_event_id, zulip_version: initialSnapshot.zulip_version, subscriptions: subscriptions, + user_id: initialSnapshot.user_id, ); } From a60fb4cf3ad413309ce15b9b96cbb1456ae29242 Mon Sep 17 00:00:00 2001 From: "neiljp (Neil Pilgrim)" Date: Mon, 13 Mar 2023 18:10:48 -0700 Subject: [PATCH 02/15] fixup: Remove heading. --- lib/model/store.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/model/store.dart b/lib/model/store.dart index db3cbc91e1..70e2630dcf 100644 --- a/lib/model/store.dart +++ b/lib/model/store.dart @@ -94,7 +94,6 @@ class PerAccountStore extends ChangeNotifier { final String zulip_version; final Map subscriptions; - // The user's personal data final int user_id; // TODO lots more data. When adding, be sure to update handleEvent too. From 59fc872cba9b576a6e96a5f6e53cd5d3e30294f2 Mon Sep 17 00:00:00 2001 From: "neiljp (Neil Pilgrim)" Date: Mon, 13 Mar 2023 18:02:41 -0700 Subject: [PATCH 03/15] fixup: Adjust order. --- lib/api/model/initial_snapshot.dart | 6 +++--- lib/api/model/initial_snapshot.g.dart | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/api/model/initial_snapshot.dart b/lib/api/model/initial_snapshot.dart index 34048e48d3..7fd0a9aa6e 100644 --- a/lib/api/model/initial_snapshot.dart +++ b/lib/api/model/initial_snapshot.dart @@ -15,8 +15,6 @@ class InitialSnapshot { final String zulip_version; final String? zulip_merge_base; // TODO(server-5) - final int user_id; - final List alert_words; final List custom_profile_fields; @@ -27,16 +25,18 @@ class InitialSnapshot { // TODO etc., etc. + final int user_id; + InitialSnapshot({ this.queue_id, required this.last_event_id, required this.zulip_feature_level, required this.zulip_version, this.zulip_merge_base, - required this.user_id, required this.alert_words, required this.custom_profile_fields, required this.subscriptions, + required this.user_id, }); factory InitialSnapshot.fromJson(Map json) => diff --git a/lib/api/model/initial_snapshot.g.dart b/lib/api/model/initial_snapshot.g.dart index 48c6a1e8b4..c79daabab8 100644 --- a/lib/api/model/initial_snapshot.g.dart +++ b/lib/api/model/initial_snapshot.g.dart @@ -13,7 +13,6 @@ InitialSnapshot _$InitialSnapshotFromJson(Map json) => zulip_feature_level: json['zulip_feature_level'] as int, zulip_version: json['zulip_version'] as String, zulip_merge_base: json['zulip_merge_base'] as String?, - user_id: json['user_id'] as int, alert_words: (json['alert_words'] as List) .map((e) => e as String) .toList(), @@ -23,6 +22,7 @@ InitialSnapshot _$InitialSnapshotFromJson(Map json) => subscriptions: (json['subscriptions'] as List) .map((e) => Subscription.fromJson(e as Map)) .toList(), + user_id: json['user_id'] as int, ); Map _$InitialSnapshotToJson(InitialSnapshot instance) => @@ -32,8 +32,8 @@ Map _$InitialSnapshotToJson(InitialSnapshot instance) => 'zulip_feature_level': instance.zulip_feature_level, 'zulip_version': instance.zulip_version, 'zulip_merge_base': instance.zulip_merge_base, - 'user_id': instance.user_id, 'alert_words': instance.alert_words, 'custom_profile_fields': instance.custom_profile_fields, 'subscriptions': instance.subscriptions, + 'user_id': instance.user_id, }; From 8d6e8e731b9d09a539c204364d7ddd872b5dd277 Mon Sep 17 00:00:00 2001 From: "neiljp (Neil Pilgrim)" Date: Sat, 11 Mar 2023 14:21:26 -0800 Subject: [PATCH 04/15] api: Add personal full_name and process from InitialSnapshot into store. --- lib/api/model/initial_snapshot.dart | 3 +++ lib/api/model/initial_snapshot.g.dart | 2 ++ lib/model/store.dart | 3 +++ 3 files changed, 8 insertions(+) diff --git a/lib/api/model/initial_snapshot.dart b/lib/api/model/initial_snapshot.dart index 7fd0a9aa6e..bfce9c1bf9 100644 --- a/lib/api/model/initial_snapshot.dart +++ b/lib/api/model/initial_snapshot.dart @@ -15,6 +15,8 @@ class InitialSnapshot { final String zulip_version; final String? zulip_merge_base; // TODO(server-5) + final String full_name; + final List alert_words; final List custom_profile_fields; @@ -33,6 +35,7 @@ class InitialSnapshot { required this.zulip_feature_level, required this.zulip_version, this.zulip_merge_base, + required this.full_name, required this.alert_words, required this.custom_profile_fields, required this.subscriptions, diff --git a/lib/api/model/initial_snapshot.g.dart b/lib/api/model/initial_snapshot.g.dart index c79daabab8..f7a7c9dd5d 100644 --- a/lib/api/model/initial_snapshot.g.dart +++ b/lib/api/model/initial_snapshot.g.dart @@ -13,6 +13,7 @@ InitialSnapshot _$InitialSnapshotFromJson(Map json) => zulip_feature_level: json['zulip_feature_level'] as int, zulip_version: json['zulip_version'] as String, zulip_merge_base: json['zulip_merge_base'] as String?, + full_name: json['full_name'] as String, alert_words: (json['alert_words'] as List) .map((e) => e as String) .toList(), @@ -32,6 +33,7 @@ Map _$InitialSnapshotToJson(InitialSnapshot instance) => 'zulip_feature_level': instance.zulip_feature_level, 'zulip_version': instance.zulip_version, 'zulip_merge_base': instance.zulip_merge_base, + 'full_name': instance.full_name, 'alert_words': instance.alert_words, 'custom_profile_fields': instance.custom_profile_fields, 'subscriptions': instance.subscriptions, diff --git a/lib/model/store.dart b/lib/model/store.dart index 70e2630dcf..7539b1d0d5 100644 --- a/lib/model/store.dart +++ b/lib/model/store.dart @@ -66,6 +66,7 @@ class PerAccountStore extends ChangeNotifier { required this.zulip_version, required this.subscriptions, required this.user_id, + required this.full_name, }); /// Load the user's data from the server, and start an event queue going. @@ -95,6 +96,7 @@ class PerAccountStore extends ChangeNotifier { final Map subscriptions; final int user_id; + String full_name; // TODO lots more data. When adding, be sure to update handleEvent too. @@ -205,5 +207,6 @@ PerAccountStore processInitialSnapshot(Account account, zulip_version: initialSnapshot.zulip_version, subscriptions: subscriptions, user_id: initialSnapshot.user_id, + full_name: initialSnapshot.full_name, ); } From b0db57bc2e1324de61c22186b549972fda0fc3d7 Mon Sep 17 00:00:00 2001 From: "neiljp (Neil Pilgrim)" Date: Mon, 13 Mar 2023 18:07:35 -0700 Subject: [PATCH 05/15] fixup: Adjust order. --- lib/api/model/initial_snapshot.dart | 5 ++--- lib/api/model/initial_snapshot.g.dart | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/api/model/initial_snapshot.dart b/lib/api/model/initial_snapshot.dart index bfce9c1bf9..d93e4cc1cb 100644 --- a/lib/api/model/initial_snapshot.dart +++ b/lib/api/model/initial_snapshot.dart @@ -15,8 +15,6 @@ class InitialSnapshot { final String zulip_version; final String? zulip_merge_base; // TODO(server-5) - final String full_name; - final List alert_words; final List custom_profile_fields; @@ -28,6 +26,7 @@ class InitialSnapshot { // TODO etc., etc. final int user_id; + final String full_name; InitialSnapshot({ this.queue_id, @@ -35,11 +34,11 @@ class InitialSnapshot { required this.zulip_feature_level, required this.zulip_version, this.zulip_merge_base, - required this.full_name, required this.alert_words, required this.custom_profile_fields, required this.subscriptions, required this.user_id, + required this.full_name, }); factory InitialSnapshot.fromJson(Map json) => diff --git a/lib/api/model/initial_snapshot.g.dart b/lib/api/model/initial_snapshot.g.dart index f7a7c9dd5d..f142278b6c 100644 --- a/lib/api/model/initial_snapshot.g.dart +++ b/lib/api/model/initial_snapshot.g.dart @@ -13,7 +13,6 @@ InitialSnapshot _$InitialSnapshotFromJson(Map json) => zulip_feature_level: json['zulip_feature_level'] as int, zulip_version: json['zulip_version'] as String, zulip_merge_base: json['zulip_merge_base'] as String?, - full_name: json['full_name'] as String, alert_words: (json['alert_words'] as List) .map((e) => e as String) .toList(), @@ -24,6 +23,7 @@ InitialSnapshot _$InitialSnapshotFromJson(Map json) => .map((e) => Subscription.fromJson(e as Map)) .toList(), user_id: json['user_id'] as int, + full_name: json['full_name'] as String, ); Map _$InitialSnapshotToJson(InitialSnapshot instance) => @@ -33,9 +33,9 @@ Map _$InitialSnapshotToJson(InitialSnapshot instance) => 'zulip_feature_level': instance.zulip_feature_level, 'zulip_version': instance.zulip_version, 'zulip_merge_base': instance.zulip_merge_base, - 'full_name': instance.full_name, 'alert_words': instance.alert_words, 'custom_profile_fields': instance.custom_profile_fields, 'subscriptions': instance.subscriptions, 'user_id': instance.user_id, + 'full_name': instance.full_name, }; From 058d65493d7a0cd37f43e267f7fa772d98bba9f7 Mon Sep 17 00:00:00 2001 From: "neiljp (Neil Pilgrim)" Date: Sat, 11 Mar 2023 17:40:34 -0800 Subject: [PATCH 06/15] api: Prep typing for 'realm_user' event via RealmUserUpdateEventPerson. --- lib/api/model/model.dart | 47 ++++++++++++++++++++++++++++++++++++++ lib/api/model/model.g.dart | 34 +++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) diff --git a/lib/api/model/model.dart b/lib/api/model/model.dart index c8e0539ab1..56c3c13748 100644 --- a/lib/api/model/model.dart +++ b/lib/api/model/model.dart @@ -255,3 +255,50 @@ class PmMessage extends Message { @override Map toJson() => _$PmMessageToJson(this); } + +@JsonSerializable() +class RealmUserEventPerson { + final int user_id; + + final String? full_name; + + final String? avatar_url; + final String? avatar_url_medium; + final String? avatar_source; + final String? avatar_version; + + final String? timezone; + // final String? email; // Deprecated as redundant with user_id + + final int? bot_owner_id; + + final int? role; + + final bool? is_billing_admin; // Can also be null? // TODO(server-5) + + final String? delivery_email; // TODO(server-7j + + // custom_profile_field has sub-parts to affect which id/value/rendered_value is updated + + final String? new_email; + + RealmUserEventPerson({ + required this.user_id, + this.full_name, + this.avatar_url, + this.avatar_url_medium, + this.avatar_source, + this.avatar_version, + this.timezone, + this.bot_owner_id, + this.role, + this.is_billing_admin, // Can also be null? + this.delivery_email, + this.new_email, + }); + + factory RealmUserEventPerson.fromJson(Map json) => + _$RealmUserEventPersonFromJson(json); + + Map toJson() => _$RealmUserEventPersonToJson(this); +} diff --git a/lib/api/model/model.g.dart b/lib/api/model/model.g.dart index 1ff85b05d8..f84a2ea10d 100644 --- a/lib/api/model/model.g.dart +++ b/lib/api/model/model.g.dart @@ -186,3 +186,37 @@ Map _$PmMessageToJson(PmMessage instance) => { 'type': instance.type, 'display_recipient': instance.display_recipient, }; + +RealmUserEventPerson _$RealmUserEventPersonFromJson( + Map json) => + RealmUserEventPerson( + user_id: json['user_id'] as int, + full_name: json['full_name'] as String?, + avatar_url: json['avatar_url'] as String?, + avatar_url_medium: json['avatar_url_medium'] as String?, + avatar_source: json['avatar_source'] as String?, + avatar_version: json['avatar_version'] as String?, + timezone: json['timezone'] as String?, + bot_owner_id: json['bot_owner_id'] as int?, + role: json['role'] as int?, + is_billing_admin: json['is_billing_admin'] as bool?, + delivery_email: json['delivery_email'] as String?, + new_email: json['new_email'] as String?, + ); + +Map _$RealmUserEventPersonToJson( + RealmUserEventPerson instance) => + { + 'user_id': instance.user_id, + 'full_name': instance.full_name, + 'avatar_url': instance.avatar_url, + 'avatar_url_medium': instance.avatar_url_medium, + 'avatar_source': instance.avatar_source, + 'avatar_version': instance.avatar_version, + 'timezone': instance.timezone, + 'bot_owner_id': instance.bot_owner_id, + 'role': instance.role, + 'is_billing_admin': instance.is_billing_admin, + 'delivery_email': instance.delivery_email, + 'new_email': instance.new_email, + }; From 25fb7b50175f0a65d9e14eb2b7e9d2b35d59dffd Mon Sep 17 00:00:00 2001 From: "neiljp (Neil Pilgrim)" Date: Mon, 13 Mar 2023 18:15:33 -0700 Subject: [PATCH 07/15] fixup: Clarify comments in RealmUserEventPerson. --- lib/api/model/model.dart | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/api/model/model.dart b/lib/api/model/model.dart index 56c3c13748..fee5ba394b 100644 --- a/lib/api/model/model.dart +++ b/lib/api/model/model.dart @@ -262,6 +262,7 @@ class RealmUserEventPerson { final String? full_name; + // TODO express that all four avatar-related properties will be present if any of them is final String? avatar_url; final String? avatar_url_medium; final String? avatar_source; @@ -274,11 +275,11 @@ class RealmUserEventPerson { final int? role; - final bool? is_billing_admin; // Can also be null? // TODO(server-5) + final bool? is_billing_admin; - final String? delivery_email; // TODO(server-7j + final String? delivery_email; // TODO Can also be 'None', distinct from null - // custom_profile_field has sub-parts to affect which id/value/rendered_value is updated + // final CustomProfileFieldValueUpdate? custom_profile_field; // TODO handle final String? new_email; From 78110c2d19cc6db301ea4ab0319d93b1cd967d8c Mon Sep 17 00:00:00 2001 From: "neiljp (Neil Pilgrim)" Date: Mon, 13 Mar 2023 18:38:47 -0700 Subject: [PATCH 08/15] fixup: Move RealmUserEventPerson from model to events. --- lib/api/model/events.dart | 48 +++++++++++++++++++++++++++++++++++++ lib/api/model/events.g.dart | 34 ++++++++++++++++++++++++++ lib/api/model/model.dart | 48 ------------------------------------- lib/api/model/model.g.dart | 34 -------------------------- 4 files changed, 82 insertions(+), 82 deletions(-) diff --git a/lib/api/model/events.dart b/lib/api/model/events.dart index 1b46132770..463773d968 100644 --- a/lib/api/model/events.dart +++ b/lib/api/model/events.dart @@ -63,6 +63,54 @@ class AlertWordsEvent extends Event { Map toJson() => _$AlertWordsEventToJson(this); } +@JsonSerializable() +class RealmUserEventPerson { + final int user_id; + + final String? full_name; + + // TODO express that all four avatar-related properties will be present if any of them is + final String? avatar_url; + final String? avatar_url_medium; + final String? avatar_source; + final String? avatar_version; + + final String? timezone; + // final String? email; // Deprecated as redundant with user_id + + final int? bot_owner_id; + + final int? role; + + final bool? is_billing_admin; + + final String? delivery_email; // TODO Can also be 'None', distinct from null + + // final CustomProfileFieldValueUpdate? custom_profile_field; // TODO handle + + final String? new_email; + + RealmUserEventPerson({ + required this.user_id, + this.full_name, + this.avatar_url, + this.avatar_url_medium, + this.avatar_source, + this.avatar_version, + this.timezone, + this.bot_owner_id, + this.role, + this.is_billing_admin, // Can also be null? + this.delivery_email, + this.new_email, + }); + + factory RealmUserEventPerson.fromJson(Map json) => + _$RealmUserEventPersonFromJson(json); + + Map toJson() => _$RealmUserEventPersonToJson(this); +} + /// A Zulip event of type `message`. // TODO use [JsonSerializable] here too, using its customization features, // in order to skip the boilerplate in [fromJson] and [toJson]. diff --git a/lib/api/model/events.g.dart b/lib/api/model/events.g.dart index 20bc9c502a..4211a323d5 100644 --- a/lib/api/model/events.g.dart +++ b/lib/api/model/events.g.dart @@ -21,6 +21,40 @@ Map _$AlertWordsEventToJson(AlertWordsEvent instance) => 'alert_words': instance.alert_words, }; +RealmUserEventPerson _$RealmUserEventPersonFromJson( + Map json) => + RealmUserEventPerson( + user_id: json['user_id'] as int, + full_name: json['full_name'] as String?, + avatar_url: json['avatar_url'] as String?, + avatar_url_medium: json['avatar_url_medium'] as String?, + avatar_source: json['avatar_source'] as String?, + avatar_version: json['avatar_version'] as String?, + timezone: json['timezone'] as String?, + bot_owner_id: json['bot_owner_id'] as int?, + role: json['role'] as int?, + is_billing_admin: json['is_billing_admin'] as bool?, + delivery_email: json['delivery_email'] as String?, + new_email: json['new_email'] as String?, + ); + +Map _$RealmUserEventPersonToJson( + RealmUserEventPerson instance) => + { + 'user_id': instance.user_id, + 'full_name': instance.full_name, + 'avatar_url': instance.avatar_url, + 'avatar_url_medium': instance.avatar_url_medium, + 'avatar_source': instance.avatar_source, + 'avatar_version': instance.avatar_version, + 'timezone': instance.timezone, + 'bot_owner_id': instance.bot_owner_id, + 'role': instance.role, + 'is_billing_admin': instance.is_billing_admin, + 'delivery_email': instance.delivery_email, + 'new_email': instance.new_email, + }; + HeartbeatEvent _$HeartbeatEventFromJson(Map json) => HeartbeatEvent( id: json['id'] as int, diff --git a/lib/api/model/model.dart b/lib/api/model/model.dart index fee5ba394b..c8e0539ab1 100644 --- a/lib/api/model/model.dart +++ b/lib/api/model/model.dart @@ -255,51 +255,3 @@ class PmMessage extends Message { @override Map toJson() => _$PmMessageToJson(this); } - -@JsonSerializable() -class RealmUserEventPerson { - final int user_id; - - final String? full_name; - - // TODO express that all four avatar-related properties will be present if any of them is - final String? avatar_url; - final String? avatar_url_medium; - final String? avatar_source; - final String? avatar_version; - - final String? timezone; - // final String? email; // Deprecated as redundant with user_id - - final int? bot_owner_id; - - final int? role; - - final bool? is_billing_admin; - - final String? delivery_email; // TODO Can also be 'None', distinct from null - - // final CustomProfileFieldValueUpdate? custom_profile_field; // TODO handle - - final String? new_email; - - RealmUserEventPerson({ - required this.user_id, - this.full_name, - this.avatar_url, - this.avatar_url_medium, - this.avatar_source, - this.avatar_version, - this.timezone, - this.bot_owner_id, - this.role, - this.is_billing_admin, // Can also be null? - this.delivery_email, - this.new_email, - }); - - factory RealmUserEventPerson.fromJson(Map json) => - _$RealmUserEventPersonFromJson(json); - - Map toJson() => _$RealmUserEventPersonToJson(this); -} diff --git a/lib/api/model/model.g.dart b/lib/api/model/model.g.dart index f84a2ea10d..1ff85b05d8 100644 --- a/lib/api/model/model.g.dart +++ b/lib/api/model/model.g.dart @@ -186,37 +186,3 @@ Map _$PmMessageToJson(PmMessage instance) => { 'type': instance.type, 'display_recipient': instance.display_recipient, }; - -RealmUserEventPerson _$RealmUserEventPersonFromJson( - Map json) => - RealmUserEventPerson( - user_id: json['user_id'] as int, - full_name: json['full_name'] as String?, - avatar_url: json['avatar_url'] as String?, - avatar_url_medium: json['avatar_url_medium'] as String?, - avatar_source: json['avatar_source'] as String?, - avatar_version: json['avatar_version'] as String?, - timezone: json['timezone'] as String?, - bot_owner_id: json['bot_owner_id'] as int?, - role: json['role'] as int?, - is_billing_admin: json['is_billing_admin'] as bool?, - delivery_email: json['delivery_email'] as String?, - new_email: json['new_email'] as String?, - ); - -Map _$RealmUserEventPersonToJson( - RealmUserEventPerson instance) => - { - 'user_id': instance.user_id, - 'full_name': instance.full_name, - 'avatar_url': instance.avatar_url, - 'avatar_url_medium': instance.avatar_url_medium, - 'avatar_source': instance.avatar_source, - 'avatar_version': instance.avatar_version, - 'timezone': instance.timezone, - 'bot_owner_id': instance.bot_owner_id, - 'role': instance.role, - 'is_billing_admin': instance.is_billing_admin, - 'delivery_email': instance.delivery_email, - 'new_email': instance.new_email, - }; From 9e7816ef195c1416c894d3a55c92e72708fb9397 Mon Sep 17 00:00:00 2001 From: "neiljp (Neil Pilgrim)" Date: Mon, 13 Mar 2023 19:02:29 -0700 Subject: [PATCH 09/15] fixup: Rename RealmUserEventPerson to include Update. --- lib/api/model/events.dart | 10 +++++----- lib/api/model/events.g.dart | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/api/model/events.dart b/lib/api/model/events.dart index 463773d968..2a82ee2bd2 100644 --- a/lib/api/model/events.dart +++ b/lib/api/model/events.dart @@ -64,7 +64,7 @@ class AlertWordsEvent extends Event { } @JsonSerializable() -class RealmUserEventPerson { +class RealmUserUpdateEventPerson { final int user_id; final String? full_name; @@ -90,7 +90,7 @@ class RealmUserEventPerson { final String? new_email; - RealmUserEventPerson({ + RealmUserUpdateEventPerson({ required this.user_id, this.full_name, this.avatar_url, @@ -105,10 +105,10 @@ class RealmUserEventPerson { this.new_email, }); - factory RealmUserEventPerson.fromJson(Map json) => - _$RealmUserEventPersonFromJson(json); + factory RealmUserUpdateEventPerson.fromJson(Map json) => + _$RealmUserUpdateEventPersonFromJson(json); - Map toJson() => _$RealmUserEventPersonToJson(this); + Map toJson() => _$RealmUserUpdateEventPersonToJson(this); } /// A Zulip event of type `message`. diff --git a/lib/api/model/events.g.dart b/lib/api/model/events.g.dart index 4211a323d5..e4274afc4a 100644 --- a/lib/api/model/events.g.dart +++ b/lib/api/model/events.g.dart @@ -21,9 +21,9 @@ Map _$AlertWordsEventToJson(AlertWordsEvent instance) => 'alert_words': instance.alert_words, }; -RealmUserEventPerson _$RealmUserEventPersonFromJson( +RealmUserUpdateEventPerson _$RealmUserUpdateEventPersonFromJson( Map json) => - RealmUserEventPerson( + RealmUserUpdateEventPerson( user_id: json['user_id'] as int, full_name: json['full_name'] as String?, avatar_url: json['avatar_url'] as String?, @@ -38,8 +38,8 @@ RealmUserEventPerson _$RealmUserEventPersonFromJson( new_email: json['new_email'] as String?, ); -Map _$RealmUserEventPersonToJson( - RealmUserEventPerson instance) => +Map _$RealmUserUpdateEventPersonToJson( + RealmUserUpdateEventPerson instance) => { 'user_id': instance.user_id, 'full_name': instance.full_name, From 9061ec875ea375b5c282638bcb564a5464510501 Mon Sep 17 00:00:00 2001 From: "neiljp (Neil Pilgrim)" Date: Sat, 11 Mar 2023 15:22:22 -0800 Subject: [PATCH 10/15] api: Add handler for realm_user update events via RealmUserUpdateEvent. Initially only log the event. Event check added. --- lib/api/model/events.dart | 19 +++++++++++++++++++ lib/api/model/events.g.dart | 14 ++++++++++++++ lib/model/store.dart | 2 ++ test/api/model/events_checks.dart | 4 ++++ 4 files changed, 39 insertions(+) diff --git a/lib/api/model/events.dart b/lib/api/model/events.dart index 2a82ee2bd2..a81713b8ac 100644 --- a/lib/api/model/events.dart +++ b/lib/api/model/events.dart @@ -19,6 +19,7 @@ abstract class Event { final type = json['type'] as String; switch (type) { case 'alert_words': return AlertWordsEvent.fromJson(json); + case 'realm_user': return RealmUserEvent.fromJson(json); case 'message': return MessageEvent.fromJson(json); case 'heartbeat': return HeartbeatEvent.fromJson(json); // TODO add many more event types @@ -63,6 +64,24 @@ class AlertWordsEvent extends Event { Map toJson() => _$AlertWordsEventToJson(this); } +/// A Zulip event of type `realm_user`. +@JsonSerializable() +class RealmUserEvent extends Event { + @override + @JsonKey(includeToJson: true) + String get type => 'realm_user'; + + final RealmUserUpdateEventPerson person; + + RealmUserEvent({required super.id, required this.person}); + + factory RealmUserEvent.fromJson(Map json) => + _$RealmUserEventFromJson(json); + + @override + Map toJson() => _$RealmUserEventToJson(this); +} + @JsonSerializable() class RealmUserUpdateEventPerson { final int user_id; diff --git a/lib/api/model/events.g.dart b/lib/api/model/events.g.dart index e4274afc4a..2cb926e553 100644 --- a/lib/api/model/events.g.dart +++ b/lib/api/model/events.g.dart @@ -21,6 +21,20 @@ Map _$AlertWordsEventToJson(AlertWordsEvent instance) => 'alert_words': instance.alert_words, }; +RealmUserEvent _$RealmUserEventFromJson(Map json) => + RealmUserEvent( + id: json['id'] as int, + person: RealmUserUpdateEventPerson.fromJson( + json['person'] as Map), + ); + +Map _$RealmUserEventToJson(RealmUserEvent instance) => + { + 'id': instance.id, + 'type': instance.type, + 'person': instance.person, + }; + RealmUserUpdateEventPerson _$RealmUserUpdateEventPersonFromJson( Map json) => RealmUserUpdateEventPerson( diff --git a/lib/model/store.dart b/lib/model/store.dart index 7539b1d0d5..0784b881bc 100644 --- a/lib/model/store.dart +++ b/lib/model/store.dart @@ -149,6 +149,8 @@ class PerAccountStore extends ChangeNotifier { for (final view in _messageListViews) { view.maybeAddMessage(event.message); } + } else if (event is RealmUserEvent) { + debugPrint("server event: realm_user"); // TODO Update our data, and others } else if (event is UnexpectedEvent) { debugPrint("server event: ${jsonEncode(event.toJson())}"); // TODO log better } else { diff --git a/test/api/model/events_checks.dart b/test/api/model/events_checks.dart index 82e0256f0a..2bb6e1267a 100644 --- a/test/api/model/events_checks.dart +++ b/test/api/model/events_checks.dart @@ -17,6 +17,10 @@ extension AlertWordsEventChecks on Subject { Subject> get alert_words => has((e) => e.alert_words, 'alert_words'); } +extension RealmUserEventChecks on Subject { + Subject get person => has((e) => e.person, 'realm_user'); +} + extension MessageEventChecks on Subject { Subject get message => has((e) => e.message, 'message'); } From 7e62e1df6e16d89c97d57bba8867bfc4faa115fc Mon Sep 17 00:00:00 2001 From: "neiljp (Neil Pilgrim)" Date: Mon, 13 Mar 2023 18:54:31 -0700 Subject: [PATCH 11/15] fixup: Translate to RealmUserUpdateEvent. --- lib/api/model/events.dart | 23 ++++++++++++++++------- lib/api/model/events.g.dart | 9 ++++++--- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/lib/api/model/events.dart b/lib/api/model/events.dart index a81713b8ac..604604c287 100644 --- a/lib/api/model/events.dart +++ b/lib/api/model/events.dart @@ -19,7 +19,12 @@ abstract class Event { final type = json['type'] as String; switch (type) { case 'alert_words': return AlertWordsEvent.fromJson(json); - case 'realm_user': return RealmUserEvent.fromJson(json); + case 'realm_user': + switch(json['op'] as String) { + case 'update': return RealmUserUpdateEvent.fromJson(json); + // TODO add realm_user/add and realm_user/remove events + default: return UnexpectedEvent.fromJson(json); + } case 'message': return MessageEvent.fromJson(json); case 'heartbeat': return HeartbeatEvent.fromJson(json); // TODO add many more event types @@ -64,22 +69,26 @@ class AlertWordsEvent extends Event { Map toJson() => _$AlertWordsEventToJson(this); } -/// A Zulip event of type `realm_user`. +/// A Zulip event of type `realm_user` (only for op:update). @JsonSerializable() -class RealmUserEvent extends Event { +class RealmUserUpdateEvent extends Event { @override @JsonKey(includeToJson: true) String get type => 'realm_user'; + @override + @JsonKey(includeToJson: true) + String get op => 'update'; + final RealmUserUpdateEventPerson person; - RealmUserEvent({required super.id, required this.person}); + RealmUserUpdateEvent({required super.id, required this.person}); - factory RealmUserEvent.fromJson(Map json) => - _$RealmUserEventFromJson(json); + factory RealmUserUpdateEvent.fromJson(Map json) => + _$RealmUserUpdateEventFromJson(json); @override - Map toJson() => _$RealmUserEventToJson(this); + Map toJson() => _$RealmUserUpdateEventToJson(this); } @JsonSerializable() diff --git a/lib/api/model/events.g.dart b/lib/api/model/events.g.dart index 2cb926e553..517a6919e5 100644 --- a/lib/api/model/events.g.dart +++ b/lib/api/model/events.g.dart @@ -21,17 +21,20 @@ Map _$AlertWordsEventToJson(AlertWordsEvent instance) => 'alert_words': instance.alert_words, }; -RealmUserEvent _$RealmUserEventFromJson(Map json) => - RealmUserEvent( +RealmUserUpdateEvent _$RealmUserUpdateEventFromJson( + Map json) => + RealmUserUpdateEvent( id: json['id'] as int, person: RealmUserUpdateEventPerson.fromJson( json['person'] as Map), ); -Map _$RealmUserEventToJson(RealmUserEvent instance) => +Map _$RealmUserUpdateEventToJson( + RealmUserUpdateEvent instance) => { 'id': instance.id, 'type': instance.type, + 'op': instance.op, 'person': instance.person, }; From 3f4632db656781762dd8aa4a4f421eb4ab0e1a56 Mon Sep 17 00:00:00 2001 From: "neiljp (Neil Pilgrim)" Date: Sat, 11 Mar 2023 20:30:29 -0800 Subject: [PATCH 12/15] store/app: Add full_name to HomePage, updating on RealmUserUpdateEvent. --- lib/model/store.dart | 12 ++++++++++-- lib/widgets/app.dart | 7 +++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/model/store.dart b/lib/model/store.dart index 0784b881bc..86fa81c7a3 100644 --- a/lib/model/store.dart +++ b/lib/model/store.dart @@ -149,8 +149,16 @@ class PerAccountStore extends ChangeNotifier { for (final view in _messageListViews) { view.maybeAddMessage(event.message); } - } else if (event is RealmUserEvent) { - debugPrint("server event: realm_user"); // TODO Update our data, and others + } else if (event is RealmUserUpdateEvent) { + debugPrint("server event: realm_user op:update"); + if (event.person.user_id == user_id) { + String? new_full_name = event.person.full_name; + if (new_full_name != null) { + full_name = new_full_name; + notifyListeners(); + } + } + // TODO Update our other data, and that of other users } else if (event is UnexpectedEvent) { debugPrint("server event: ${jsonEncode(event.toJson())}"); // TODO log better } else { diff --git a/lib/widgets/app.dart b/lib/widgets/app.dart index 17336cffbe..a4e6054b54 100644 --- a/lib/widgets/app.dart +++ b/lib/widgets/app.dart @@ -57,6 +57,13 @@ class HomePage extends StatelessWidget { child: Column(children: [ const Text('🚧 Under construction 🚧'), const SizedBox(height: 12), + ListenableBuilder( + builder: (BuildContext context, Widget? child) { + return Text.rich(TextSpan( + text: 'You are: ', + children: [bold(store.full_name)]));}, + listenable: store, + ), Text.rich(TextSpan( text: 'Connected to: ', children: [bold(store.account.realmUrl)])), From d01ab14ba8d9e238f8ad0c56e571c43f781d59e8 Mon Sep 17 00:00:00 2001 From: "neiljp (Neil Pilgrim)" Date: Mon, 13 Mar 2023 17:44:43 -0700 Subject: [PATCH 13/15] fixup: Remove unnecessary builder. --- lib/widgets/app.dart | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/lib/widgets/app.dart b/lib/widgets/app.dart index a4e6054b54..b04a3eda18 100644 --- a/lib/widgets/app.dart +++ b/lib/widgets/app.dart @@ -57,13 +57,9 @@ class HomePage extends StatelessWidget { child: Column(children: [ const Text('🚧 Under construction 🚧'), const SizedBox(height: 12), - ListenableBuilder( - builder: (BuildContext context, Widget? child) { - return Text.rich(TextSpan( - text: 'You are: ', - children: [bold(store.full_name)]));}, - listenable: store, - ), + Text.rich(TextSpan( + text: 'You are: ', + children: [bold(store.full_name)])), Text.rich(TextSpan( text: 'Connected to: ', children: [bold(store.account.realmUrl)])), From e0cf4ae6a21ef6b66c38179644ab65d679e42c6c Mon Sep 17 00:00:00 2001 From: "neiljp (Neil Pilgrim)" Date: Mon, 13 Mar 2023 17:57:10 -0700 Subject: [PATCH 14/15] fixup: Use final on temporary local variable. --- lib/model/store.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/model/store.dart b/lib/model/store.dart index 86fa81c7a3..c177986833 100644 --- a/lib/model/store.dart +++ b/lib/model/store.dart @@ -152,7 +152,7 @@ class PerAccountStore extends ChangeNotifier { } else if (event is RealmUserUpdateEvent) { debugPrint("server event: realm_user op:update"); if (event.person.user_id == user_id) { - String? new_full_name = event.person.full_name; + final String? new_full_name = event.person.full_name; if (new_full_name != null) { full_name = new_full_name; notifyListeners(); From d23b5edaa4a47478cf2bdd08ae3a1928f70fe06f Mon Sep 17 00:00:00 2001 From: "neiljp (Neil Pilgrim)" Date: Mon, 13 Mar 2023 18:32:35 -0700 Subject: [PATCH 15/15] fixup: Remove comment re updating other data. --- lib/model/store.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/model/store.dart b/lib/model/store.dart index c177986833..b2476221b5 100644 --- a/lib/model/store.dart +++ b/lib/model/store.dart @@ -158,7 +158,6 @@ class PerAccountStore extends ChangeNotifier { notifyListeners(); } } - // TODO Update our other data, and that of other users } else if (event is UnexpectedEvent) { debugPrint("server event: ${jsonEncode(event.toJson())}"); // TODO log better } else {