diff --git a/lib/models/content/content.dart b/lib/models/content/content.dart index 06ec328..0f931ea 100644 --- a/lib/models/content/content.dart +++ b/lib/models/content/content.dart @@ -1,4 +1,5 @@ -import "package:nexus/models/content/encrypted.dart"; +import "package:collection/collection.dart"; +import "package:freezed_annotation/freezed_annotation.dart"; import "package:nexus/models/content/membership.dart"; import "package:nexus/models/content/message.dart"; @@ -8,10 +9,19 @@ class Content { Map toJson() => {}; static Content fromEventJson(Map eventJson) => - switch (eventJson["type"]) { - EncryptedContent.type => EncryptedContent.fromJson, - MembershipContent.type => MembershipContent.fromJson, - MessageContent.type => MessageContent.fromJson, - _ => Content.fromJson, - }(eventJson); + (EventType.values + .firstWhereOrNull((eventType) => eventType == eventJson["type"]) + ?.contentFromJson ?? + Content.fromJson)(eventJson); +} + +@JsonEnum(valueField: "type") +enum EventType { + encrypted("m.room.encrypted", Content.fromJson), + membership("m.room.member", MembershipContent.fromJson), + message("m.room.message", MessageContent.fromJson); + + final String type; + final Content Function(Map json) contentFromJson; + const EventType(this.type, this.contentFromJson); } diff --git a/lib/models/content/encrypted.dart b/lib/models/content/encrypted.dart deleted file mode 100644 index 0b575e7..0000000 --- a/lib/models/content/encrypted.dart +++ /dev/null @@ -1,9 +0,0 @@ -import "package:nexus/models/content/content.dart"; - -class EncryptedContent extends Content { - EncryptedContent(); - factory EncryptedContent.fromJson(Map json) => - EncryptedContent(); - - static const type = "m.room.encrypted"; -} diff --git a/lib/models/content/membership.dart b/lib/models/content/membership.dart index 39a645b..6e4f875 100644 --- a/lib/models/content/membership.dart +++ b/lib/models/content/membership.dart @@ -6,8 +6,6 @@ part "membership.g.dart"; @freezed abstract class MembershipContent extends Content with _$MembershipContent { - static const type = "m.room.membership"; - MembershipContent._(); const factory MembershipContent({ @JsonKey(name: "displayname") required String displayName, diff --git a/lib/models/content/message.dart b/lib/models/content/message.dart index e98dbf5..3c0ebdc 100644 --- a/lib/models/content/message.dart +++ b/lib/models/content/message.dart @@ -8,8 +8,6 @@ part "message.g.dart"; @Freezed(unionKey: "msgtype", fallbackUnion: "default") abstract class MessageContent extends Content with _$MessageContent { - static const type = "m.room.message"; - MessageContent._(); const factory MessageContent({ required String msgtype,