using System.Collections.Generic; namespace ChatComponents { public class TextMessage : Message { /// See [PreviewData] public readonly PreviewData previewData; /// User"s message public readonly string text; /// Creates a text message. public TextMessage( User author, string id, int? createdAt = null, Dictionary metadata = null, string roomId = null, Status? status = default, PreviewData previewData = null, string text = null ) : base( author, createdAt, id, metadata, roomId, status, MessageType.text ) { this.previewData = previewData; this.text = text; } public override List props => new List { author, createdAt, id, metadata, previewData, roomId, status, text }; /// Creates a full text message from a partial one. private TextMessage fromPartial( User author, string id, PartialText partialText, int? createdAt = null, Dictionary metadata = null, string roomId = null, Status? status = default ) { return new TextMessage( author, createdAt: createdAt, id: id, metadata: metadata, roomId: roomId, status: status, previewData: null, text: partialText.text); } /// Creates a text message from a map (decoded JSON). private TextMessage fromJson(Dictionary json) { var test = json["size"]; return new TextMessage( User.fromJson(json["author"] as Dictionary), createdAt: json["createdAt"] as int?, id: json["id"] as string, metadata: json["metadata"] as Dictionary, roomId: json["roomId"] as string, status: ChatRoomUtils.getStatusFromString(json["status"] as string), previewData: json["previewData"] == null ? null : PreviewData.fromJson(json["previewData"] as Dictionary), text: json["text"] as string ); } public override Dictionary toJson() { return new Dictionary { {"author", author.toJson()}, {"createdAt", createdAt}, {"id", id}, {"metadata", metadata}, {"roomId", roomId}, {"previewData", previewData?.toJson()}, {"status", ChatRoomUtils.toShortString(status)}, {"type", ChatRoomUtils.toShortString(MessageType.file)}, {"text", text} }; } /// Converts a text message to the map representation, encodable to JSON. /// Creates a copy of the text message with an updated data /// [metadata] with null value will nullify existing metadata, otherwise /// both metadatas will be merged into one Map, where keys from a passed /// metadata will overwite keys from the previous one. /// [status] with null value will be overwritten by the previous status. public override Message copyWith( Dictionary metadata = null, PreviewData previewData = null, Status? status = null, string text = null ) { var result = new Dictionary(); if (this.metadata != null) foreach (var metaItem in this.metadata) result.Add(metaItem.Key, metaItem.Value); foreach (var metaItem in metadata) result.Add(metaItem.Key, metaItem.Value); return new TextMessage( author, createdAt: createdAt, id: id, metadata: metadata == null ? null : result, previewData: previewData, roomId: roomId, text: text ?? this.text, status: status ?? this.status ); } } }