import 'package:flutter/widgets.dart'; import 'package:file_picker/file_picker.dart'; import 'package:file_selector/file_selector.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/widgets/app_lock.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; Future> selectFiles( BuildContext context, { String? title, FileSelectorType type = FileSelectorType.any, bool allowMultiple = false, }) async { if (!PlatformInfos.isLinux) { final result = await AppLock.of(context).pauseWhile( showFutureLoadingDialog( context: context, future: () => FilePicker.platform.pickFiles( compressionQuality: 0, allowMultiple: allowMultiple, type: type.filePickerType, allowedExtensions: type.extensions, ), ), ); return result.result?.xFiles ?? []; } if (allowMultiple) { return await AppLock.of(context).pauseWhile( openFiles( confirmButtonText: title, acceptedTypeGroups: type.groups, ), ); } final file = await AppLock.of(context).pauseWhile( openFile( confirmButtonText: title, acceptedTypeGroups: type.groups, ), ); if (file == null) return []; return [file]; } enum FileSelectorType { any([], FileType.any, null), images( [ XTypeGroup( label: 'JPG', extensions: ['jpg', 'JPG', 'jpeg', 'JPEG'], ), XTypeGroup( label: 'PNGs', extensions: ['png', 'PNG'], ), XTypeGroup( label: 'WEBP', extensions: ['WebP', 'WEBP'], ), XTypeGroup( label: 'GIF', extensions: ['gif', 'GIF'], ), XTypeGroup( label: 'BMP', extensions: ['bmp', 'BMP'], ), XTypeGroup( label: 'TIFF', extensions: ['tiff', 'TIFF', 'tif', 'TIF'], ), XTypeGroup( label: 'HEIC', extensions: ['heic', 'HEIC'], ), XTypeGroup( label: 'SVG', extensions: ['svg', 'SVG'], ), ], FileType.image, null, ), videos( [ XTypeGroup( label: 'MP4', extensions: ['mp4', 'MP4'], ), XTypeGroup( label: 'AVI', extensions: ['avi', 'AVI'], ), XTypeGroup( label: 'MOV', extensions: ['mov', 'MOV'], ), XTypeGroup( label: 'MKV', extensions: ['mkv', 'MKV'], ), XTypeGroup( label: 'WMV', extensions: ['wmv', 'WMV'], ), XTypeGroup( label: 'FLV', extensions: ['flv', 'FLV'], ), XTypeGroup( label: 'MPEG', extensions: ['mpeg', 'MPEG'], ), XTypeGroup( label: '3GP', extensions: ['3gp', '3GP'], ), XTypeGroup( label: 'OGG', extensions: ['ogg', 'OGG'], ), ], FileType.video, null, ), zip( [ XTypeGroup( label: 'ZIP', extensions: ['zip', 'ZIP'], ), ], FileType.custom, ['zip', 'ZIP'], ); const FileSelectorType(this.groups, this.filePickerType, this.extensions); final List groups; final FileType filePickerType; final List? extensions; }