import 'package:freezed_annotation/freezed_annotation.dart'; part 'file.freezed.dart'; part 'file.g.dart'; enum UniversalFileType { image, video, audio, file } @freezed sealed class UniversalFile with _$UniversalFile { const UniversalFile._(); const factory UniversalFile({ required dynamic data, required UniversalFileType type, }) = _UniversalFile; bool get isOnCloud => data is SnCloudFile; bool get isOnDevice => !isOnCloud; factory UniversalFile.fromAttachment(SnCloudFile attachment) { return UniversalFile( data: attachment, type: switch (attachment.mimeType?.split('/').firstOrNull) { 'image' => UniversalFileType.image, 'audio' => UniversalFileType.audio, 'video' => UniversalFileType.video, _ => UniversalFileType.file, }, ); } } @freezed sealed class SnCloudFile with _$SnCloudFile { const factory SnCloudFile({ required String id, required String name, required String? description, required Map? fileMeta, required Map? userMeta, required String? mimeType, required String? hash, required int size, required DateTime? uploadedAt, required String? uploadedTo, required int usedCount, required DateTime createdAt, required DateTime updatedAt, required DateTime? deletedAt, }) = _SnCloudFile; factory SnCloudFile.fromJson(Map json) => _$SnCloudFileFromJson(json); }