feat: more implementation.
Signed-off-by: xsahil03x <[email protected]>
This commit is contained in:
@@ -499,7 +499,7 @@ class Channel {
|
||||
]);
|
||||
}
|
||||
|
||||
final isImage = it.type == 'image';
|
||||
final isImage = it.type == AttachmentType.image;
|
||||
final cancelToken = CancelToken();
|
||||
Future<SendAttachmentResponse> future;
|
||||
if (isImage) {
|
||||
|
||||
@@ -16,6 +16,7 @@ mixin AttachmentType {
|
||||
static const file = 'file';
|
||||
static const giphy = 'giphy';
|
||||
static const video = 'video';
|
||||
static const audio = 'audio';
|
||||
|
||||
/// Application custom types.
|
||||
static const urlPreview = 'url_preview';
|
||||
@@ -53,19 +54,15 @@ class Attachment extends Equatable {
|
||||
}) : id = id ?? const Uuid().v4(),
|
||||
_type = type,
|
||||
title = title ?? file?.name,
|
||||
_uploadState = uploadState,
|
||||
localUri = file?.path != null ? Uri.parse(file!.path!) : null,
|
||||
// For backwards compatibility,
|
||||
// set 'file_size', 'mime_type' in [extraData].
|
||||
extraData = {
|
||||
...extraData,
|
||||
if (file?.size != null) 'file_size': file?.size,
|
||||
if (file?.mimeType != null) 'mime_type': file?.mimeType?.mimeType,
|
||||
} {
|
||||
this.uploadState = uploadState ??
|
||||
((assetUrl != null || imageUrl != null || thumbUrl != null)
|
||||
? const UploadState.success()
|
||||
: const UploadState.preparing());
|
||||
}
|
||||
if (file?.mediaType != null) 'mime_type': file?.mediaType?.mimeType,
|
||||
};
|
||||
|
||||
/// Create a new instance from a json
|
||||
factory Attachment.fromJson(Map<String, dynamic> json) =>
|
||||
@@ -82,7 +79,8 @@ class Attachment extends Equatable {
|
||||
|
||||
factory Attachment.fromOGAttachment(OGAttachmentResponse ogAttachment) =>
|
||||
Attachment(
|
||||
type: ogAttachment.type,
|
||||
// If the type is not specified, we default to urlPreview.
|
||||
type: ogAttachment.type ?? AttachmentType.urlPreview,
|
||||
title: ogAttachment.title,
|
||||
titleLink: ogAttachment.titleLink,
|
||||
text: ogAttachment.text,
|
||||
@@ -98,7 +96,9 @@ class Attachment extends Equatable {
|
||||
///The attachment type based on the URL resource. This can be: audio,
|
||||
///image or video
|
||||
String? get type {
|
||||
if (_type == AttachmentType.image && titleLink != null) {
|
||||
// If the attachment contains titleLink but is not of type giphy, we
|
||||
// consider it as a urlPreview.
|
||||
if (_type != AttachmentType.giphy && titleLink != null) {
|
||||
return AttachmentType.urlPreview;
|
||||
}
|
||||
|
||||
@@ -107,6 +107,9 @@ class Attachment extends Equatable {
|
||||
|
||||
final String? _type;
|
||||
|
||||
/// The raw attachment type.
|
||||
String? get rawType => _type;
|
||||
|
||||
///The link to which the attachment message points to.
|
||||
final String? titleLink;
|
||||
|
||||
@@ -159,7 +162,15 @@ class Attachment extends Equatable {
|
||||
final AttachmentFile? file;
|
||||
|
||||
/// The current upload state of the attachment
|
||||
late final UploadState uploadState;
|
||||
UploadState get uploadState {
|
||||
if (_uploadState case final state?) return state;
|
||||
|
||||
return ((assetUrl != null || imageUrl != null || thumbUrl != null)
|
||||
? const UploadState.success()
|
||||
: const UploadState.preparing());
|
||||
}
|
||||
|
||||
final UploadState? _uploadState;
|
||||
|
||||
/// Map of custom channel extraData
|
||||
final Map<String, Object?> extraData;
|
||||
|
||||
@@ -62,7 +62,7 @@ class AttachmentFile {
|
||||
String? get extension => name?.split('.').last;
|
||||
|
||||
/// The mime type of this file.
|
||||
MediaType? get mimeType => name?.mimeType;
|
||||
MediaType? get mediaType => name?.mediaType;
|
||||
|
||||
/// Serialize to json
|
||||
Map<String, dynamic> toJson() => _$AttachmentFileToJson(this);
|
||||
@@ -75,13 +75,13 @@ class AttachmentFile {
|
||||
multiPartFile = MultipartFile.fromBytes(
|
||||
bytes!,
|
||||
filename: name,
|
||||
contentType: mimeType,
|
||||
contentType: mediaType,
|
||||
);
|
||||
} else {
|
||||
multiPartFile = await MultipartFile.fromFile(
|
||||
path!,
|
||||
filename: name,
|
||||
contentType: mimeType,
|
||||
contentType: mediaType,
|
||||
);
|
||||
}
|
||||
return multiPartFile;
|
||||
|
||||
@@ -20,8 +20,8 @@ extension MapX<K, V> on Map<K?, V?> {
|
||||
|
||||
/// Useful extension functions for [String]
|
||||
extension StringX on String {
|
||||
/// returns the mime type from the passed file name.
|
||||
MediaType? get mimeType {
|
||||
/// returns the media type from the passed file name.
|
||||
MediaType? get mediaType {
|
||||
if (toLowerCase().endsWith('heic')) {
|
||||
return MediaType.parse('image/heic');
|
||||
} else {
|
||||
|
||||
@@ -25,13 +25,13 @@ void main() {
|
||||
group('mimeType', () {
|
||||
test('should return null if `String` is not a filename', () {
|
||||
const fileName = 'not-a-file-name';
|
||||
final mimeType = fileName.mimeType;
|
||||
final mimeType = fileName.mediaType;
|
||||
expect(mimeType, isNull);
|
||||
});
|
||||
|
||||
test('should return mimeType if string is a filename', () {
|
||||
const fileName = 'dummyFileName.jpeg';
|
||||
final mimeType = fileName.mimeType;
|
||||
final mimeType = fileName.mediaType;
|
||||
expect(mimeType, isNotNull);
|
||||
expect(mimeType!.type, 'image');
|
||||
expect(mimeType.subtype, 'jpeg');
|
||||
@@ -39,7 +39,7 @@ void main() {
|
||||
|
||||
test('should return `image/heic` if ends with `heic`', () {
|
||||
const fileName = 'dummyFileName.heic';
|
||||
final mimeType = fileName.mimeType;
|
||||
final mimeType = fileName.mediaType;
|
||||
expect(mimeType, isNotNull);
|
||||
expect(mimeType!.type, 'image');
|
||||
expect(mimeType.subtype, 'heic');
|
||||
|
||||
Reference in New Issue
Block a user