using System; using System.Collections.Generic; namespace ChatComponents { public class FileMessage : Message { /// Creates a custom message. public readonly string mimeType; public readonly string name; public readonly int size; public readonly string uri; public FileMessage( User author, string id, string name, int size, string uri, int? createdAt = null, Dictionary metadata = null, string mimeType = null, string roomId = null, Status? status = default ) : base( author, createdAt, id, metadata, roomId, status, MessageType.file ) { this.name = name; this.size = size; this.uri = uri; this.mimeType = mimeType; } public override List props => new List { author, createdAt, id, metadata, mimeType, name, roomId, size, status, uri, }; public FileMessage fromPartial( User author, string id, PartialFile partialFile, int? createdAt = null, Dictionary metadata = null, string roomId = null, Status? status = default ) { return new FileMessage( author : author, createdAt:createdAt, id:id, metadata:metadata, roomId:roomId, status:status, mimeType : partialFile.mimeType, name : partialFile.name, size : partialFile.size, uri : partialFile.uri ); } /// Creates a custom message from a map (decoded JSON). public static FileMessage fromJson(Dictionary json) { var test = json["size"]; return new FileMessage( 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), mimeType : json["mimeType"] as string, name : json["name"] as string, size : Convert.ToInt32(json["size"]) , uri : json["uri"] as string ); } /// Converts a custom message to the map representation, /// encodable to JSON. public override Dictionary toJson() { return new Dictionary { {"author", author.toJson()}, {"createdAt", createdAt}, {"id", id}, {"metadata", metadata}, {"mimeType", mimeType}, {"name", name}, {"roomId", roomId}, {"size", size}, {"status", ChatRoomUtils.toShortString(status)}, {"type", ChatRoomUtils.toShortString(MessageType.file)}, {"uri", uri} }; } /// Creates a copy of the custom 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. /// [previewData] is ignored for this message type. /// [status] with null value will be overwritten by the previous status. /// [text] is ignored for this message type. 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 FileMessage( author: author, createdAt: createdAt, id: id, metadata: metadata == null ? null : result, mimeType: mimeType, name: name, roomId: roomId, size: size, status: status ?? this.status, uri: uri ); } /// Equatable props } }