Remove flutter chat #26

Manually merged
Henry-Hiles merged 108 commits from remove-flutter-chat into main 2026-05-22 15:26:28 -04:00
7 changed files with 145 additions and 2 deletions
Showing only changes of commit 3325ebcad7 - Show all commits

implement all msgtypes

Henry Hiles 2026-05-15 20:07:08 -04:00
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs

View file

@ -6,6 +6,7 @@
"Gomuks", "Gomuks",
"Homeserver", "Homeserver",
"localpart", "localpart",
"msgtype",
"muks", "muks",
"prefs" "prefs"
] ]

View file

@ -1,14 +1,77 @@
import "package:freezed_annotation/freezed_annotation.dart"; import "package:freezed_annotation/freezed_annotation.dart";
import "package:nexus/models/info/audio.dart";
import "package:nexus/models/content/content.dart"; import "package:nexus/models/content/content.dart";
import "package:nexus/models/info/file.dart";
import "package:nexus/models/info/image.dart";
part "message.freezed.dart"; part "message.freezed.dart";
part "message.g.dart"; part "message.g.dart";
@freezed @Freezed(unionKey: "msgtype", fallbackUnion: "default")
abstract class MessageContent extends Content with _$MessageContent { abstract class MessageContent extends Content with _$MessageContent {
static const type = "m.room.message"; static const type = "m.room.message";
MessageContent._(); MessageContent._();
const factory MessageContent({required String msgtype}) = _MessageContent; const factory MessageContent({
required String msgtype,
required String body,
String? format,
String? formattedBody,
}) = _TextMessageContent;
@FreezedUnionValue("m.image")
const factory MessageContent.image({
required String msgtype,
required String body,
String? format,
String? formattedBody,
// EncryptedFile? file
String? filename,
ImageInfo? info,
String? url,
}) = _ImageMessageContent;
@FreezedUnionValue("m.file")
const factory MessageContent.file({
required String msgtype,
required String body,
String? format,
String? formattedBody,
// EncryptedFile? file
String? filename,
FileInfo? info,
String? url,
}) = _FileMessageContent;
@FreezedUnionValue("m.audio")
const factory MessageContent.audio({
required String msgtype,
required String body,
String? format,
String? formattedBody,
// EncryptedFile? file
String? filename,
AudioInfo? info,
String? url,
}) = _AudioMessageContent;
@FreezedUnionValue("m.video")
const factory MessageContent.video({
required String msgtype,
required String body,
String? format,
String? formattedBody,
// EncryptedFile? file
String? filename,
AudioInfo? info,
String? url,
}) = _AudioMessageContent;
@FreezedUnionValue("m.location")
const factory MessageContent.location({
required String msgtype,
required String body,
required Uri geoUri,
}) = _LocationMessageContent;
factory MessageContent.fromJson(Map<String, Object?> json) => factory MessageContent.fromJson(Map<String, Object?> json) =>
_$MessageContentFromJson(json); _$MessageContentFromJson(json);

View file

@ -0,0 +1,17 @@
import "package:freezed_annotation/freezed_annotation.dart";
import "package:nexus/models/ms_duration.dart";
part "audio.freezed.dart";
part "audio.g.dart";
@freezed
abstract class AudioInfo with _$AudioInfo {
/// Information for images, [size] is in bytes.
const factory AudioInfo({
@MSDuration() Duration? duration,
@JsonKey(name: "mimetype") String? mimeType,
int? size,
}) = _AudioInfo;
factory AudioInfo.fromJson(Map<String, Object?> json) =>
_$AudioInfoFromJson(json);
}

15
lib/models/info/file.dart Normal file
View file

@ -0,0 +1,15 @@
import "package:freezed_annotation/freezed_annotation.dart";
part "file.freezed.dart";
part "file.g.dart";
@freezed
abstract class FileInfo with _$FileInfo {
/// Information for images, [size] is in bytes.
const factory FileInfo({
@JsonKey(name: "mimetype") String? mimeType,
int? size,
}) = _FileInfo;
factory FileInfo.fromJson(Map<String, Object?> json) =>
_$FileInfoFromJson(json);
}

View file

@ -0,0 +1,17 @@
import "package:freezed_annotation/freezed_annotation.dart";
part "image.freezed.dart";
part "image.g.dart";
@freezed
abstract class ImageInfo with _$ImageInfo {
/// Information for images, [size] is in bytes.
const factory ImageInfo({
@JsonKey(name: "h") int? height,
@JsonKey(name: "w") int? width,
@JsonKey(name: "mimetype") String? mimeType,
int? size,
}) = _ImageInfo;
factory ImageInfo.fromJson(Map<String, Object?> json) =>
_$ImageInfoFromJson(json);
}

View file

@ -0,0 +1,19 @@
import "package:freezed_annotation/freezed_annotation.dart";
import "package:nexus/models/ms_duration.dart";
part "video.freezed.dart";
part "video.g.dart";
@freezed
abstract class VideoInfo with _$VideoInfo {
/// Information for images, [size] is in bytes.
const factory VideoInfo({
@JsonKey(name: "h") int? height,
@JsonKey(name: "w") int? width,
@JsonKey(name: "mimetype") String? mimeType,
@MSDuration() Duration? duration,
int? size,
}) = _VideoInfo;
factory VideoInfo.fromJson(Map<String, Object?> json) =>
_$VideoInfoFromJson(json);
}

View file

@ -0,0 +1,11 @@
import "package:freezed_annotation/freezed_annotation.dart";
class MSDuration implements JsonConverter<Duration, int> {
const MSDuration();
@override
Duration fromJson(int ms) => Duration(milliseconds: ms);
@override
int toJson(Duration duration) => duration.inMilliseconds;
}