您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
135 行
4.0 KiB
135 行
4.0 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using JetBrains.Annotations;
|
|
using UIWidgetsSample;
|
|
using Unity.UIWidgets.foundation;
|
|
|
|
namespace ChatComponents
|
|
{
|
|
public enum MessageType
|
|
{
|
|
custom,
|
|
file,
|
|
image,
|
|
text,
|
|
unsupported
|
|
}
|
|
|
|
/// Extension with one [toShortString] method
|
|
public class MessageTypeToShortString
|
|
{
|
|
/// Converts enum to the string equal to enum's name
|
|
public MessageType messageType;
|
|
|
|
private string toShortString()
|
|
{
|
|
return ToString().Split('.').last();
|
|
}
|
|
}
|
|
|
|
/// All possible statuses message can have.
|
|
public enum Status
|
|
{
|
|
delivered,
|
|
error,
|
|
seen,
|
|
sending,
|
|
sent
|
|
}
|
|
|
|
/// Extension with one [toShortString] method
|
|
public class StatusToShortString
|
|
{
|
|
public Status status;
|
|
|
|
/// Converts enum to the string equal to enum's name
|
|
private string toShortString()
|
|
{
|
|
return ToString().Split('.').last();
|
|
}
|
|
}
|
|
|
|
/// An abstract class that contains all variables and methods
|
|
/// every message will have.
|
|
public abstract class Message : Equatable
|
|
{
|
|
/// User who sent this message
|
|
public readonly User author;
|
|
|
|
/// Created message timestamp, in ms
|
|
public readonly int? createdAt;
|
|
|
|
/// Unique ID of the message
|
|
public readonly string id;
|
|
|
|
/// Additional custom metadata or attributes related to the message
|
|
public readonly Dictionary<string, object> metadata;
|
|
|
|
/// ID of the room where this message is sent
|
|
public readonly string roomId;
|
|
|
|
/// Message [Status]
|
|
public readonly Status? status;
|
|
|
|
/// [MessageType]
|
|
public readonly MessageType type;
|
|
|
|
public Message(
|
|
User author,
|
|
int? createdAt,
|
|
string id,
|
|
Dictionary<string, object> metadata,
|
|
[CanBeNull] string roomId,
|
|
Status? status,
|
|
MessageType type
|
|
)
|
|
{
|
|
this.author = author;
|
|
this.createdAt = createdAt;
|
|
this.id = id;
|
|
this.metadata = metadata;
|
|
this.roomId = roomId;
|
|
this.status = status;
|
|
this.type = type;
|
|
}
|
|
|
|
/// Creates a particular message from a map (decoded JSON).
|
|
/// Type is determined by the `type` field.
|
|
public static Message fromJson(Dictionary<string, object> json)
|
|
{
|
|
var type = json["type"] as string;
|
|
|
|
switch (type)
|
|
{
|
|
case "custom":
|
|
return CustomMessage.fromJson(json);
|
|
case "file":
|
|
return FileMessage.fromJson(json);
|
|
case "image":
|
|
return ImageMessage.fromJson(json);
|
|
case "text":
|
|
return TextMessage.fromJson(json);
|
|
default:
|
|
return UnsupportedMessage.fromJson(json);
|
|
}
|
|
}
|
|
|
|
/// Creates a copy of the 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] will be only set for the text message type.
|
|
/// [status] with null value will be overwritten by the previous status.
|
|
/// [text] will be only set for the text message type. Null value will be
|
|
/// overwritten by the previous text (can't be empty).
|
|
public abstract Message copyWith(
|
|
Dictionary<string, object> metadata = null,
|
|
[CanBeNull] PreviewData previewData = null,
|
|
Status? status = default,
|
|
string text = null
|
|
);
|
|
|
|
/// Converts a particular message to the map representation, encodable to JSON.\
|
|
public abstract Dictionary<string, object> toJson();
|
|
}
|
|
}
|