import 'package:freezed_annotation/freezed_annotation.dart'; part 'file.freezed.dart'; part 'file.g.dart'; enum UniversalFileType { image, video, audio, file } @freezed abstract 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 abstract 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); }