diff --git a/lib/controllers/message_controller.dart b/lib/controllers/message_controller.dart index 18bee2b..d52a835 100644 --- a/lib/controllers/message_controller.dart +++ b/lib/controllers/message_controller.dart @@ -123,6 +123,7 @@ class MessageController extends AsyncNotifier { text: "Unable to decrypt message.", metadata: {...metadata, "body": "Unable to decrypt message."}, ), + // "org.matrix.msc3381.poll.start" => Message.custom( // metadata: { // ...metadata, diff --git a/lib/models/content/content.dart b/lib/models/content/content.dart new file mode 100644 index 0000000..06ec328 --- /dev/null +++ b/lib/models/content/content.dart @@ -0,0 +1,17 @@ +import "package:nexus/models/content/encrypted.dart"; +import "package:nexus/models/content/membership.dart"; +import "package:nexus/models/content/message.dart"; + +class Content { + Content(); + factory Content.fromJson(Map json) => 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); +} diff --git a/lib/models/content/encrypted.dart b/lib/models/content/encrypted.dart new file mode 100644 index 0000000..0b575e7 --- /dev/null +++ b/lib/models/content/encrypted.dart @@ -0,0 +1,9 @@ +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 new file mode 100644 index 0000000..38435b5 --- /dev/null +++ b/lib/models/content/membership.dart @@ -0,0 +1,21 @@ +import "package:freezed_annotation/freezed_annotation.dart"; +import "package:nexus/models/content/content.dart"; +import "package:nexus/models/membership_status.dart"; +part "membership.freezed.dart"; +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, + required MembershipStatus membership, + required String? avatarUrl, + required String? reason, + }) = _MembershipContent; + + factory MembershipContent.fromJson(Map json) => + _$MembershipContentFromJson(json); +} diff --git a/lib/models/content/message.dart b/lib/models/content/message.dart new file mode 100644 index 0000000..3523db7 --- /dev/null +++ b/lib/models/content/message.dart @@ -0,0 +1,16 @@ +import "package:freezed_annotation/freezed_annotation.dart"; +import "package:nexus/models/content/content.dart"; +import "package:nexus/models/membership_status.dart"; +part "message.freezed.dart"; +part "message.g.dart"; + +@freezed +abstract class MessageContent extends Content with _$MessageContent { + static const type = "m.room.message"; + + MessageContent._(); + const factory MessageContent({required String msgtype}) = _MessageContent; + + factory MessageContent.fromJson(Map json) => + _$MessageContentFromJson(json); +} diff --git a/lib/models/event.dart b/lib/models/event.dart index 4a72817..4e7ba04 100644 --- a/lib/models/event.dart +++ b/lib/models/event.dart @@ -1,5 +1,6 @@ import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:freezed_annotation/freezed_annotation.dart"; +import "package:nexus/models/content/content.dart"; import "package:nexus/models/epoch_date_time_converter.dart"; part "event.freezed.dart"; part "event.g.dart"; @@ -15,7 +16,6 @@ abstract class Event with _$Event { required String type, String? stateKey, @EpochDateTimeConverter() required DateTime timestamp, - required IMap content, IMap? decrypted, String? decryptedType, @Default(IMap.empty()) IMap unsigned, @@ -29,6 +29,7 @@ abstract class Event with _$Event { @Default(IMap.empty()) IMap reactions, @JsonKey(name: "last_edit_rowid") int? lastEditRowId, @UnreadTypeConverter() UnreadType? unreadType, + @JsonKey(fromJson: Content.fromJson) required Content content, }) = _Event; factory Event.fromJson(Map json) => _$EventFromJson(json);