diff --git a/build.yaml b/build.yaml index 60c987cd..eaea5a53 100644 --- a/build.yaml +++ b/build.yaml @@ -5,3 +5,7 @@ targets: options: explicit_to_json: true field_rename: snake + drift_dev: + options: + databases: + app_database: lib/database/drift_db.dart diff --git a/drift_schemas/app_database/drift_schema_v6.json b/drift_schemas/app_database/drift_schema_v6.json new file mode 100644 index 00000000..e5ed2e8d --- /dev/null +++ b/drift_schemas/app_database/drift_schema_v6.json @@ -0,0 +1 @@ +{"_meta":{"description":"This file contains a serialized version of schema entities for drift.","version":"1.2.0"},"options":{"store_date_time_values_as_text":false},"entities":[{"id":0,"references":[],"type":"table","data":{"name":"chat_messages","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"room_id","getter_name":"roomId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"sender_id","getter_name":"senderId","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"content","getter_name":"content","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"nonce","getter_name":"nonce","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"data","getter_name":"data","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"status","getter_name":"status","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumIndexConverter(MessageStatus.values)","dart_type_name":"MessageStatus"}},{"name":"is_deleted","getter_name":"isDeleted","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"is_deleted\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"is_deleted\" IN (0, 1))"},"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]},{"name":"updated_at","getter_name":"updatedAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"deleted_at","getter_name":"deletedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"type","getter_name":"type","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('\\'text\\'')","default_client_dart":null,"dsl_features":[]},{"name":"meta","getter_name":"meta","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('\\'{}\\'')","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const MapConverter()","dart_type_name":"Map"}},{"name":"members_mentioned","getter_name":"membersMentioned","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('\\'[]\\'')","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const ListStringConverter()","dart_type_name":"List"}},{"name":"edited_at","getter_name":"editedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"attachments","getter_name":"attachments","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('\\'[]\\'')","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const ListMapConverter()","dart_type_name":"List>"}},{"name":"reactions","getter_name":"reactions","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('\\'[]\\'')","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const ListMapConverter()","dart_type_name":"List>"}},{"name":"replied_message_id","getter_name":"repliedMessageId","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"forwarded_message_id","getter_name":"forwardedMessageId","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[],"explicit_pk":["id"]}},{"id":1,"references":[],"type":"table","data":{"name":"post_drafts","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"title","getter_name":"title","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"description","getter_name":"description","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"content","getter_name":"content","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"visibility","getter_name":"visibility","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]},{"name":"type","getter_name":"type","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]},{"name":"last_modified","getter_name":"lastModified","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"post_data","getter_name":"postData","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[],"explicit_pk":["id"]}}]} \ No newline at end of file diff --git a/lib/database/drift_db.dart b/lib/database/drift_db.dart index 1a6206eb..d5b95614 100644 --- a/lib/database/drift_db.dart +++ b/lib/database/drift_db.dart @@ -12,7 +12,7 @@ class AppDatabase extends _$AppDatabase { AppDatabase(super.e); @override - int get schemaVersion => 6; + int get schemaVersion => 7; @override MigrationStrategy get migration => MigrationStrategy( @@ -21,8 +21,8 @@ class AppDatabase extends _$AppDatabase { }, onUpgrade: (Migrator m, int from, int to) async { if (from < 2) { - // Add isRead column with default value false - await m.addColumn(chatMessages, chatMessages.isRead); + // Add isDeleted column with default value false + await m.addColumn(chatMessages, chatMessages.isDeleted); } if (from < 4) { // Drop old draft tables if they exist @@ -32,6 +32,19 @@ class AppDatabase extends _$AppDatabase { // Migrate from old schema to new schema with separate searchable fields await _migrateToVersion6(m); } + if (from < 7) { + // Add new columns from SnChatMessage + await m.addColumn(chatMessages, chatMessages.updatedAt); + await m.addColumn(chatMessages, chatMessages.deletedAt); + await m.addColumn(chatMessages, chatMessages.type); + await m.addColumn(chatMessages, chatMessages.meta); + await m.addColumn(chatMessages, chatMessages.membersMentioned); + await m.addColumn(chatMessages, chatMessages.editedAt); + await m.addColumn(chatMessages, chatMessages.attachments); + await m.addColumn(chatMessages, chatMessages.reactions); + await m.addColumn(chatMessages, chatMessages.repliedMessageId); + await m.addColumn(chatMessages, chatMessages.forwardedMessageId); + } }, ); @@ -116,12 +129,6 @@ class AppDatabase extends _$AppDatabase { )).write(ChatMessagesCompanion(status: Value(status))); } - Future markMessageAsRead(String id) { - return (update(chatMessages)..where( - (m) => m.id.equals(id), - )).write(ChatMessagesCompanion(isRead: const Value(true))); - } - Future deleteMessage(String id) { return (delete(chatMessages)..where((m) => m.id.equals(id))).go(); } @@ -154,16 +161,26 @@ class AppDatabase extends _$AppDatabase { // Convert between Drift and model objects ChatMessagesCompanion messageToCompanion(LocalChatMessage message) { + final remote = message.toRemoteMessage(); return ChatMessagesCompanion( id: Value(message.id), roomId: Value(message.roomId), senderId: Value(message.senderId), - content: Value(message.toRemoteMessage().content), + content: Value(remote.content), nonce: Value(message.nonce), data: Value(jsonEncode(message.data)), createdAt: Value(message.createdAt), status: Value(message.status), - isRead: Value(message.isRead), + updatedAt: Value(remote.updatedAt), + deletedAt: Value(remote.deletedAt), + type: Value(remote.type), + meta: Value(remote.meta), + membersMentioned: Value(remote.membersMentioned), + editedAt: Value(remote.editedAt), + attachments: Value(remote.attachments.map((e) => e.toJson()).toList()), + reactions: Value(remote.reactions.map((e) => e.toJson()).toList()), + repliedMessageId: Value(remote.repliedMessageId), + forwardedMessageId: Value(remote.forwardedMessageId), ); } @@ -177,7 +194,6 @@ class AppDatabase extends _$AppDatabase { createdAt: dbMessage.createdAt, status: dbMessage.status, nonce: dbMessage.nonce, - isRead: dbMessage.isRead, ); } diff --git a/lib/database/drift_db.g.dart b/lib/database/drift_db.g.dart index 053b4a9b..7069ddad 100644 --- a/lib/database/drift_db.g.dart +++ b/lib/database/drift_db.g.dart @@ -87,19 +87,136 @@ class $ChatMessagesTable extends ChatMessages type: DriftSqlType.int, requiredDuringInsert: true, ).withConverter($ChatMessagesTable.$converterstatus); - static const VerificationMeta _isReadMeta = const VerificationMeta('isRead'); + static const VerificationMeta _isDeletedMeta = const VerificationMeta( + 'isDeleted', + ); @override - late final GeneratedColumn isRead = GeneratedColumn( - 'is_read', + late final GeneratedColumn isDeleted = GeneratedColumn( + 'is_deleted', aliasedName, - false, + true, type: DriftSqlType.bool, requiredDuringInsert: false, defaultConstraints: GeneratedColumn.constraintIsAlways( - 'CHECK ("is_read" IN (0, 1))', + 'CHECK ("is_deleted" IN (0, 1))', ), defaultValue: const Constant(false), ); + static const VerificationMeta _updatedAtMeta = const VerificationMeta( + 'updatedAt', + ); + @override + late final GeneratedColumn updatedAt = GeneratedColumn( + 'updated_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _deletedAtMeta = const VerificationMeta( + 'deletedAt', + ); + @override + late final GeneratedColumn deletedAt = GeneratedColumn( + 'deleted_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _typeMeta = const VerificationMeta('type'); + @override + late final GeneratedColumn type = GeneratedColumn( + 'type', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const Constant('text'), + ); + @override + late final GeneratedColumnWithTypeConverter, String> + meta = GeneratedColumn( + 'meta', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const Constant('{}'), + ).withConverter>($ChatMessagesTable.$convertermeta); + @override + late final GeneratedColumnWithTypeConverter, String> + membersMentioned = GeneratedColumn( + 'members_mentioned', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const Constant('[]'), + ).withConverter>($ChatMessagesTable.$convertermembersMentioned); + static const VerificationMeta _editedAtMeta = const VerificationMeta( + 'editedAt', + ); + @override + late final GeneratedColumn editedAt = GeneratedColumn( + 'edited_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + @override + late final GeneratedColumnWithTypeConverter< + List>, + String + > + attachments = GeneratedColumn( + 'attachments', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const Constant('[]'), + ).withConverter>>( + $ChatMessagesTable.$converterattachments, + ); + @override + late final GeneratedColumnWithTypeConverter< + List>, + String + > + reactions = GeneratedColumn( + 'reactions', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const Constant('[]'), + ).withConverter>>( + $ChatMessagesTable.$converterreactions, + ); + static const VerificationMeta _repliedMessageIdMeta = const VerificationMeta( + 'repliedMessageId', + ); + @override + late final GeneratedColumn repliedMessageId = GeneratedColumn( + 'replied_message_id', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _forwardedMessageIdMeta = + const VerificationMeta('forwardedMessageId'); + @override + late final GeneratedColumn forwardedMessageId = + GeneratedColumn( + 'forwarded_message_id', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); @override List get $columns => [ id, @@ -110,7 +227,17 @@ class $ChatMessagesTable extends ChatMessages data, createdAt, status, - isRead, + isDeleted, + updatedAt, + deletedAt, + type, + meta, + membersMentioned, + editedAt, + attachments, + reactions, + repliedMessageId, + forwardedMessageId, ]; @override String get aliasedName => _alias ?? actualTableName; @@ -173,10 +300,52 @@ class $ChatMessagesTable extends ChatMessages } else if (isInserting) { context.missing(_createdAtMeta); } - if (data.containsKey('is_read')) { + if (data.containsKey('is_deleted')) { context.handle( - _isReadMeta, - isRead.isAcceptableOrUnknown(data['is_read']!, _isReadMeta), + _isDeletedMeta, + isDeleted.isAcceptableOrUnknown(data['is_deleted']!, _isDeletedMeta), + ); + } + if (data.containsKey('updated_at')) { + context.handle( + _updatedAtMeta, + updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta), + ); + } + if (data.containsKey('deleted_at')) { + context.handle( + _deletedAtMeta, + deletedAt.isAcceptableOrUnknown(data['deleted_at']!, _deletedAtMeta), + ); + } + if (data.containsKey('type')) { + context.handle( + _typeMeta, + type.isAcceptableOrUnknown(data['type']!, _typeMeta), + ); + } + if (data.containsKey('edited_at')) { + context.handle( + _editedAtMeta, + editedAt.isAcceptableOrUnknown(data['edited_at']!, _editedAtMeta), + ); + } + if (data.containsKey('replied_message_id')) { + context.handle( + _repliedMessageIdMeta, + repliedMessageId.isAcceptableOrUnknown( + data['replied_message_id']!, + _repliedMessageIdMeta, + ), + ); + } + if (data.containsKey('forwarded_message_id')) { + context.handle( + _forwardedMessageIdMeta, + forwardedMessageId.isAcceptableOrUnknown( + data['forwarded_message_id']!, + _forwardedMessageIdMeta, + ), ); } return context; @@ -227,11 +396,59 @@ class $ChatMessagesTable extends ChatMessages data['${effectivePrefix}status'], )!, ), - isRead: + isDeleted: attachedDatabase.typeMapping.read( + DriftSqlType.bool, + data['${effectivePrefix}is_deleted'], + ), + updatedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}updated_at'], + ), + deletedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}deleted_at'], + ), + type: attachedDatabase.typeMapping.read( - DriftSqlType.bool, - data['${effectivePrefix}is_read'], + DriftSqlType.string, + data['${effectivePrefix}type'], )!, + meta: $ChatMessagesTable.$convertermeta.fromSql( + attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}meta'], + )!, + ), + membersMentioned: $ChatMessagesTable.$convertermembersMentioned.fromSql( + attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}members_mentioned'], + )!, + ), + editedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}edited_at'], + ), + attachments: $ChatMessagesTable.$converterattachments.fromSql( + attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}attachments'], + )!, + ), + reactions: $ChatMessagesTable.$converterreactions.fromSql( + attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}reactions'], + )!, + ), + repliedMessageId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}replied_message_id'], + ), + forwardedMessageId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}forwarded_message_id'], + ), ); } @@ -242,6 +459,14 @@ class $ChatMessagesTable extends ChatMessages static JsonTypeConverter2 $converterstatus = const EnumIndexConverter(MessageStatus.values); + static TypeConverter, String> $convertermeta = + const MapConverter(); + static TypeConverter, String> $convertermembersMentioned = + const ListStringConverter(); + static TypeConverter>, String> + $converterattachments = const ListMapConverter(); + static TypeConverter>, String> $converterreactions = + const ListMapConverter(); } class ChatMessage extends DataClass implements Insertable { @@ -253,7 +478,17 @@ class ChatMessage extends DataClass implements Insertable { final String data; final DateTime createdAt; final MessageStatus status; - final bool isRead; + final bool? isDeleted; + final DateTime? updatedAt; + final DateTime? deletedAt; + final String type; + final Map meta; + final List membersMentioned; + final DateTime? editedAt; + final List> attachments; + final List> reactions; + final String? repliedMessageId; + final String? forwardedMessageId; const ChatMessage({ required this.id, required this.roomId, @@ -263,7 +498,17 @@ class ChatMessage extends DataClass implements Insertable { required this.data, required this.createdAt, required this.status, - required this.isRead, + this.isDeleted, + this.updatedAt, + this.deletedAt, + required this.type, + required this.meta, + required this.membersMentioned, + this.editedAt, + required this.attachments, + required this.reactions, + this.repliedMessageId, + this.forwardedMessageId, }); @override Map toColumns(bool nullToAbsent) { @@ -284,7 +529,45 @@ class ChatMessage extends DataClass implements Insertable { $ChatMessagesTable.$converterstatus.toSql(status), ); } - map['is_read'] = Variable(isRead); + if (!nullToAbsent || isDeleted != null) { + map['is_deleted'] = Variable(isDeleted); + } + if (!nullToAbsent || updatedAt != null) { + map['updated_at'] = Variable(updatedAt); + } + if (!nullToAbsent || deletedAt != null) { + map['deleted_at'] = Variable(deletedAt); + } + map['type'] = Variable(type); + { + map['meta'] = Variable( + $ChatMessagesTable.$convertermeta.toSql(meta), + ); + } + { + map['members_mentioned'] = Variable( + $ChatMessagesTable.$convertermembersMentioned.toSql(membersMentioned), + ); + } + if (!nullToAbsent || editedAt != null) { + map['edited_at'] = Variable(editedAt); + } + { + map['attachments'] = Variable( + $ChatMessagesTable.$converterattachments.toSql(attachments), + ); + } + { + map['reactions'] = Variable( + $ChatMessagesTable.$converterreactions.toSql(reactions), + ); + } + if (!nullToAbsent || repliedMessageId != null) { + map['replied_message_id'] = Variable(repliedMessageId); + } + if (!nullToAbsent || forwardedMessageId != null) { + map['forwarded_message_id'] = Variable(forwardedMessageId); + } return map; } @@ -302,7 +585,35 @@ class ChatMessage extends DataClass implements Insertable { data: Value(data), createdAt: Value(createdAt), status: Value(status), - isRead: Value(isRead), + isDeleted: + isDeleted == null && nullToAbsent + ? const Value.absent() + : Value(isDeleted), + updatedAt: + updatedAt == null && nullToAbsent + ? const Value.absent() + : Value(updatedAt), + deletedAt: + deletedAt == null && nullToAbsent + ? const Value.absent() + : Value(deletedAt), + type: Value(type), + meta: Value(meta), + membersMentioned: Value(membersMentioned), + editedAt: + editedAt == null && nullToAbsent + ? const Value.absent() + : Value(editedAt), + attachments: Value(attachments), + reactions: Value(reactions), + repliedMessageId: + repliedMessageId == null && nullToAbsent + ? const Value.absent() + : Value(repliedMessageId), + forwardedMessageId: + forwardedMessageId == null && nullToAbsent + ? const Value.absent() + : Value(forwardedMessageId), ); } @@ -322,7 +633,25 @@ class ChatMessage extends DataClass implements Insertable { status: $ChatMessagesTable.$converterstatus.fromJson( serializer.fromJson(json['status']), ), - isRead: serializer.fromJson(json['isRead']), + isDeleted: serializer.fromJson(json['isDeleted']), + updatedAt: serializer.fromJson(json['updatedAt']), + deletedAt: serializer.fromJson(json['deletedAt']), + type: serializer.fromJson(json['type']), + meta: serializer.fromJson>(json['meta']), + membersMentioned: serializer.fromJson>( + json['membersMentioned'], + ), + editedAt: serializer.fromJson(json['editedAt']), + attachments: serializer.fromJson>>( + json['attachments'], + ), + reactions: serializer.fromJson>>( + json['reactions'], + ), + repliedMessageId: serializer.fromJson(json['repliedMessageId']), + forwardedMessageId: serializer.fromJson( + json['forwardedMessageId'], + ), ); } @override @@ -339,7 +668,17 @@ class ChatMessage extends DataClass implements Insertable { 'status': serializer.toJson( $ChatMessagesTable.$converterstatus.toJson(status), ), - 'isRead': serializer.toJson(isRead), + 'isDeleted': serializer.toJson(isDeleted), + 'updatedAt': serializer.toJson(updatedAt), + 'deletedAt': serializer.toJson(deletedAt), + 'type': serializer.toJson(type), + 'meta': serializer.toJson>(meta), + 'membersMentioned': serializer.toJson>(membersMentioned), + 'editedAt': serializer.toJson(editedAt), + 'attachments': serializer.toJson>>(attachments), + 'reactions': serializer.toJson>>(reactions), + 'repliedMessageId': serializer.toJson(repliedMessageId), + 'forwardedMessageId': serializer.toJson(forwardedMessageId), }; } @@ -352,7 +691,17 @@ class ChatMessage extends DataClass implements Insertable { String? data, DateTime? createdAt, MessageStatus? status, - bool? isRead, + Value isDeleted = const Value.absent(), + Value updatedAt = const Value.absent(), + Value deletedAt = const Value.absent(), + String? type, + Map? meta, + List? membersMentioned, + Value editedAt = const Value.absent(), + List>? attachments, + List>? reactions, + Value repliedMessageId = const Value.absent(), + Value forwardedMessageId = const Value.absent(), }) => ChatMessage( id: id ?? this.id, roomId: roomId ?? this.roomId, @@ -362,7 +711,23 @@ class ChatMessage extends DataClass implements Insertable { data: data ?? this.data, createdAt: createdAt ?? this.createdAt, status: status ?? this.status, - isRead: isRead ?? this.isRead, + isDeleted: isDeleted.present ? isDeleted.value : this.isDeleted, + updatedAt: updatedAt.present ? updatedAt.value : this.updatedAt, + deletedAt: deletedAt.present ? deletedAt.value : this.deletedAt, + type: type ?? this.type, + meta: meta ?? this.meta, + membersMentioned: membersMentioned ?? this.membersMentioned, + editedAt: editedAt.present ? editedAt.value : this.editedAt, + attachments: attachments ?? this.attachments, + reactions: reactions ?? this.reactions, + repliedMessageId: + repliedMessageId.present + ? repliedMessageId.value + : this.repliedMessageId, + forwardedMessageId: + forwardedMessageId.present + ? forwardedMessageId.value + : this.forwardedMessageId, ); ChatMessage copyWithCompanion(ChatMessagesCompanion data) { return ChatMessage( @@ -374,7 +739,27 @@ class ChatMessage extends DataClass implements Insertable { data: data.data.present ? data.data.value : this.data, createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, status: data.status.present ? data.status.value : this.status, - isRead: data.isRead.present ? data.isRead.value : this.isRead, + isDeleted: data.isDeleted.present ? data.isDeleted.value : this.isDeleted, + updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt, + deletedAt: data.deletedAt.present ? data.deletedAt.value : this.deletedAt, + type: data.type.present ? data.type.value : this.type, + meta: data.meta.present ? data.meta.value : this.meta, + membersMentioned: + data.membersMentioned.present + ? data.membersMentioned.value + : this.membersMentioned, + editedAt: data.editedAt.present ? data.editedAt.value : this.editedAt, + attachments: + data.attachments.present ? data.attachments.value : this.attachments, + reactions: data.reactions.present ? data.reactions.value : this.reactions, + repliedMessageId: + data.repliedMessageId.present + ? data.repliedMessageId.value + : this.repliedMessageId, + forwardedMessageId: + data.forwardedMessageId.present + ? data.forwardedMessageId.value + : this.forwardedMessageId, ); } @@ -389,7 +774,17 @@ class ChatMessage extends DataClass implements Insertable { ..write('data: $data, ') ..write('createdAt: $createdAt, ') ..write('status: $status, ') - ..write('isRead: $isRead') + ..write('isDeleted: $isDeleted, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('type: $type, ') + ..write('meta: $meta, ') + ..write('membersMentioned: $membersMentioned, ') + ..write('editedAt: $editedAt, ') + ..write('attachments: $attachments, ') + ..write('reactions: $reactions, ') + ..write('repliedMessageId: $repliedMessageId, ') + ..write('forwardedMessageId: $forwardedMessageId') ..write(')')) .toString(); } @@ -404,7 +799,17 @@ class ChatMessage extends DataClass implements Insertable { data, createdAt, status, - isRead, + isDeleted, + updatedAt, + deletedAt, + type, + meta, + membersMentioned, + editedAt, + attachments, + reactions, + repliedMessageId, + forwardedMessageId, ); @override bool operator ==(Object other) => @@ -418,7 +823,17 @@ class ChatMessage extends DataClass implements Insertable { other.data == this.data && other.createdAt == this.createdAt && other.status == this.status && - other.isRead == this.isRead); + other.isDeleted == this.isDeleted && + other.updatedAt == this.updatedAt && + other.deletedAt == this.deletedAt && + other.type == this.type && + other.meta == this.meta && + other.membersMentioned == this.membersMentioned && + other.editedAt == this.editedAt && + other.attachments == this.attachments && + other.reactions == this.reactions && + other.repliedMessageId == this.repliedMessageId && + other.forwardedMessageId == this.forwardedMessageId); } class ChatMessagesCompanion extends UpdateCompanion { @@ -430,7 +845,17 @@ class ChatMessagesCompanion extends UpdateCompanion { final Value data; final Value createdAt; final Value status; - final Value isRead; + final Value isDeleted; + final Value updatedAt; + final Value deletedAt; + final Value type; + final Value> meta; + final Value> membersMentioned; + final Value editedAt; + final Value>> attachments; + final Value>> reactions; + final Value repliedMessageId; + final Value forwardedMessageId; final Value rowid; const ChatMessagesCompanion({ this.id = const Value.absent(), @@ -441,7 +866,17 @@ class ChatMessagesCompanion extends UpdateCompanion { this.data = const Value.absent(), this.createdAt = const Value.absent(), this.status = const Value.absent(), - this.isRead = const Value.absent(), + this.isDeleted = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.type = const Value.absent(), + this.meta = const Value.absent(), + this.membersMentioned = const Value.absent(), + this.editedAt = const Value.absent(), + this.attachments = const Value.absent(), + this.reactions = const Value.absent(), + this.repliedMessageId = const Value.absent(), + this.forwardedMessageId = const Value.absent(), this.rowid = const Value.absent(), }); ChatMessagesCompanion.insert({ @@ -453,7 +888,17 @@ class ChatMessagesCompanion extends UpdateCompanion { required String data, required DateTime createdAt, required MessageStatus status, - this.isRead = const Value.absent(), + this.isDeleted = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.type = const Value.absent(), + this.meta = const Value.absent(), + this.membersMentioned = const Value.absent(), + this.editedAt = const Value.absent(), + this.attachments = const Value.absent(), + this.reactions = const Value.absent(), + this.repliedMessageId = const Value.absent(), + this.forwardedMessageId = const Value.absent(), this.rowid = const Value.absent(), }) : id = Value(id), roomId = Value(roomId), @@ -470,7 +915,17 @@ class ChatMessagesCompanion extends UpdateCompanion { Expression? data, Expression? createdAt, Expression? status, - Expression? isRead, + Expression? isDeleted, + Expression? updatedAt, + Expression? deletedAt, + Expression? type, + Expression? meta, + Expression? membersMentioned, + Expression? editedAt, + Expression? attachments, + Expression? reactions, + Expression? repliedMessageId, + Expression? forwardedMessageId, Expression? rowid, }) { return RawValuesInsertable({ @@ -482,7 +937,18 @@ class ChatMessagesCompanion extends UpdateCompanion { if (data != null) 'data': data, if (createdAt != null) 'created_at': createdAt, if (status != null) 'status': status, - if (isRead != null) 'is_read': isRead, + if (isDeleted != null) 'is_deleted': isDeleted, + if (updatedAt != null) 'updated_at': updatedAt, + if (deletedAt != null) 'deleted_at': deletedAt, + if (type != null) 'type': type, + if (meta != null) 'meta': meta, + if (membersMentioned != null) 'members_mentioned': membersMentioned, + if (editedAt != null) 'edited_at': editedAt, + if (attachments != null) 'attachments': attachments, + if (reactions != null) 'reactions': reactions, + if (repliedMessageId != null) 'replied_message_id': repliedMessageId, + if (forwardedMessageId != null) + 'forwarded_message_id': forwardedMessageId, if (rowid != null) 'rowid': rowid, }); } @@ -496,7 +962,17 @@ class ChatMessagesCompanion extends UpdateCompanion { Value? data, Value? createdAt, Value? status, - Value? isRead, + Value? isDeleted, + Value? updatedAt, + Value? deletedAt, + Value? type, + Value>? meta, + Value>? membersMentioned, + Value? editedAt, + Value>>? attachments, + Value>>? reactions, + Value? repliedMessageId, + Value? forwardedMessageId, Value? rowid, }) { return ChatMessagesCompanion( @@ -508,7 +984,17 @@ class ChatMessagesCompanion extends UpdateCompanion { data: data ?? this.data, createdAt: createdAt ?? this.createdAt, status: status ?? this.status, - isRead: isRead ?? this.isRead, + isDeleted: isDeleted ?? this.isDeleted, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt ?? this.deletedAt, + type: type ?? this.type, + meta: meta ?? this.meta, + membersMentioned: membersMentioned ?? this.membersMentioned, + editedAt: editedAt ?? this.editedAt, + attachments: attachments ?? this.attachments, + reactions: reactions ?? this.reactions, + repliedMessageId: repliedMessageId ?? this.repliedMessageId, + forwardedMessageId: forwardedMessageId ?? this.forwardedMessageId, rowid: rowid ?? this.rowid, ); } @@ -542,8 +1028,48 @@ class ChatMessagesCompanion extends UpdateCompanion { $ChatMessagesTable.$converterstatus.toSql(status.value), ); } - if (isRead.present) { - map['is_read'] = Variable(isRead.value); + if (isDeleted.present) { + map['is_deleted'] = Variable(isDeleted.value); + } + if (updatedAt.present) { + map['updated_at'] = Variable(updatedAt.value); + } + if (deletedAt.present) { + map['deleted_at'] = Variable(deletedAt.value); + } + if (type.present) { + map['type'] = Variable(type.value); + } + if (meta.present) { + map['meta'] = Variable( + $ChatMessagesTable.$convertermeta.toSql(meta.value), + ); + } + if (membersMentioned.present) { + map['members_mentioned'] = Variable( + $ChatMessagesTable.$convertermembersMentioned.toSql( + membersMentioned.value, + ), + ); + } + if (editedAt.present) { + map['edited_at'] = Variable(editedAt.value); + } + if (attachments.present) { + map['attachments'] = Variable( + $ChatMessagesTable.$converterattachments.toSql(attachments.value), + ); + } + if (reactions.present) { + map['reactions'] = Variable( + $ChatMessagesTable.$converterreactions.toSql(reactions.value), + ); + } + if (repliedMessageId.present) { + map['replied_message_id'] = Variable(repliedMessageId.value); + } + if (forwardedMessageId.present) { + map['forwarded_message_id'] = Variable(forwardedMessageId.value); } if (rowid.present) { map['rowid'] = Variable(rowid.value); @@ -562,7 +1088,17 @@ class ChatMessagesCompanion extends UpdateCompanion { ..write('data: $data, ') ..write('createdAt: $createdAt, ') ..write('status: $status, ') - ..write('isRead: $isRead, ') + ..write('isDeleted: $isDeleted, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('type: $type, ') + ..write('meta: $meta, ') + ..write('membersMentioned: $membersMentioned, ') + ..write('editedAt: $editedAt, ') + ..write('attachments: $attachments, ') + ..write('reactions: $reactions, ') + ..write('repliedMessageId: $repliedMessageId, ') + ..write('forwardedMessageId: $forwardedMessageId, ') ..write('rowid: $rowid') ..write(')')) .toString(); @@ -1118,7 +1654,17 @@ typedef $$ChatMessagesTableCreateCompanionBuilder = required String data, required DateTime createdAt, required MessageStatus status, - Value isRead, + Value isDeleted, + Value updatedAt, + Value deletedAt, + Value type, + Value> meta, + Value> membersMentioned, + Value editedAt, + Value>> attachments, + Value>> reactions, + Value repliedMessageId, + Value forwardedMessageId, Value rowid, }); typedef $$ChatMessagesTableUpdateCompanionBuilder = @@ -1131,7 +1677,17 @@ typedef $$ChatMessagesTableUpdateCompanionBuilder = Value data, Value createdAt, Value status, - Value isRead, + Value isDeleted, + Value updatedAt, + Value deletedAt, + Value type, + Value> meta, + Value> membersMentioned, + Value editedAt, + Value>> attachments, + Value>> reactions, + Value repliedMessageId, + Value forwardedMessageId, Value rowid, }); @@ -1185,8 +1741,74 @@ class $$ChatMessagesTableFilterComposer builder: (column) => ColumnWithTypeConverterFilters(column), ); - ColumnFilters get isRead => $composableBuilder( - column: $table.isRead, + ColumnFilters get isDeleted => $composableBuilder( + column: $table.isDeleted, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get deletedAt => $composableBuilder( + column: $table.deletedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get type => $composableBuilder( + column: $table.type, + builder: (column) => ColumnFilters(column), + ); + + ColumnWithTypeConverterFilters< + Map, + Map, + String + > + get meta => $composableBuilder( + column: $table.meta, + builder: (column) => ColumnWithTypeConverterFilters(column), + ); + + ColumnWithTypeConverterFilters, List, String> + get membersMentioned => $composableBuilder( + column: $table.membersMentioned, + builder: (column) => ColumnWithTypeConverterFilters(column), + ); + + ColumnFilters get editedAt => $composableBuilder( + column: $table.editedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnWithTypeConverterFilters< + List>, + List>, + String + > + get attachments => $composableBuilder( + column: $table.attachments, + builder: (column) => ColumnWithTypeConverterFilters(column), + ); + + ColumnWithTypeConverterFilters< + List>, + List>, + String + > + get reactions => $composableBuilder( + column: $table.reactions, + builder: (column) => ColumnWithTypeConverterFilters(column), + ); + + ColumnFilters get repliedMessageId => $composableBuilder( + column: $table.repliedMessageId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get forwardedMessageId => $composableBuilder( + column: $table.forwardedMessageId, builder: (column) => ColumnFilters(column), ); } @@ -1240,8 +1862,58 @@ class $$ChatMessagesTableOrderingComposer builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get isRead => $composableBuilder( - column: $table.isRead, + ColumnOrderings get isDeleted => $composableBuilder( + column: $table.isDeleted, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get deletedAt => $composableBuilder( + column: $table.deletedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get type => $composableBuilder( + column: $table.type, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get meta => $composableBuilder( + column: $table.meta, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get membersMentioned => $composableBuilder( + column: $table.membersMentioned, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get editedAt => $composableBuilder( + column: $table.editedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get attachments => $composableBuilder( + column: $table.attachments, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get reactions => $composableBuilder( + column: $table.reactions, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get repliedMessageId => $composableBuilder( + column: $table.repliedMessageId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get forwardedMessageId => $composableBuilder( + column: $table.forwardedMessageId, builder: (column) => ColumnOrderings(column), ); } @@ -1279,8 +1951,49 @@ class $$ChatMessagesTableAnnotationComposer GeneratedColumnWithTypeConverter get status => $composableBuilder(column: $table.status, builder: (column) => column); - GeneratedColumn get isRead => - $composableBuilder(column: $table.isRead, builder: (column) => column); + GeneratedColumn get isDeleted => + $composableBuilder(column: $table.isDeleted, builder: (column) => column); + + GeneratedColumn get updatedAt => + $composableBuilder(column: $table.updatedAt, builder: (column) => column); + + GeneratedColumn get deletedAt => + $composableBuilder(column: $table.deletedAt, builder: (column) => column); + + GeneratedColumn get type => + $composableBuilder(column: $table.type, builder: (column) => column); + + GeneratedColumnWithTypeConverter, String> get meta => + $composableBuilder(column: $table.meta, builder: (column) => column); + + GeneratedColumnWithTypeConverter, String> get membersMentioned => + $composableBuilder( + column: $table.membersMentioned, + builder: (column) => column, + ); + + GeneratedColumn get editedAt => + $composableBuilder(column: $table.editedAt, builder: (column) => column); + + GeneratedColumnWithTypeConverter>, String> + get attachments => $composableBuilder( + column: $table.attachments, + builder: (column) => column, + ); + + GeneratedColumnWithTypeConverter>, String> + get reactions => + $composableBuilder(column: $table.reactions, builder: (column) => column); + + GeneratedColumn get repliedMessageId => $composableBuilder( + column: $table.repliedMessageId, + builder: (column) => column, + ); + + GeneratedColumn get forwardedMessageId => $composableBuilder( + column: $table.forwardedMessageId, + builder: (column) => column, + ); } class $$ChatMessagesTableTableManager @@ -1323,7 +2036,19 @@ class $$ChatMessagesTableTableManager Value data = const Value.absent(), Value createdAt = const Value.absent(), Value status = const Value.absent(), - Value isRead = const Value.absent(), + Value isDeleted = const Value.absent(), + Value updatedAt = const Value.absent(), + Value deletedAt = const Value.absent(), + Value type = const Value.absent(), + Value> meta = const Value.absent(), + Value> membersMentioned = const Value.absent(), + Value editedAt = const Value.absent(), + Value>> attachments = + const Value.absent(), + Value>> reactions = + const Value.absent(), + Value repliedMessageId = const Value.absent(), + Value forwardedMessageId = const Value.absent(), Value rowid = const Value.absent(), }) => ChatMessagesCompanion( id: id, @@ -1334,7 +2059,17 @@ class $$ChatMessagesTableTableManager data: data, createdAt: createdAt, status: status, - isRead: isRead, + isDeleted: isDeleted, + updatedAt: updatedAt, + deletedAt: deletedAt, + type: type, + meta: meta, + membersMentioned: membersMentioned, + editedAt: editedAt, + attachments: attachments, + reactions: reactions, + repliedMessageId: repliedMessageId, + forwardedMessageId: forwardedMessageId, rowid: rowid, ), createCompanionCallback: @@ -1347,7 +2082,19 @@ class $$ChatMessagesTableTableManager required String data, required DateTime createdAt, required MessageStatus status, - Value isRead = const Value.absent(), + Value isDeleted = const Value.absent(), + Value updatedAt = const Value.absent(), + Value deletedAt = const Value.absent(), + Value type = const Value.absent(), + Value> meta = const Value.absent(), + Value> membersMentioned = const Value.absent(), + Value editedAt = const Value.absent(), + Value>> attachments = + const Value.absent(), + Value>> reactions = + const Value.absent(), + Value repliedMessageId = const Value.absent(), + Value forwardedMessageId = const Value.absent(), Value rowid = const Value.absent(), }) => ChatMessagesCompanion.insert( id: id, @@ -1358,7 +2105,17 @@ class $$ChatMessagesTableTableManager data: data, createdAt: createdAt, status: status, - isRead: isRead, + isDeleted: isDeleted, + updatedAt: updatedAt, + deletedAt: deletedAt, + type: type, + meta: meta, + membersMentioned: membersMentioned, + editedAt: editedAt, + attachments: attachments, + reactions: reactions, + repliedMessageId: repliedMessageId, + forwardedMessageId: forwardedMessageId, rowid: rowid, ), withReferenceMapper: diff --git a/lib/database/message.dart b/lib/database/message.dart index 76f7bba9..1be3457d 100644 --- a/lib/database/message.dart +++ b/lib/database/message.dart @@ -1,7 +1,41 @@ +import 'dart:convert'; + import 'package:drift/drift.dart'; import 'package:island/models/chat.dart'; import 'package:island/models/file.dart'; +class MapConverter extends TypeConverter, String> { + const MapConverter(); + + @override + Map fromSql(String fromDb) => json.decode(fromDb); + + @override + String toSql(Map value) => json.encode(value); +} + +class ListStringConverter extends TypeConverter, String> { + const ListStringConverter(); + + @override + List fromSql(String fromDb) => List.from(json.decode(fromDb)); + + @override + String toSql(List value) => json.encode(value); +} + +class ListMapConverter + extends TypeConverter>, String> { + const ListMapConverter(); + + @override + List> fromSql(String fromDb) => + List>.from(json.decode(fromDb)); + + @override + String toSql(List> value) => json.encode(value); +} + class ChatMessages extends Table { TextColumn get id => text()(); TextColumn get roomId => text()(); @@ -11,7 +45,24 @@ class ChatMessages extends Table { TextColumn get data => text()(); DateTimeColumn get createdAt => dateTime()(); IntColumn get status => intEnum()(); - BoolColumn get isRead => boolean().withDefault(const Constant(false))(); + BoolColumn get isDeleted => + boolean().nullable().withDefault(const Constant(false))(); + DateTimeColumn get updatedAt => dateTime().nullable()(); + DateTimeColumn get deletedAt => dateTime().nullable()(); + TextColumn get type => text().withDefault(const Constant('text'))(); + TextColumn get meta => + text().map(const MapConverter()).withDefault(const Constant('{}'))(); + TextColumn get membersMentioned => + text() + .map(const ListStringConverter()) + .withDefault(const Constant('[]'))(); + DateTimeColumn get editedAt => dateTime().nullable()(); + TextColumn get attachments => + text().map(const ListMapConverter()).withDefault(const Constant('[]'))(); + TextColumn get reactions => + text().map(const ListMapConverter()).withDefault(const Constant('[]'))(); + TextColumn get repliedMessageId => text().nullable()(); + TextColumn get forwardedMessageId => text().nullable()(); @override Set get primaryKey => {id}; diff --git a/lib/models/chat.dart b/lib/models/chat.dart index 9966e50a..4dac1325 100644 --- a/lib/models/chat.dart +++ b/lib/models/chat.dart @@ -40,7 +40,7 @@ sealed class SnChatMessage with _$SnChatMessage { String? content, String? nonce, @Default({}) Map meta, - @Default([]) List membersMetioned, + @Default([]) List membersMentioned, DateTime? editedAt, @Default([]) List attachments, @Default([]) List reactions, @@ -117,23 +117,10 @@ class MessageChangeAction { static const String delete = "delete"; } -@freezed -sealed class MessageChange with _$MessageChange { - const factory MessageChange({ - required String messageId, - required String action, - SnChatMessage? message, - required DateTime timestamp, - }) = _MessageChange; - - factory MessageChange.fromJson(Map json) => - _$MessageChangeFromJson(json); -} - @freezed sealed class MessageSyncResponse with _$MessageSyncResponse { const factory MessageSyncResponse({ - @Default([]) List changes, + @Default([]) List messages, required DateTime currentTimestamp, }) = _MessageSyncResponse; diff --git a/lib/models/chat.freezed.dart b/lib/models/chat.freezed.dart index 8b7fa4ca..74540e24 100644 --- a/lib/models/chat.freezed.dart +++ b/lib/models/chat.freezed.dart @@ -391,7 +391,7 @@ $SnRealmCopyWith<$Res>? get realm { /// @nodoc mixin _$SnChatMessage { - DateTime get createdAt; DateTime get updatedAt; DateTime? get deletedAt; String get id; String get type; String? get content; String? get nonce; Map get meta; List get membersMetioned; DateTime? get editedAt; List get attachments; List get reactions; String? get repliedMessageId; String? get forwardedMessageId; String get senderId; SnChatMember get sender; String get chatRoomId; + DateTime get createdAt; DateTime get updatedAt; DateTime? get deletedAt; String get id; String get type; String? get content; String? get nonce; Map get meta; List get membersMentioned; DateTime? get editedAt; List get attachments; List get reactions; String? get repliedMessageId; String? get forwardedMessageId; String get senderId; SnChatMember get sender; String get chatRoomId; /// Create a copy of SnChatMessage /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -404,16 +404,16 @@ $SnChatMessageCopyWith get copyWith => _$SnChatMessageCopyWithImp @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is SnChatMessage&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)&&(identical(other.id, id) || other.id == id)&&(identical(other.type, type) || other.type == type)&&(identical(other.content, content) || other.content == content)&&(identical(other.nonce, nonce) || other.nonce == nonce)&&const DeepCollectionEquality().equals(other.meta, meta)&&const DeepCollectionEquality().equals(other.membersMetioned, membersMetioned)&&(identical(other.editedAt, editedAt) || other.editedAt == editedAt)&&const DeepCollectionEquality().equals(other.attachments, attachments)&&const DeepCollectionEquality().equals(other.reactions, reactions)&&(identical(other.repliedMessageId, repliedMessageId) || other.repliedMessageId == repliedMessageId)&&(identical(other.forwardedMessageId, forwardedMessageId) || other.forwardedMessageId == forwardedMessageId)&&(identical(other.senderId, senderId) || other.senderId == senderId)&&(identical(other.sender, sender) || other.sender == sender)&&(identical(other.chatRoomId, chatRoomId) || other.chatRoomId == chatRoomId)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is SnChatMessage&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)&&(identical(other.id, id) || other.id == id)&&(identical(other.type, type) || other.type == type)&&(identical(other.content, content) || other.content == content)&&(identical(other.nonce, nonce) || other.nonce == nonce)&&const DeepCollectionEquality().equals(other.meta, meta)&&const DeepCollectionEquality().equals(other.membersMentioned, membersMentioned)&&(identical(other.editedAt, editedAt) || other.editedAt == editedAt)&&const DeepCollectionEquality().equals(other.attachments, attachments)&&const DeepCollectionEquality().equals(other.reactions, reactions)&&(identical(other.repliedMessageId, repliedMessageId) || other.repliedMessageId == repliedMessageId)&&(identical(other.forwardedMessageId, forwardedMessageId) || other.forwardedMessageId == forwardedMessageId)&&(identical(other.senderId, senderId) || other.senderId == senderId)&&(identical(other.sender, sender) || other.sender == sender)&&(identical(other.chatRoomId, chatRoomId) || other.chatRoomId == chatRoomId)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,createdAt,updatedAt,deletedAt,id,type,content,nonce,const DeepCollectionEquality().hash(meta),const DeepCollectionEquality().hash(membersMetioned),editedAt,const DeepCollectionEquality().hash(attachments),const DeepCollectionEquality().hash(reactions),repliedMessageId,forwardedMessageId,senderId,sender,chatRoomId); +int get hashCode => Object.hash(runtimeType,createdAt,updatedAt,deletedAt,id,type,content,nonce,const DeepCollectionEquality().hash(meta),const DeepCollectionEquality().hash(membersMentioned),editedAt,const DeepCollectionEquality().hash(attachments),const DeepCollectionEquality().hash(reactions),repliedMessageId,forwardedMessageId,senderId,sender,chatRoomId); @override String toString() { - return 'SnChatMessage(createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt, id: $id, type: $type, content: $content, nonce: $nonce, meta: $meta, membersMetioned: $membersMetioned, editedAt: $editedAt, attachments: $attachments, reactions: $reactions, repliedMessageId: $repliedMessageId, forwardedMessageId: $forwardedMessageId, senderId: $senderId, sender: $sender, chatRoomId: $chatRoomId)'; + return 'SnChatMessage(createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt, id: $id, type: $type, content: $content, nonce: $nonce, meta: $meta, membersMentioned: $membersMentioned, editedAt: $editedAt, attachments: $attachments, reactions: $reactions, repliedMessageId: $repliedMessageId, forwardedMessageId: $forwardedMessageId, senderId: $senderId, sender: $sender, chatRoomId: $chatRoomId)'; } @@ -424,7 +424,7 @@ abstract mixin class $SnChatMessageCopyWith<$Res> { factory $SnChatMessageCopyWith(SnChatMessage value, $Res Function(SnChatMessage) _then) = _$SnChatMessageCopyWithImpl; @useResult $Res call({ - DateTime createdAt, DateTime updatedAt, DateTime? deletedAt, String id, String type, String? content, String? nonce, Map meta, List membersMetioned, DateTime? editedAt, List attachments, List reactions, String? repliedMessageId, String? forwardedMessageId, String senderId, SnChatMember sender, String chatRoomId + DateTime createdAt, DateTime updatedAt, DateTime? deletedAt, String id, String type, String? content, String? nonce, Map meta, List membersMentioned, DateTime? editedAt, List attachments, List reactions, String? repliedMessageId, String? forwardedMessageId, String senderId, SnChatMember sender, String chatRoomId }); @@ -441,7 +441,7 @@ class _$SnChatMessageCopyWithImpl<$Res> /// Create a copy of SnChatMessage /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,Object? id = null,Object? type = null,Object? content = freezed,Object? nonce = freezed,Object? meta = null,Object? membersMetioned = null,Object? editedAt = freezed,Object? attachments = null,Object? reactions = null,Object? repliedMessageId = freezed,Object? forwardedMessageId = freezed,Object? senderId = null,Object? sender = null,Object? chatRoomId = null,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,Object? id = null,Object? type = null,Object? content = freezed,Object? nonce = freezed,Object? meta = null,Object? membersMentioned = null,Object? editedAt = freezed,Object? attachments = null,Object? reactions = null,Object? repliedMessageId = freezed,Object? forwardedMessageId = freezed,Object? senderId = null,Object? sender = null,Object? chatRoomId = null,}) { return _then(_self.copyWith( createdAt: null == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable as DateTime,updatedAt: null == updatedAt ? _self.updatedAt : updatedAt // ignore: cast_nullable_to_non_nullable @@ -451,7 +451,7 @@ as String,type: null == type ? _self.type : type // ignore: cast_nullable_to_non as String,content: freezed == content ? _self.content : content // ignore: cast_nullable_to_non_nullable as String?,nonce: freezed == nonce ? _self.nonce : nonce // ignore: cast_nullable_to_non_nullable as String?,meta: null == meta ? _self.meta : meta // ignore: cast_nullable_to_non_nullable -as Map,membersMetioned: null == membersMetioned ? _self.membersMetioned : membersMetioned // ignore: cast_nullable_to_non_nullable +as Map,membersMentioned: null == membersMentioned ? _self.membersMentioned : membersMentioned // ignore: cast_nullable_to_non_nullable as List,editedAt: freezed == editedAt ? _self.editedAt : editedAt // ignore: cast_nullable_to_non_nullable as DateTime?,attachments: null == attachments ? _self.attachments : attachments // ignore: cast_nullable_to_non_nullable as List,reactions: null == reactions ? _self.reactions : reactions // ignore: cast_nullable_to_non_nullable @@ -551,10 +551,10 @@ return $default(_that);case _: /// } /// ``` -@optionalTypeArgs TResult maybeWhen(TResult Function( DateTime createdAt, DateTime updatedAt, DateTime? deletedAt, String id, String type, String? content, String? nonce, Map meta, List membersMetioned, DateTime? editedAt, List attachments, List reactions, String? repliedMessageId, String? forwardedMessageId, String senderId, SnChatMember sender, String chatRoomId)? $default,{required TResult orElse(),}) {final _that = this; +@optionalTypeArgs TResult maybeWhen(TResult Function( DateTime createdAt, DateTime updatedAt, DateTime? deletedAt, String id, String type, String? content, String? nonce, Map meta, List membersMentioned, DateTime? editedAt, List attachments, List reactions, String? repliedMessageId, String? forwardedMessageId, String senderId, SnChatMember sender, String chatRoomId)? $default,{required TResult orElse(),}) {final _that = this; switch (_that) { case _SnChatMessage() when $default != null: -return $default(_that.createdAt,_that.updatedAt,_that.deletedAt,_that.id,_that.type,_that.content,_that.nonce,_that.meta,_that.membersMetioned,_that.editedAt,_that.attachments,_that.reactions,_that.repliedMessageId,_that.forwardedMessageId,_that.senderId,_that.sender,_that.chatRoomId);case _: +return $default(_that.createdAt,_that.updatedAt,_that.deletedAt,_that.id,_that.type,_that.content,_that.nonce,_that.meta,_that.membersMentioned,_that.editedAt,_that.attachments,_that.reactions,_that.repliedMessageId,_that.forwardedMessageId,_that.senderId,_that.sender,_that.chatRoomId);case _: return orElse(); } @@ -572,10 +572,10 @@ return $default(_that.createdAt,_that.updatedAt,_that.deletedAt,_that.id,_that.t /// } /// ``` -@optionalTypeArgs TResult when(TResult Function( DateTime createdAt, DateTime updatedAt, DateTime? deletedAt, String id, String type, String? content, String? nonce, Map meta, List membersMetioned, DateTime? editedAt, List attachments, List reactions, String? repliedMessageId, String? forwardedMessageId, String senderId, SnChatMember sender, String chatRoomId) $default,) {final _that = this; +@optionalTypeArgs TResult when(TResult Function( DateTime createdAt, DateTime updatedAt, DateTime? deletedAt, String id, String type, String? content, String? nonce, Map meta, List membersMentioned, DateTime? editedAt, List attachments, List reactions, String? repliedMessageId, String? forwardedMessageId, String senderId, SnChatMember sender, String chatRoomId) $default,) {final _that = this; switch (_that) { case _SnChatMessage(): -return $default(_that.createdAt,_that.updatedAt,_that.deletedAt,_that.id,_that.type,_that.content,_that.nonce,_that.meta,_that.membersMetioned,_that.editedAt,_that.attachments,_that.reactions,_that.repliedMessageId,_that.forwardedMessageId,_that.senderId,_that.sender,_that.chatRoomId);} +return $default(_that.createdAt,_that.updatedAt,_that.deletedAt,_that.id,_that.type,_that.content,_that.nonce,_that.meta,_that.membersMentioned,_that.editedAt,_that.attachments,_that.reactions,_that.repliedMessageId,_that.forwardedMessageId,_that.senderId,_that.sender,_that.chatRoomId);} } /// A variant of `when` that fallback to returning `null` /// @@ -589,10 +589,10 @@ return $default(_that.createdAt,_that.updatedAt,_that.deletedAt,_that.id,_that.t /// } /// ``` -@optionalTypeArgs TResult? whenOrNull(TResult? Function( DateTime createdAt, DateTime updatedAt, DateTime? deletedAt, String id, String type, String? content, String? nonce, Map meta, List membersMetioned, DateTime? editedAt, List attachments, List reactions, String? repliedMessageId, String? forwardedMessageId, String senderId, SnChatMember sender, String chatRoomId)? $default,) {final _that = this; +@optionalTypeArgs TResult? whenOrNull(TResult? Function( DateTime createdAt, DateTime updatedAt, DateTime? deletedAt, String id, String type, String? content, String? nonce, Map meta, List membersMentioned, DateTime? editedAt, List attachments, List reactions, String? repliedMessageId, String? forwardedMessageId, String senderId, SnChatMember sender, String chatRoomId)? $default,) {final _that = this; switch (_that) { case _SnChatMessage() when $default != null: -return $default(_that.createdAt,_that.updatedAt,_that.deletedAt,_that.id,_that.type,_that.content,_that.nonce,_that.meta,_that.membersMetioned,_that.editedAt,_that.attachments,_that.reactions,_that.repliedMessageId,_that.forwardedMessageId,_that.senderId,_that.sender,_that.chatRoomId);case _: +return $default(_that.createdAt,_that.updatedAt,_that.deletedAt,_that.id,_that.type,_that.content,_that.nonce,_that.meta,_that.membersMentioned,_that.editedAt,_that.attachments,_that.reactions,_that.repliedMessageId,_that.forwardedMessageId,_that.senderId,_that.sender,_that.chatRoomId);case _: return null; } @@ -604,7 +604,7 @@ return $default(_that.createdAt,_that.updatedAt,_that.deletedAt,_that.id,_that.t @JsonSerializable() class _SnChatMessage implements SnChatMessage { - const _SnChatMessage({required this.createdAt, required this.updatedAt, this.deletedAt, required this.id, this.type = 'text', this.content, this.nonce, final Map meta = const {}, final List membersMetioned = const [], this.editedAt, final List attachments = const [], final List reactions = const [], this.repliedMessageId, this.forwardedMessageId, required this.senderId, required this.sender, required this.chatRoomId}): _meta = meta,_membersMetioned = membersMetioned,_attachments = attachments,_reactions = reactions; + const _SnChatMessage({required this.createdAt, required this.updatedAt, this.deletedAt, required this.id, this.type = 'text', this.content, this.nonce, final Map meta = const {}, final List membersMentioned = const [], this.editedAt, final List attachments = const [], final List reactions = const [], this.repliedMessageId, this.forwardedMessageId, required this.senderId, required this.sender, required this.chatRoomId}): _meta = meta,_membersMentioned = membersMentioned,_attachments = attachments,_reactions = reactions; factory _SnChatMessage.fromJson(Map json) => _$SnChatMessageFromJson(json); @override final DateTime createdAt; @@ -621,11 +621,11 @@ class _SnChatMessage implements SnChatMessage { return EqualUnmodifiableMapView(_meta); } - final List _membersMetioned; -@override@JsonKey() List get membersMetioned { - if (_membersMetioned is EqualUnmodifiableListView) return _membersMetioned; + final List _membersMentioned; +@override@JsonKey() List get membersMentioned { + if (_membersMentioned is EqualUnmodifiableListView) return _membersMentioned; // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_membersMetioned); + return EqualUnmodifiableListView(_membersMentioned); } @override final DateTime? editedAt; @@ -662,16 +662,16 @@ Map toJson() { @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnChatMessage&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)&&(identical(other.id, id) || other.id == id)&&(identical(other.type, type) || other.type == type)&&(identical(other.content, content) || other.content == content)&&(identical(other.nonce, nonce) || other.nonce == nonce)&&const DeepCollectionEquality().equals(other._meta, _meta)&&const DeepCollectionEquality().equals(other._membersMetioned, _membersMetioned)&&(identical(other.editedAt, editedAt) || other.editedAt == editedAt)&&const DeepCollectionEquality().equals(other._attachments, _attachments)&&const DeepCollectionEquality().equals(other._reactions, _reactions)&&(identical(other.repliedMessageId, repliedMessageId) || other.repliedMessageId == repliedMessageId)&&(identical(other.forwardedMessageId, forwardedMessageId) || other.forwardedMessageId == forwardedMessageId)&&(identical(other.senderId, senderId) || other.senderId == senderId)&&(identical(other.sender, sender) || other.sender == sender)&&(identical(other.chatRoomId, chatRoomId) || other.chatRoomId == chatRoomId)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnChatMessage&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)&&(identical(other.id, id) || other.id == id)&&(identical(other.type, type) || other.type == type)&&(identical(other.content, content) || other.content == content)&&(identical(other.nonce, nonce) || other.nonce == nonce)&&const DeepCollectionEquality().equals(other._meta, _meta)&&const DeepCollectionEquality().equals(other._membersMentioned, _membersMentioned)&&(identical(other.editedAt, editedAt) || other.editedAt == editedAt)&&const DeepCollectionEquality().equals(other._attachments, _attachments)&&const DeepCollectionEquality().equals(other._reactions, _reactions)&&(identical(other.repliedMessageId, repliedMessageId) || other.repliedMessageId == repliedMessageId)&&(identical(other.forwardedMessageId, forwardedMessageId) || other.forwardedMessageId == forwardedMessageId)&&(identical(other.senderId, senderId) || other.senderId == senderId)&&(identical(other.sender, sender) || other.sender == sender)&&(identical(other.chatRoomId, chatRoomId) || other.chatRoomId == chatRoomId)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,createdAt,updatedAt,deletedAt,id,type,content,nonce,const DeepCollectionEquality().hash(_meta),const DeepCollectionEquality().hash(_membersMetioned),editedAt,const DeepCollectionEquality().hash(_attachments),const DeepCollectionEquality().hash(_reactions),repliedMessageId,forwardedMessageId,senderId,sender,chatRoomId); +int get hashCode => Object.hash(runtimeType,createdAt,updatedAt,deletedAt,id,type,content,nonce,const DeepCollectionEquality().hash(_meta),const DeepCollectionEquality().hash(_membersMentioned),editedAt,const DeepCollectionEquality().hash(_attachments),const DeepCollectionEquality().hash(_reactions),repliedMessageId,forwardedMessageId,senderId,sender,chatRoomId); @override String toString() { - return 'SnChatMessage(createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt, id: $id, type: $type, content: $content, nonce: $nonce, meta: $meta, membersMetioned: $membersMetioned, editedAt: $editedAt, attachments: $attachments, reactions: $reactions, repliedMessageId: $repliedMessageId, forwardedMessageId: $forwardedMessageId, senderId: $senderId, sender: $sender, chatRoomId: $chatRoomId)'; + return 'SnChatMessage(createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt, id: $id, type: $type, content: $content, nonce: $nonce, meta: $meta, membersMentioned: $membersMentioned, editedAt: $editedAt, attachments: $attachments, reactions: $reactions, repliedMessageId: $repliedMessageId, forwardedMessageId: $forwardedMessageId, senderId: $senderId, sender: $sender, chatRoomId: $chatRoomId)'; } @@ -682,7 +682,7 @@ abstract mixin class _$SnChatMessageCopyWith<$Res> implements $SnChatMessageCopy factory _$SnChatMessageCopyWith(_SnChatMessage value, $Res Function(_SnChatMessage) _then) = __$SnChatMessageCopyWithImpl; @override @useResult $Res call({ - DateTime createdAt, DateTime updatedAt, DateTime? deletedAt, String id, String type, String? content, String? nonce, Map meta, List membersMetioned, DateTime? editedAt, List attachments, List reactions, String? repliedMessageId, String? forwardedMessageId, String senderId, SnChatMember sender, String chatRoomId + DateTime createdAt, DateTime updatedAt, DateTime? deletedAt, String id, String type, String? content, String? nonce, Map meta, List membersMentioned, DateTime? editedAt, List attachments, List reactions, String? repliedMessageId, String? forwardedMessageId, String senderId, SnChatMember sender, String chatRoomId }); @@ -699,7 +699,7 @@ class __$SnChatMessageCopyWithImpl<$Res> /// Create a copy of SnChatMessage /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,Object? id = null,Object? type = null,Object? content = freezed,Object? nonce = freezed,Object? meta = null,Object? membersMetioned = null,Object? editedAt = freezed,Object? attachments = null,Object? reactions = null,Object? repliedMessageId = freezed,Object? forwardedMessageId = freezed,Object? senderId = null,Object? sender = null,Object? chatRoomId = null,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,Object? id = null,Object? type = null,Object? content = freezed,Object? nonce = freezed,Object? meta = null,Object? membersMentioned = null,Object? editedAt = freezed,Object? attachments = null,Object? reactions = null,Object? repliedMessageId = freezed,Object? forwardedMessageId = freezed,Object? senderId = null,Object? sender = null,Object? chatRoomId = null,}) { return _then(_SnChatMessage( createdAt: null == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable as DateTime,updatedAt: null == updatedAt ? _self.updatedAt : updatedAt // ignore: cast_nullable_to_non_nullable @@ -709,7 +709,7 @@ as String,type: null == type ? _self.type : type // ignore: cast_nullable_to_non as String,content: freezed == content ? _self.content : content // ignore: cast_nullable_to_non_nullable as String?,nonce: freezed == nonce ? _self.nonce : nonce // ignore: cast_nullable_to_non_nullable as String?,meta: null == meta ? _self._meta : meta // ignore: cast_nullable_to_non_nullable -as Map,membersMetioned: null == membersMetioned ? _self._membersMetioned : membersMetioned // ignore: cast_nullable_to_non_nullable +as Map,membersMentioned: null == membersMentioned ? _self._membersMentioned : membersMentioned // ignore: cast_nullable_to_non_nullable as List,editedAt: freezed == editedAt ? _self.editedAt : editedAt // ignore: cast_nullable_to_non_nullable as DateTime?,attachments: null == attachments ? _self._attachments : attachments // ignore: cast_nullable_to_non_nullable as List,reactions: null == reactions ? _self._reactions : reactions // ignore: cast_nullable_to_non_nullable @@ -1691,300 +1691,10 @@ $SnChatMessageCopyWith<$Res>? get lastMessage { } -/// @nodoc -mixin _$MessageChange { - - String get messageId; String get action; SnChatMessage? get message; DateTime get timestamp; -/// Create a copy of MessageChange -/// with the given fields replaced by the non-null parameter values. -@JsonKey(includeFromJson: false, includeToJson: false) -@pragma('vm:prefer-inline') -$MessageChangeCopyWith get copyWith => _$MessageChangeCopyWithImpl(this as MessageChange, _$identity); - - /// Serializes this MessageChange to a JSON map. - Map toJson(); - - -@override -bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is MessageChange&&(identical(other.messageId, messageId) || other.messageId == messageId)&&(identical(other.action, action) || other.action == action)&&(identical(other.message, message) || other.message == message)&&(identical(other.timestamp, timestamp) || other.timestamp == timestamp)); -} - -@JsonKey(includeFromJson: false, includeToJson: false) -@override -int get hashCode => Object.hash(runtimeType,messageId,action,message,timestamp); - -@override -String toString() { - return 'MessageChange(messageId: $messageId, action: $action, message: $message, timestamp: $timestamp)'; -} - - -} - -/// @nodoc -abstract mixin class $MessageChangeCopyWith<$Res> { - factory $MessageChangeCopyWith(MessageChange value, $Res Function(MessageChange) _then) = _$MessageChangeCopyWithImpl; -@useResult -$Res call({ - String messageId, String action, SnChatMessage? message, DateTime timestamp -}); - - -$SnChatMessageCopyWith<$Res>? get message; - -} -/// @nodoc -class _$MessageChangeCopyWithImpl<$Res> - implements $MessageChangeCopyWith<$Res> { - _$MessageChangeCopyWithImpl(this._self, this._then); - - final MessageChange _self; - final $Res Function(MessageChange) _then; - -/// Create a copy of MessageChange -/// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? messageId = null,Object? action = null,Object? message = freezed,Object? timestamp = null,}) { - return _then(_self.copyWith( -messageId: null == messageId ? _self.messageId : messageId // ignore: cast_nullable_to_non_nullable -as String,action: null == action ? _self.action : action // ignore: cast_nullable_to_non_nullable -as String,message: freezed == message ? _self.message : message // ignore: cast_nullable_to_non_nullable -as SnChatMessage?,timestamp: null == timestamp ? _self.timestamp : timestamp // ignore: cast_nullable_to_non_nullable -as DateTime, - )); -} -/// Create a copy of MessageChange -/// with the given fields replaced by the non-null parameter values. -@override -@pragma('vm:prefer-inline') -$SnChatMessageCopyWith<$Res>? get message { - if (_self.message == null) { - return null; - } - - return $SnChatMessageCopyWith<$Res>(_self.message!, (value) { - return _then(_self.copyWith(message: value)); - }); -} -} - - -/// Adds pattern-matching-related methods to [MessageChange]. -extension MessageChangePatterns on MessageChange { -/// A variant of `map` that fallback to returning `orElse`. -/// -/// It is equivalent to doing: -/// ```dart -/// switch (sealedClass) { -/// case final Subclass value: -/// return ...; -/// case _: -/// return orElse(); -/// } -/// ``` - -@optionalTypeArgs TResult maybeMap(TResult Function( _MessageChange value)? $default,{required TResult orElse(),}){ -final _that = this; -switch (_that) { -case _MessageChange() when $default != null: -return $default(_that);case _: - return orElse(); - -} -} -/// A `switch`-like method, using callbacks. -/// -/// Callbacks receives the raw object, upcasted. -/// It is equivalent to doing: -/// ```dart -/// switch (sealedClass) { -/// case final Subclass value: -/// return ...; -/// case final Subclass2 value: -/// return ...; -/// } -/// ``` - -@optionalTypeArgs TResult map(TResult Function( _MessageChange value) $default,){ -final _that = this; -switch (_that) { -case _MessageChange(): -return $default(_that);} -} -/// A variant of `map` that fallback to returning `null`. -/// -/// It is equivalent to doing: -/// ```dart -/// switch (sealedClass) { -/// case final Subclass value: -/// return ...; -/// case _: -/// return null; -/// } -/// ``` - -@optionalTypeArgs TResult? mapOrNull(TResult? Function( _MessageChange value)? $default,){ -final _that = this; -switch (_that) { -case _MessageChange() when $default != null: -return $default(_that);case _: - return null; - -} -} -/// A variant of `when` that fallback to an `orElse` callback. -/// -/// It is equivalent to doing: -/// ```dart -/// switch (sealedClass) { -/// case Subclass(:final field): -/// return ...; -/// case _: -/// return orElse(); -/// } -/// ``` - -@optionalTypeArgs TResult maybeWhen(TResult Function( String messageId, String action, SnChatMessage? message, DateTime timestamp)? $default,{required TResult orElse(),}) {final _that = this; -switch (_that) { -case _MessageChange() when $default != null: -return $default(_that.messageId,_that.action,_that.message,_that.timestamp);case _: - return orElse(); - -} -} -/// A `switch`-like method, using callbacks. -/// -/// As opposed to `map`, this offers destructuring. -/// It is equivalent to doing: -/// ```dart -/// switch (sealedClass) { -/// case Subclass(:final field): -/// return ...; -/// case Subclass2(:final field2): -/// return ...; -/// } -/// ``` - -@optionalTypeArgs TResult when(TResult Function( String messageId, String action, SnChatMessage? message, DateTime timestamp) $default,) {final _that = this; -switch (_that) { -case _MessageChange(): -return $default(_that.messageId,_that.action,_that.message,_that.timestamp);} -} -/// A variant of `when` that fallback to returning `null` -/// -/// It is equivalent to doing: -/// ```dart -/// switch (sealedClass) { -/// case Subclass(:final field): -/// return ...; -/// case _: -/// return null; -/// } -/// ``` - -@optionalTypeArgs TResult? whenOrNull(TResult? Function( String messageId, String action, SnChatMessage? message, DateTime timestamp)? $default,) {final _that = this; -switch (_that) { -case _MessageChange() when $default != null: -return $default(_that.messageId,_that.action,_that.message,_that.timestamp);case _: - return null; - -} -} - -} - -/// @nodoc -@JsonSerializable() - -class _MessageChange implements MessageChange { - const _MessageChange({required this.messageId, required this.action, this.message, required this.timestamp}); - factory _MessageChange.fromJson(Map json) => _$MessageChangeFromJson(json); - -@override final String messageId; -@override final String action; -@override final SnChatMessage? message; -@override final DateTime timestamp; - -/// Create a copy of MessageChange -/// with the given fields replaced by the non-null parameter values. -@override @JsonKey(includeFromJson: false, includeToJson: false) -@pragma('vm:prefer-inline') -_$MessageChangeCopyWith<_MessageChange> get copyWith => __$MessageChangeCopyWithImpl<_MessageChange>(this, _$identity); - -@override -Map toJson() { - return _$MessageChangeToJson(this, ); -} - -@override -bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _MessageChange&&(identical(other.messageId, messageId) || other.messageId == messageId)&&(identical(other.action, action) || other.action == action)&&(identical(other.message, message) || other.message == message)&&(identical(other.timestamp, timestamp) || other.timestamp == timestamp)); -} - -@JsonKey(includeFromJson: false, includeToJson: false) -@override -int get hashCode => Object.hash(runtimeType,messageId,action,message,timestamp); - -@override -String toString() { - return 'MessageChange(messageId: $messageId, action: $action, message: $message, timestamp: $timestamp)'; -} - - -} - -/// @nodoc -abstract mixin class _$MessageChangeCopyWith<$Res> implements $MessageChangeCopyWith<$Res> { - factory _$MessageChangeCopyWith(_MessageChange value, $Res Function(_MessageChange) _then) = __$MessageChangeCopyWithImpl; -@override @useResult -$Res call({ - String messageId, String action, SnChatMessage? message, DateTime timestamp -}); - - -@override $SnChatMessageCopyWith<$Res>? get message; - -} -/// @nodoc -class __$MessageChangeCopyWithImpl<$Res> - implements _$MessageChangeCopyWith<$Res> { - __$MessageChangeCopyWithImpl(this._self, this._then); - - final _MessageChange _self; - final $Res Function(_MessageChange) _then; - -/// Create a copy of MessageChange -/// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? messageId = null,Object? action = null,Object? message = freezed,Object? timestamp = null,}) { - return _then(_MessageChange( -messageId: null == messageId ? _self.messageId : messageId // ignore: cast_nullable_to_non_nullable -as String,action: null == action ? _self.action : action // ignore: cast_nullable_to_non_nullable -as String,message: freezed == message ? _self.message : message // ignore: cast_nullable_to_non_nullable -as SnChatMessage?,timestamp: null == timestamp ? _self.timestamp : timestamp // ignore: cast_nullable_to_non_nullable -as DateTime, - )); -} - -/// Create a copy of MessageChange -/// with the given fields replaced by the non-null parameter values. -@override -@pragma('vm:prefer-inline') -$SnChatMessageCopyWith<$Res>? get message { - if (_self.message == null) { - return null; - } - - return $SnChatMessageCopyWith<$Res>(_self.message!, (value) { - return _then(_self.copyWith(message: value)); - }); -} -} - - /// @nodoc mixin _$MessageSyncResponse { - List get changes; DateTime get currentTimestamp; + List get messages; DateTime get currentTimestamp; /// Create a copy of MessageSyncResponse /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -1997,16 +1707,16 @@ $MessageSyncResponseCopyWith get copyWith => _$MessageSyncR @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is MessageSyncResponse&&const DeepCollectionEquality().equals(other.changes, changes)&&(identical(other.currentTimestamp, currentTimestamp) || other.currentTimestamp == currentTimestamp)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is MessageSyncResponse&&const DeepCollectionEquality().equals(other.messages, messages)&&(identical(other.currentTimestamp, currentTimestamp) || other.currentTimestamp == currentTimestamp)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(changes),currentTimestamp); +int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(messages),currentTimestamp); @override String toString() { - return 'MessageSyncResponse(changes: $changes, currentTimestamp: $currentTimestamp)'; + return 'MessageSyncResponse(messages: $messages, currentTimestamp: $currentTimestamp)'; } @@ -2017,7 +1727,7 @@ abstract mixin class $MessageSyncResponseCopyWith<$Res> { factory $MessageSyncResponseCopyWith(MessageSyncResponse value, $Res Function(MessageSyncResponse) _then) = _$MessageSyncResponseCopyWithImpl; @useResult $Res call({ - List changes, DateTime currentTimestamp + List messages, DateTime currentTimestamp }); @@ -2034,10 +1744,10 @@ class _$MessageSyncResponseCopyWithImpl<$Res> /// Create a copy of MessageSyncResponse /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? changes = null,Object? currentTimestamp = null,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? messages = null,Object? currentTimestamp = null,}) { return _then(_self.copyWith( -changes: null == changes ? _self.changes : changes // ignore: cast_nullable_to_non_nullable -as List,currentTimestamp: null == currentTimestamp ? _self.currentTimestamp : currentTimestamp // ignore: cast_nullable_to_non_nullable +messages: null == messages ? _self.messages : messages // ignore: cast_nullable_to_non_nullable +as List,currentTimestamp: null == currentTimestamp ? _self.currentTimestamp : currentTimestamp // ignore: cast_nullable_to_non_nullable as DateTime, )); } @@ -2120,10 +1830,10 @@ return $default(_that);case _: /// } /// ``` -@optionalTypeArgs TResult maybeWhen(TResult Function( List changes, DateTime currentTimestamp)? $default,{required TResult orElse(),}) {final _that = this; +@optionalTypeArgs TResult maybeWhen(TResult Function( List messages, DateTime currentTimestamp)? $default,{required TResult orElse(),}) {final _that = this; switch (_that) { case _MessageSyncResponse() when $default != null: -return $default(_that.changes,_that.currentTimestamp);case _: +return $default(_that.messages,_that.currentTimestamp);case _: return orElse(); } @@ -2141,10 +1851,10 @@ return $default(_that.changes,_that.currentTimestamp);case _: /// } /// ``` -@optionalTypeArgs TResult when(TResult Function( List changes, DateTime currentTimestamp) $default,) {final _that = this; +@optionalTypeArgs TResult when(TResult Function( List messages, DateTime currentTimestamp) $default,) {final _that = this; switch (_that) { case _MessageSyncResponse(): -return $default(_that.changes,_that.currentTimestamp);} +return $default(_that.messages,_that.currentTimestamp);} } /// A variant of `when` that fallback to returning `null` /// @@ -2158,10 +1868,10 @@ return $default(_that.changes,_that.currentTimestamp);} /// } /// ``` -@optionalTypeArgs TResult? whenOrNull(TResult? Function( List changes, DateTime currentTimestamp)? $default,) {final _that = this; +@optionalTypeArgs TResult? whenOrNull(TResult? Function( List messages, DateTime currentTimestamp)? $default,) {final _that = this; switch (_that) { case _MessageSyncResponse() when $default != null: -return $default(_that.changes,_that.currentTimestamp);case _: +return $default(_that.messages,_that.currentTimestamp);case _: return null; } @@ -2173,14 +1883,14 @@ return $default(_that.changes,_that.currentTimestamp);case _: @JsonSerializable() class _MessageSyncResponse implements MessageSyncResponse { - const _MessageSyncResponse({final List changes = const [], required this.currentTimestamp}): _changes = changes; + const _MessageSyncResponse({final List messages = const [], required this.currentTimestamp}): _messages = messages; factory _MessageSyncResponse.fromJson(Map json) => _$MessageSyncResponseFromJson(json); - final List _changes; -@override@JsonKey() List get changes { - if (_changes is EqualUnmodifiableListView) return _changes; + final List _messages; +@override@JsonKey() List get messages { + if (_messages is EqualUnmodifiableListView) return _messages; // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_changes); + return EqualUnmodifiableListView(_messages); } @override final DateTime currentTimestamp; @@ -2198,16 +1908,16 @@ Map toJson() { @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _MessageSyncResponse&&const DeepCollectionEquality().equals(other._changes, _changes)&&(identical(other.currentTimestamp, currentTimestamp) || other.currentTimestamp == currentTimestamp)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _MessageSyncResponse&&const DeepCollectionEquality().equals(other._messages, _messages)&&(identical(other.currentTimestamp, currentTimestamp) || other.currentTimestamp == currentTimestamp)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(_changes),currentTimestamp); +int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(_messages),currentTimestamp); @override String toString() { - return 'MessageSyncResponse(changes: $changes, currentTimestamp: $currentTimestamp)'; + return 'MessageSyncResponse(messages: $messages, currentTimestamp: $currentTimestamp)'; } @@ -2218,7 +1928,7 @@ abstract mixin class _$MessageSyncResponseCopyWith<$Res> implements $MessageSync factory _$MessageSyncResponseCopyWith(_MessageSyncResponse value, $Res Function(_MessageSyncResponse) _then) = __$MessageSyncResponseCopyWithImpl; @override @useResult $Res call({ - List changes, DateTime currentTimestamp + List messages, DateTime currentTimestamp }); @@ -2235,10 +1945,10 @@ class __$MessageSyncResponseCopyWithImpl<$Res> /// Create a copy of MessageSyncResponse /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? changes = null,Object? currentTimestamp = null,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? messages = null,Object? currentTimestamp = null,}) { return _then(_MessageSyncResponse( -changes: null == changes ? _self._changes : changes // ignore: cast_nullable_to_non_nullable -as List,currentTimestamp: null == currentTimestamp ? _self.currentTimestamp : currentTimestamp // ignore: cast_nullable_to_non_nullable +messages: null == messages ? _self._messages : messages // ignore: cast_nullable_to_non_nullable +as List,currentTimestamp: null == currentTimestamp ? _self.currentTimestamp : currentTimestamp // ignore: cast_nullable_to_non_nullable as DateTime, )); } diff --git a/lib/models/chat.g.dart b/lib/models/chat.g.dart index f1dedb54..40e59081 100644 --- a/lib/models/chat.g.dart +++ b/lib/models/chat.g.dart @@ -69,8 +69,8 @@ _SnChatMessage _$SnChatMessageFromJson(Map json) => content: json['content'] as String?, nonce: json['nonce'] as String?, meta: json['meta'] as Map? ?? const {}, - membersMetioned: - (json['members_metioned'] as List?) + membersMentioned: + (json['members_mentioned'] as List?) ?.map((e) => e as String) .toList() ?? const [], @@ -105,7 +105,7 @@ Map _$SnChatMessageToJson(_SnChatMessage instance) => 'content': instance.content, 'nonce': instance.nonce, 'meta': instance.meta, - 'members_metioned': instance.membersMetioned, + 'members_mentioned': instance.membersMentioned, 'edited_at': instance.editedAt?.toIso8601String(), 'attachments': instance.attachments.map((e) => e.toJson()).toList(), 'reactions': instance.reactions.map((e) => e.toJson()).toList(), @@ -227,30 +227,11 @@ Map _$SnChatSummaryToJson(_SnChatSummary instance) => 'last_message': instance.lastMessage?.toJson(), }; -_MessageChange _$MessageChangeFromJson(Map json) => - _MessageChange( - messageId: json['message_id'] as String, - action: json['action'] as String, - message: - json['message'] == null - ? null - : SnChatMessage.fromJson(json['message'] as Map), - timestamp: DateTime.parse(json['timestamp'] as String), - ); - -Map _$MessageChangeToJson(_MessageChange instance) => - { - 'message_id': instance.messageId, - 'action': instance.action, - 'message': instance.message?.toJson(), - 'timestamp': instance.timestamp.toIso8601String(), - }; - _MessageSyncResponse _$MessageSyncResponseFromJson(Map json) => _MessageSyncResponse( - changes: - (json['changes'] as List?) - ?.map((e) => MessageChange.fromJson(e as Map)) + messages: + (json['messages'] as List?) + ?.map((e) => SnChatMessage.fromJson(e as Map)) .toList() ?? const [], currentTimestamp: DateTime.parse(json['current_timestamp'] as String), @@ -259,7 +240,7 @@ _MessageSyncResponse _$MessageSyncResponseFromJson(Map json) => Map _$MessageSyncResponseToJson( _MessageSyncResponse instance, ) => { - 'changes': instance.changes.map((e) => e.toJson()).toList(), + 'messages': instance.messages.map((e) => e.toJson()).toList(), 'current_timestamp': instance.currentTimestamp.toIso8601String(), }; diff --git a/lib/pods/activity/activity_rpc.dart b/lib/pods/activity/activity_rpc.dart index 3a98f8ed..037c9f0d 100644 --- a/lib/pods/activity/activity_rpc.dart +++ b/lib/pods/activity/activity_rpc.dart @@ -339,7 +339,9 @@ class ServerStateNotifier extends StateNotifier { state = state.copyWith(status: 'Server failed: $e'); } } else { - state = state.copyWith(status: 'Server disabled on mobile/web'); + Future(() { + state = state.copyWith(status: 'Server disabled on mobile/web'); + }); } } diff --git a/lib/screens/chat/room.dart b/lib/screens/chat/room.dart index 4eba2c06..dc8a2621 100644 --- a/lib/screens/chat/room.dart +++ b/lib/screens/chat/room.dart @@ -490,21 +490,21 @@ class MessagesNotifier extends _$MessagesNotifier { final response = MessageSyncResponse.fromJson(resp.data); developer.log( - 'Sync response: ${response.changes.length} changes', + 'Sync response: ${response.messages.length} changes', name: 'MessagesNotifier', ); - for (final change in response.changes) { - switch (change.action) { - case MessageChangeAction.create: - await receiveMessage(change.message!); + for (final message in response.messages) { + switch (message.type) { + case "messages.update": + case "messages.update.links": + await receiveMessageUpdate(message); break; - case MessageChangeAction.update: - await receiveMessageUpdate(change.message!); - break; - case MessageChangeAction.delete: - await receiveMessageDeletion(change.messageId.toString()); + case "messages.delete": + await receiveMessageDeletion(message.id.toString()); break; } + // Still need receive the message to show the history actions + await receiveMessage(message); } } catch (err, stackTrace) { developer.log( @@ -564,46 +564,46 @@ class MessagesNotifier extends _$MessagesNotifier { } } -Future loadInitial() async { - developer.log('Loading initial messages', name: 'MessagesNotifier'); - if (_searchQuery == null || _searchQuery!.isEmpty) { - syncMessages(); - } - - final messages = await _getCachedMessages(offset: 0, take: _pageSize); - - _hasMore = messages.length == _pageSize; - - state = AsyncValue.data(messages); -} - -Future loadMore() async { - if (!_hasMore || state is AsyncLoading) return; - developer.log('Loading more messages', name: 'MessagesNotifier'); - - try { - final currentMessages = state.value ?? []; - final offset = currentMessages.length; - - final newMessages = await listMessages(offset: offset, take: _pageSize); - - if (newMessages.isEmpty || newMessages.length < _pageSize) { - _hasMore = false; + Future loadInitial() async { + developer.log('Loading initial messages', name: 'MessagesNotifier'); + if (_searchQuery == null || _searchQuery!.isEmpty) { + syncMessages(); } - state = AsyncValue.data( - _sortMessages([...currentMessages, ...newMessages]), - ); - } catch (err, stackTrace) { - developer.log( - 'Error loading more messages', - name: 'MessagesNotifier', - error: err, - stackTrace: stackTrace, - ); - showErrorAlert(err); + final messages = await _getCachedMessages(offset: 0, take: _pageSize); + + _hasMore = messages.length == _pageSize; + + state = AsyncValue.data(messages); + } + + Future loadMore() async { + if (!_hasMore || state is AsyncLoading) return; + developer.log('Loading more messages', name: 'MessagesNotifier'); + + try { + final currentMessages = state.value ?? []; + final offset = currentMessages.length; + + final newMessages = await listMessages(offset: offset, take: _pageSize); + + if (newMessages.isEmpty || newMessages.length < _pageSize) { + _hasMore = false; + } + + state = AsyncValue.data( + _sortMessages([...currentMessages, ...newMessages]), + ); + } catch (err, stackTrace) { + developer.log( + 'Error loading more messages', + name: 'MessagesNotifier', + error: err, + stackTrace: stackTrace, + ); + showErrorAlert(err); + } } -} Future sendMessage( String content, diff --git a/lib/screens/chat/room.g.dart b/lib/screens/chat/room.g.dart index 7836dfdd..468eab73 100644 --- a/lib/screens/chat/room.g.dart +++ b/lib/screens/chat/room.g.dart @@ -6,7 +6,7 @@ part of 'room.dart'; // RiverpodGenerator // ************************************************************************** -String _$messagesNotifierHash() => r'82a91344328ec44dfe934c80a4a770431d864bff'; +String _$messagesNotifierHash() => r'10379c60ae46d76152f857448edef2f63d5d2dd1'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/widgets/chat/message_item.dart b/lib/widgets/chat/message_item.dart index 0bd96a90..29b323a6 100644 --- a/lib/widgets/chat/message_item.dart +++ b/lib/widgets/chat/message_item.dart @@ -546,7 +546,39 @@ class _MessageItemContent extends StatelessWidget { @override Widget build(BuildContext context) { switch (item.type) { - case 'deleted': + case 'call.start': + case 'call.ended': + return _MessageContentCall( + isEnded: item.type == 'call.ended', + duration: item.meta['duration']?.toDouble(), + ); + case 'messages.update': + case 'messages.update.links': + return Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Icon( + Symbols.edit, + size: 14, + color: Theme.of( + context, + ).colorScheme.onSurfaceVariant.withOpacity(0.6), + ), + const Gap(4), + Text( + item.content ?? 'Edited a message', + style: Theme.of(context).textTheme.bodySmall?.copyWith( + color: Theme.of( + context, + ).colorScheme.onSurfaceVariant.withOpacity(0.6), + fontStyle: FontStyle.italic, + ), + ), + ], + ); + case 'deleted': // Client side history // TODO add seprate is_deleted column to indicate it + case 'messages.delete': return Row( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.center, @@ -554,24 +586,22 @@ class _MessageItemContent extends StatelessWidget { Icon( Symbols.delete, size: 14, - color: Theme.of(context).colorScheme.onSurfaceVariant.withOpacity(0.6), + color: Theme.of( + context, + ).colorScheme.onSurfaceVariant.withOpacity(0.6), ), const Gap(4), Text( - item.content!, + item.content ?? 'Deleted a message', style: Theme.of(context).textTheme.bodySmall?.copyWith( - color: Theme.of(context).colorScheme.onSurfaceVariant.withOpacity(0.6), - fontStyle: FontStyle.italic, - ), + color: Theme.of( + context, + ).colorScheme.onSurfaceVariant.withOpacity(0.6), + fontStyle: FontStyle.italic, + ), ), ], ); - case 'call.start': - case 'call.ended': - return _MessageContentCall( - isEnded: item.type == 'call.ended', - duration: item.meta['duration']?.toDouble(), - ); case 'text': default: return Column( @@ -579,7 +609,7 @@ class _MessageItemContent extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ MarkdownTextContent( - content: item.content!, + content: item.content ?? '*${item.type} has no content*', isSelectable: true, linesMargin: EdgeInsets.zero, ),