move on with the migration

This commit is contained in:
Salvatore Giordano
2021-04-19 12:40:00 +02:00
parent 8a92392914
commit af135ecb9c
37 changed files with 653 additions and 535 deletions
@@ -6,22 +6,29 @@ part 'action.g.dart';
@JsonSerializable()
class Action {
/// Constructor used for json serialization
Action({this.name, this.style, this.text, this.type, this.value});
Action({
required this.name,
this.style = 'default',
required this.text,
required this.type,
this.value,
});
/// Create a new instance from a json
factory Action.fromJson(Map<String, dynamic> json) => _$ActionFromJson(json);
/// The name of the action
final String? name;
final String name;
/// The style of the action
final String? style;
@JsonKey(defaultValue: 'default')
final String style;
/// The test of the action
final String? text;
final String text;
/// The type of the action
final String? type;
final String type;
/// The value of the action
final String? value;
@@ -8,10 +8,10 @@ part of 'action.dart';
Action _$ActionFromJson(Map<String, dynamic> json) {
return Action(
name: json['name'] as String?,
style: json['style'] as String?,
text: json['text'] as String?,
type: json['type'] as String?,
name: json['name'] as String,
style: json['style'] as String? ?? 'default',
text: json['text'] as String,
type: json['type'] as String,
value: json['value'] as String?,
);
}
@@ -15,7 +15,7 @@ class Attachment extends Equatable {
/// Constructor used for json serialization
Attachment({
String? id,
String? type,
this.type,
this.titleLink,
String? title,
this.thumbUrl,
@@ -32,14 +32,14 @@ class Attachment extends Equatable {
this.authorLink,
this.authorIcon,
this.assetUrl,
this.actions,
List<Action>? actions,
this.extraData,
this.file,
UploadState? uploadState,
}) : id = id ?? const Uuid().v4(),
title = title ?? file?.name,
type = type ?? '',
localUri = file?.path != null ? Uri.parse(file!.path!) : null {
localUri = file?.path != null ? Uri.parse(file!.path!) : null,
actions = actions ?? [] {
this.uploadState = uploadState ??
((assetUrl != null || imageUrl != null)
? const UploadState.success()
@@ -58,7 +58,7 @@ class Attachment extends Equatable {
///The attachment type based on the URL resource. This can be: audio,
///image or video
final String type;
final String? type;
///The link to which the attachment message points to.
final String? titleLink;
@@ -98,7 +98,8 @@ class Attachment extends Equatable {
final String? assetUrl;
/// Actions from a command
final List<Action>? actions;
@JsonKey(defaultValue: [])
final List<Action> actions;
final Uri? localUri;
@@ -106,7 +107,7 @@ class Attachment extends Equatable {
final AttachmentFile? file;
/// The current upload state of the attachment
late final UploadState? uploadState;
late final UploadState uploadState;
/// Map of custom channel extraData
@JsonKey(includeIfNull: false)
@@ -149,13 +150,13 @@ class Attachment extends Equatable {
];
/// Serialize to json
Map<String, dynamic> toJson() => Serialization.moveFromExtraDataToRoot(
_$AttachmentToJson(this), topLevelFields)
..removeWhere((key, value) => dbSpecificTopLevelFields.contains(key));
Map<String, dynamic> toJson() =>
Serialization.moveFromExtraDataToRoot(_$AttachmentToJson(this))
..removeWhere((key, value) => dbSpecificTopLevelFields.contains(key));
/// Serialize to db data
Map<String, dynamic> toData() => Serialization.moveFromExtraDataToRoot(
_$AttachmentToJson(this), topLevelFields + dbSpecificTopLevelFields);
Map<String, dynamic> toData() =>
Serialization.moveFromExtraDataToRoot(_$AttachmentToJson(this));
Attachment copyWith({
String? id,
@@ -27,8 +27,9 @@ Attachment _$AttachmentFromJson(Map<String, dynamic> json) {
authorIcon: json['author_icon'] as String?,
assetUrl: json['asset_url'] as String?,
actions: (json['actions'] as List<dynamic>?)
?.map((e) => Action.fromJson(e as Map<String, dynamic>))
.toList(),
?.map((e) => Action.fromJson(e as Map<String, dynamic>))
.toList() ??
[],
extraData: json['extra_data'] as Map<String, dynamic>?,
file: json['file'] == null
? null
@@ -40,9 +41,7 @@ Attachment _$AttachmentFromJson(Map<String, dynamic> json) {
}
Map<String, dynamic> _$AttachmentToJson(Attachment instance) {
final val = <String, dynamic>{
'type': instance.type,
};
final val = <String, dynamic>{};
void writeNotNull(String key, dynamic value) {
if (value != null) {
@@ -50,6 +49,7 @@ Map<String, dynamic> _$AttachmentToJson(Attachment instance) {
}
}
writeNotNull('type', instance.type);
writeNotNull('title_link', instance.titleLink);
writeNotNull('title', instance.title);
writeNotNull('thumb_url', instance.thumbUrl);
@@ -66,9 +66,9 @@ Map<String, dynamic> _$AttachmentToJson(Attachment instance) {
writeNotNull('author_link', instance.authorLink);
writeNotNull('author_icon', instance.authorIcon);
writeNotNull('asset_url', instance.assetUrl);
writeNotNull('actions', instance.actions?.map((e) => e.toJson()).toList());
val['actions'] = instance.actions.map((e) => e.toJson()).toList();
writeNotNull('file', instance.file?.toJson());
writeNotNull('upload_state', instance.uploadState?.toJson());
val['upload_state'] = instance.uploadState.toJson();
writeNotNull('extra_data', instance.extraData);
val['id'] = instance.id;
return val;
@@ -4,7 +4,6 @@ import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:meta/meta.dart';
part 'attachment_file.freezed.dart';
part 'attachment_file.g.dart';
/// Union class to hold various [UploadState] of a attachment.
@@ -14,8 +13,10 @@ class UploadState with _$UploadState {
const factory UploadState.preparing() = Preparing;
/// InProgress state of the union
const factory UploadState.inProgress(
{required int uploaded, required int total}) = InProgress;
const factory UploadState.inProgress({
required int uploaded,
required int total,
}) = InProgress;
/// Success state of the union
const factory UploadState.success() = Success;
@@ -62,7 +63,10 @@ class AttachmentFile {
this.name,
this.bytes,
this.size,
});
}) : assert(
path != null || bytes != null,
'Either path or bytes should be != null',
);
/// Create a new instance from a json
factory AttachmentFile.fromJson(Map<String, dynamic> json) =>
@@ -1,5 +1,6 @@
import 'package:json_annotation/json_annotation.dart';
import 'package:stream_chat/src/models/command.dart';
part 'channel_config.g.dart';
/// The class that contains the information about the configuration of a channel
@@ -7,75 +8,85 @@ part 'channel_config.g.dart';
class ChannelConfig {
/// Constructor used for json serialization
ChannelConfig({
this.automod,
this.commands,
this.connectEvents,
this.createdAt,
this.updatedAt,
this.maxMessageLength,
this.messageRetention,
this.mutes,
this.name,
this.reactions,
this.readEvents,
this.replies,
this.search,
this.typingEvents,
this.uploads,
this.urlEnrichment,
});
this.automod = 'flag',
this.commands = const [],
this.connectEvents = false,
DateTime? createdAt,
DateTime? updatedAt,
this.maxMessageLength = 0,
this.messageRetention = '',
this.mutes = false,
this.reactions = false,
this.readEvents = false,
this.replies = false,
this.search = false,
this.typingEvents = false,
this.uploads = false,
this.urlEnrichment = false,
}) : createdAt = createdAt ?? DateTime.now(),
updatedAt = updatedAt ?? DateTime.now();
/// Create a new instance from a json
factory ChannelConfig.fromJson(Map<String, dynamic> json) =>
_$ChannelConfigFromJson(json);
/// Moderation configuration
final String? automod;
@JsonKey(defaultValue: 'flag')
final String automod;
/// List of available commands
final List<Command>? commands;
@JsonKey(defaultValue: [])
final List<Command> commands;
/// True if the channel should send connect events
final bool? connectEvents;
@JsonKey(defaultValue: false)
final bool connectEvents;
/// Date of channel creation
final DateTime? createdAt;
final DateTime createdAt;
/// Date of last channel update
final DateTime? updatedAt;
final DateTime updatedAt;
/// Max channel message length
final int? maxMessageLength;
@JsonKey(defaultValue: 0)
final int maxMessageLength;
/// Duration of message retention
final String? messageRetention;
@JsonKey(defaultValue: '')
final String messageRetention;
/// True if users can be muted
final bool? mutes;
/// Name of the channel
final String? name;
@JsonKey(defaultValue: false)
final bool mutes;
/// True if reaction are active for this channel
final bool? reactions;
@JsonKey(defaultValue: false)
final bool reactions;
/// True if readEvents are active for this channel
final bool? readEvents;
@JsonKey(defaultValue: false)
final bool readEvents;
/// True if reply message are active for this channel
final bool? replies;
@JsonKey(defaultValue: false)
final bool replies;
/// True if it's possible to perform a search in this channel
final bool? search;
@JsonKey(defaultValue: false)
final bool search;
/// True if typing events should be sent for this channel
final bool? typingEvents;
@JsonKey(defaultValue: false)
final bool typingEvents;
/// True if it's possible to upload files to this channel
final bool? uploads;
@JsonKey(defaultValue: false)
final bool uploads;
/// True if urls appears as attachments
final bool? urlEnrichment;
@JsonKey(defaultValue: false)
final bool urlEnrichment;
/// Serialize to json
Map<String, dynamic> toJson() => _$ChannelConfigToJson(this);
@@ -8,42 +8,41 @@ part of 'channel_config.dart';
ChannelConfig _$ChannelConfigFromJson(Map<String, dynamic> json) {
return ChannelConfig(
automod: json['automod'] as String?,
automod: json['automod'] as String? ?? 'flag',
commands: (json['commands'] as List<dynamic>?)
?.map((e) => Command.fromJson(e as Map<String, dynamic>))
.toList(),
connectEvents: json['connect_events'] as bool?,
?.map((e) => Command.fromJson(e as Map<String, dynamic>))
.toList() ??
[],
connectEvents: json['connect_events'] as bool? ?? false,
createdAt: json['created_at'] == null
? null
: DateTime.parse(json['created_at'] as String),
updatedAt: json['updated_at'] == null
? null
: DateTime.parse(json['updated_at'] as String),
maxMessageLength: json['max_message_length'] as int?,
messageRetention: json['message_retention'] as String?,
mutes: json['mutes'] as bool?,
name: json['name'] as String?,
reactions: json['reactions'] as bool?,
readEvents: json['read_events'] as bool?,
replies: json['replies'] as bool?,
search: json['search'] as bool?,
typingEvents: json['typing_events'] as bool?,
uploads: json['uploads'] as bool?,
urlEnrichment: json['url_enrichment'] as bool?,
maxMessageLength: json['max_message_length'] as int? ?? 0,
messageRetention: json['message_retention'] as String? ?? '',
mutes: json['mutes'] as bool? ?? false,
reactions: json['reactions'] as bool? ?? false,
readEvents: json['read_events'] as bool? ?? false,
replies: json['replies'] as bool? ?? false,
search: json['search'] as bool? ?? false,
typingEvents: json['typing_events'] as bool? ?? false,
uploads: json['uploads'] as bool? ?? false,
urlEnrichment: json['url_enrichment'] as bool? ?? false,
);
}
Map<String, dynamic> _$ChannelConfigToJson(ChannelConfig instance) =>
<String, dynamic>{
'automod': instance.automod,
'commands': instance.commands?.map((e) => e.toJson()).toList(),
'commands': instance.commands.map((e) => e.toJson()).toList(),
'connect_events': instance.connectEvents,
'created_at': instance.createdAt?.toIso8601String(),
'updated_at': instance.updatedAt?.toIso8601String(),
'created_at': instance.createdAt.toIso8601String(),
'updated_at': instance.updatedAt.toIso8601String(),
'max_message_length': instance.maxMessageLength,
'message_retention': instance.messageRetention,
'mutes': instance.mutes,
'name': instance.name,
'reactions': instance.reactions,
'read_events': instance.readEvents,
'replies': instance.replies,
@@ -10,9 +10,9 @@ part 'channel_model.g.dart';
class ChannelModel {
/// Constructor used for json serialization
ChannelModel({
this.id,
this.type,
this.cid = '',
String? id,
String? type,
String? cid,
ChannelConfig? config,
this.createdBy,
this.frozen = false,
@@ -25,7 +25,14 @@ class ChannelModel {
this.team,
}) : config = config ?? ChannelConfig(),
createdAt = createdAt ?? DateTime.now(),
updatedAt = updatedAt ?? DateTime.now();
updatedAt = updatedAt ?? DateTime.now(),
assert(
cid != null || (id != null && type != null),
'provide either a cid or an id and type',
),
id = id ?? cid!.split(':')[1],
type = type ?? cid!.split(':')[0],
cid = cid ?? '$type:$id';
/// Create a new instance from a json
factory ChannelModel.fromJson(Map<String, dynamic> json) =>
@@ -33,10 +40,10 @@ class ChannelModel {
Serialization.moveToExtraDataFromRoot(json, topLevelFields));
/// The id of this channel
final String? id;
final String id;
/// The type of this channel
final String? type;
final String type;
/// The cid of this channel
@JsonKey(includeIfNull: false, toJson: Serialization.readOnly)
@@ -107,7 +114,6 @@ class ChannelModel {
/// Serialize to json
Map<String, dynamic> toJson() => Serialization.moveFromExtraDataToRoot(
_$ChannelModelToJson(this),
topLevelFields,
);
/// Creates a copy of [ChannelModel] with specified attributes overridden.
@@ -10,7 +10,7 @@ ChannelModel _$ChannelModelFromJson(Map<String, dynamic> json) {
return ChannelModel(
id: json['id'] as String?,
type: json['type'] as String?,
cid: json['cid'] as String,
cid: json['cid'] as String?,
config: json['config'] == null
? null
: ChannelConfig.fromJson(json['config'] as Map<String, dynamic>),
@@ -7,9 +7,9 @@ part 'command.g.dart';
class Command {
/// Constructor used for json serialization
Command({
this.name,
this.description,
this.args,
required this.name,
required this.description,
required this.args,
});
/// Create a new instance from a json
@@ -17,13 +17,13 @@ class Command {
_$CommandFromJson(json);
/// The name of the command
final String? name;
final String name;
/// The description explaining the command
final String? description;
final String description;
/// The arguments of the command
final String? args;
final String args;
/// Serialize to json
Map<String, dynamic> toJson() => _$CommandToJson(this);
@@ -8,9 +8,9 @@ part of 'command.dart';
Command _$CommandFromJson(Map<String, dynamic> json) {
return Command(
name: json['name'] as String?,
description: json['description'] as String?,
args: json['args'] as String?,
name: json['name'] as String,
description: json['description'] as String,
args: json['args'] as String,
);
}
@@ -7,8 +7,8 @@ part 'device.g.dart';
class Device {
/// Constructor used for json serialization
Device({
this.id = '',
this.pushProvider,
required this.id,
required this.pushProvider,
});
/// Create a new instance from a json
@@ -18,7 +18,7 @@ class Device {
final String id;
/// The notification push provider
final String? pushProvider;
final String pushProvider;
/// Serialize to json
Map<String, dynamic> toJson() => _$DeviceToJson(this);
@@ -9,7 +9,7 @@ part of 'device.dart';
Device _$DeviceFromJson(Map<String, dynamic> json) {
return Device(
id: json['id'] as String,
pushProvider: json['push_provider'] as String?,
pushProvider: json['push_provider'] as String,
);
}
@@ -119,7 +119,6 @@ class Event {
/// Serialize to json
Map<String, dynamic> toJson() => Serialization.moveFromExtraDataToRoot(
_$EventToJson(this),
topLevelFields,
);
/// Creates a copy of [Event] with specified attributes overridden.
@@ -217,6 +216,5 @@ class EventChannel extends ChannelModel {
@override
Map<String, dynamic> toJson() => Serialization.moveFromExtraDataToRoot(
_$EventChannelToJson(this),
topLevelFields,
);
}
@@ -13,9 +13,9 @@ class Member {
this.inviteAcceptedAt,
this.inviteRejectedAt,
this.invited = false,
this.role = '',
this.role,
this.userId,
this.isModerator,
this.isModerator = false,
DateTime? createdAt,
DateTime? updatedAt,
this.banned = false,
@@ -45,14 +45,14 @@ class Member {
final bool invited;
/// The role of the user in the channel
@JsonKey(defaultValue: '')
final String role;
final String? role;
/// The id of the interested user
final String? userId;
/// True if the user is a moderator of the channel
final bool? isModerator;
@JsonKey(defaultValue: false)
final bool isModerator;
/// True if the member is banned from the channel
@JsonKey(defaultValue: false)
@@ -18,9 +18,9 @@ Member _$MemberFromJson(Map<String, dynamic> json) {
? null
: DateTime.parse(json['invite_rejected_at'] as String),
invited: json['invited'] as bool? ?? false,
role: json['role'] as String? ?? '',
role: json['role'] as String?,
userId: json['user_id'] as String?,
isModerator: json['is_moderator'] as bool?,
isModerator: json['is_moderator'] as bool? ?? false,
createdAt: json['created_at'] == null
? null
: DateTime.parse(json['created_at'] as String),
@@ -46,12 +46,12 @@ class Message extends Equatable {
/// Constructor used for json serialization
Message({
String? id,
this.text = '',
this.type = '',
this.attachments,
this.mentionedUsers,
this.silent,
this.shadowed,
this.text,
this.type = 'regular',
this.attachments = const [],
this.mentionedUsers = const [],
this.silent = false,
this.shadowed = false,
this.reactionCounts,
this.reactionScores,
this.latestReactions,
@@ -70,10 +70,10 @@ class Message extends Equatable {
this.pinnedAt,
DateTime? pinExpires,
this.pinnedBy,
this.extraData,
this.extraData = const {},
this.deletedAt,
this.status = MessageSendingStatus.sent,
this.skipPush,
this.skipPush = false,
}) : id = id ?? const Uuid().v4(),
pinExpires = pinExpires?.toUtc(),
createdAt = createdAt ?? DateTime.now(),
@@ -88,24 +88,34 @@ class Message extends Equatable {
final String id;
/// The text of this message
final String text;
final String? text;
/// The status of a sending message
@JsonKey(ignore: true)
final MessageSendingStatus status;
/// The message type
@JsonKey(includeIfNull: false, toJson: Serialization.readOnly)
@JsonKey(
includeIfNull: false,
toJson: Serialization.readOnly,
defaultValue: 'regular',
)
final String type;
/// The list of attachments, either provided by the user or generated from a
/// command or as a result of URL scraping.
@JsonKey(includeIfNull: false)
final List<Attachment>? attachments;
@JsonKey(
includeIfNull: false,
defaultValue: [],
)
final List<Attachment> attachments;
/// The list of user mentioned in the message
@JsonKey(toJson: Serialization.userIds)
final List<User>? mentionedUsers;
@JsonKey(
toJson: Serialization.userIds,
defaultValue: [],
)
final List<User> mentionedUsers;
/// A map describing the count of number of every reaction
@JsonKey(includeIfNull: false, toJson: Serialization.readOnly)
@@ -145,14 +155,20 @@ class Message extends Equatable {
final bool? showInChannel;
/// If true the message is silent
final bool? silent;
@JsonKey(defaultValue: false)
final bool silent;
/// If true the message will not send a push notification
final bool? skipPush;
@JsonKey(defaultValue: false)
final bool skipPush;
/// If true the message is shadowed
@JsonKey(includeIfNull: false, toJson: Serialization.readOnly)
final bool? shadowed;
@JsonKey(
includeIfNull: false,
toJson: Serialization.readOnly,
defaultValue: false,
)
final bool shadowed;
/// A used command name.
@JsonKey(includeIfNull: false, toJson: Serialization.readOnly)
@@ -171,7 +187,8 @@ class Message extends Equatable {
final User? user;
/// If true the message is pinned
final bool? pinned;
@JsonKey(defaultValue: false)
final bool pinned;
/// Reserved field indicating when the message was pinned
@JsonKey(toJson: Serialization.readOnly)
@@ -187,8 +204,11 @@ class Message extends Equatable {
final User? pinnedBy;
/// Message custom extraData
@JsonKey(includeIfNull: false)
final Map<String, dynamic>? extraData;
@JsonKey(
includeIfNull: false,
defaultValue: {},
)
final Map<String, dynamic> extraData;
/// True if the message is a system info
bool get isSystem => type == 'system';
@@ -238,7 +258,8 @@ class Message extends Equatable {
/// Serialize to json
Map<String, dynamic> toJson() => Serialization.moveFromExtraDataToRoot(
_$MessageToJson(this), topLevelFields);
_$MessageToJson(this),
);
/// Creates a copy of [Message] with specified attributes overridden.
Message copyWith({
@@ -408,6 +429,5 @@ class TranslatedMessage extends Message {
@override
Map<String, dynamic> toJson() => Serialization.moveFromExtraDataToRoot(
_$TranslatedMessageToJson(this),
topLevelFields,
);
}
@@ -9,16 +9,18 @@ part of 'message.dart';
Message _$MessageFromJson(Map<String, dynamic> json) {
return Message(
id: json['id'] as String?,
text: json['text'] as String,
type: json['type'] as String,
text: json['text'] as String?,
type: json['type'] as String? ?? 'regular',
attachments: (json['attachments'] as List<dynamic>?)
?.map((e) => Attachment.fromJson(e as Map<String, dynamic>))
.toList(),
?.map((e) => Attachment.fromJson(e as Map<String, dynamic>))
.toList() ??
[],
mentionedUsers: (json['mentioned_users'] as List<dynamic>?)
?.map((e) => User.fromJson(e as Map<String, dynamic>))
.toList(),
silent: json['silent'] as bool?,
shadowed: json['shadowed'] as bool?,
?.map((e) => User.fromJson(e as Map<String, dynamic>))
.toList() ??
[],
silent: json['silent'] as bool? ?? false,
shadowed: json['shadowed'] as bool? ?? false,
reactionCounts: (json['reaction_counts'] as Map<String, dynamic>?)?.map(
(k, e) => MapEntry(k, e as int),
),
@@ -51,7 +53,7 @@ Message _$MessageFromJson(Map<String, dynamic> json) {
user: json['user'] == null
? null
: User.fromJson(json['user'] as Map<String, dynamic>),
pinned: json['pinned'] as bool?,
pinned: json['pinned'] as bool? ?? false,
pinnedAt: json['pinned_at'] == null
? null
: DateTime.parse(json['pinned_at'] as String),
@@ -61,11 +63,11 @@ Message _$MessageFromJson(Map<String, dynamic> json) {
pinnedBy: json['pinned_by'] == null
? null
: User.fromJson(json['pinned_by'] as Map<String, dynamic>),
extraData: json['extra_data'] as Map<String, dynamic>?,
extraData: json['extra_data'] as Map<String, dynamic>? ?? {},
deletedAt: json['deleted_at'] == null
? null
: DateTime.parse(json['deleted_at'] as String),
skipPush: json['skip_push'] as bool?,
skipPush: json['skip_push'] as bool? ?? false,
);
}
@@ -82,8 +84,7 @@ Map<String, dynamic> _$MessageToJson(Message instance) {
}
writeNotNull('type', readonly(instance.type));
writeNotNull(
'attachments', instance.attachments?.map((e) => e.toJson()).toList());
val['attachments'] = instance.attachments.map((e) => e.toJson()).toList();
val['mentioned_users'] = Serialization.userIds(instance.mentionedUsers);
writeNotNull('reaction_counts', readonly(instance.reactionCounts));
writeNotNull('reaction_scores', readonly(instance.reactionScores));
@@ -106,7 +107,7 @@ Map<String, dynamic> _$MessageToJson(Message instance) {
val['pinned_at'] = readonly(instance.pinnedAt);
val['pin_expires'] = instance.pinExpires?.toIso8601String();
val['pinned_by'] = readonly(instance.pinnedBy);
writeNotNull('extra_data', instance.extraData);
val['extra_data'] = instance.extraData;
writeNotNull('deleted_at', readonly(instance.deletedAt));
return val;
}
+10 -5
View File
@@ -9,26 +9,31 @@ part 'mute.g.dart';
@JsonSerializable()
class Mute {
/// Constructor used for json serialization
Mute({this.user, this.channel, this.createdAt, this.updatedAt});
Mute({
required this.user,
required this.channel,
required this.createdAt,
required this.updatedAt,
});
/// Create a new instance from a json
factory Mute.fromJson(Map<String, dynamic> json) => _$MuteFromJson(json);
/// The user that performed the muting action
@JsonKey(includeIfNull: false, toJson: Serialization.readOnly)
final User? user;
final User user;
/// The target user
@JsonKey(includeIfNull: false, toJson: Serialization.readOnly)
final ChannelModel? channel;
final ChannelModel channel;
/// The date in which the use was muted
@JsonKey(includeIfNull: false, toJson: Serialization.readOnly)
final DateTime? createdAt;
final DateTime createdAt;
/// The date of the last update
@JsonKey(includeIfNull: false, toJson: Serialization.readOnly)
final DateTime? updatedAt;
final DateTime updatedAt;
/// Serialize to json
Map<String, dynamic> toJson() => _$MuteToJson(this);
@@ -8,18 +8,10 @@ part of 'mute.dart';
Mute _$MuteFromJson(Map<String, dynamic> json) {
return Mute(
user: json['user'] == null
? null
: User.fromJson(json['user'] as Map<String, dynamic>),
channel: json['channel'] == null
? null
: ChannelModel.fromJson(json['channel'] as Map<String, dynamic>),
createdAt: json['created_at'] == null
? null
: DateTime.parse(json['created_at'] as String),
updatedAt: json['updated_at'] == null
? null
: DateTime.parse(json['updated_at'] as String),
user: User.fromJson(json['user'] as Map<String, dynamic>),
channel: ChannelModel.fromJson(json['channel'] as Map<String, dynamic>),
createdAt: DateTime.parse(json['created_at'] as String),
updatedAt: DateTime.parse(json['updated_at'] as String),
);
}
@@ -84,5 +84,6 @@ class OwnUser extends User {
/// Serialize to json
@override
Map<String, dynamic> toJson() => Serialization.moveFromExtraDataToRoot(
_$OwnUserToJson(this), topLevelFields);
_$OwnUserToJson(this),
);
}
@@ -11,7 +11,7 @@ class Reaction {
Reaction({
this.messageId,
DateTime? createdAt,
this.type = '',
required this.type,
required this.user,
String? userId,
this.score = 0,
@@ -64,7 +64,8 @@ class Reaction {
/// Serialize to json
Map<String, dynamic> toJson() => Serialization.moveFromExtraDataToRoot(
_$ReactionToJson(this), topLevelFields);
_$ReactionToJson(this),
);
/// Creates a copy of [Reaction] with specified attributes overridden.
Reaction copyWith({
@@ -10,7 +10,7 @@ class Read {
Read({
required this.lastRead,
required this.user,
required this.unreadMessages,
this.unreadMessages = 0,
});
/// Create a new instance from a json
@@ -10,7 +10,7 @@ class Serialization {
static const Function readOnly = readonly;
/// List of users to list of userIds
static List<String?>? userIds(List<User>? users) =>
static List<String>? userIds(List<User>? users) =>
users?.map((u) => u.id).toList();
/// Takes unknown json keys and puts them in the `extra_data` key
@@ -36,7 +36,6 @@ class Serialization {
/// the json map
static Map<String, dynamic> moveFromExtraDataToRoot(
Map<String, dynamic> json,
List<String> topLevelFields,
) {
final jsonClone = Map<String, dynamic>.from(json);
return jsonClone
@@ -105,8 +105,9 @@ class User {
other is User && runtimeType == other.runtimeType && id == other.id;
/// Serialize to json
Map<String, dynamic> toJson() =>
Serialization.moveFromExtraDataToRoot(_$UserToJson(this), topLevelFields);
Map<String, dynamic> toJson() => Serialization.moveFromExtraDataToRoot(
_$UserToJson(this),
);
/// Creates a copy of [User] with specified attributes overridden.
User copyWith({