fluffychat/lib/utils/file_selector.dart

81 lines
1.8 KiB
Dart
Raw Normal View History

2024-10-03 19:20:34 +00:00
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';
Future<List<XFile>> selectFiles(
BuildContext context, {
String? title,
FileSelectorType type = FileSelectorType.any,
2024-10-03 19:20:34 +00:00
bool allowMultiple = false,
}) async {
if (!PlatformInfos.isLinux) {
final result = await AppLock.of(context).pauseWhile(
FilePicker.platform.pickFiles(
compressionQuality: 0,
allowMultiple: allowMultiple,
type: type.filePickerType,
2024-10-04 15:53:56 +00:00
allowedExtensions: type.extensions,
2024-10-03 19:20:34 +00:00
),
);
return result?.xFiles ?? [];
}
if (allowMultiple) {
return await AppLock.of(context).pauseWhile(
openFiles(
confirmButtonText: title,
2024-10-04 15:53:56 +00:00
acceptedTypeGroups: type.groups,
2024-10-03 19:20:34 +00:00
),
);
}
final file = await AppLock.of(context).pauseWhile(
openFile(
confirmButtonText: title,
2024-10-04 15:53:56 +00:00
acceptedTypeGroups: type.groups,
2024-10-03 19:20:34 +00:00
),
);
if (file == null) return [];
return [file];
}
enum FileSelectorType {
2024-10-04 15:53:56 +00:00
any([], FileType.any, null),
images(
2024-10-04 15:53:56 +00:00
[
XTypeGroup(
label: 'JPG',
extensions: <String>['jpg', 'JPG', 'jpeg', 'JPEG'],
),
XTypeGroup(
label: 'PNGs',
extensions: <String>['png', 'PNG'],
),
XTypeGroup(
label: 'WEBP',
extensions: <String>['WebP', 'WEBP'],
),
],
FileType.image,
2024-10-04 15:53:56 +00:00
null,
),
2024-10-04 15:53:56 +00:00
zip(
[
XTypeGroup(
label: 'ZIP',
extensions: <String>['zip', 'ZIP'],
),
],
FileType.custom,
['zip', 'ZIP'],
);
2024-10-04 15:53:56 +00:00
const FileSelectorType(this.groups, this.filePickerType, this.extensions);
final List<XTypeGroup> groups;
final FileType filePickerType;
2024-10-04 15:53:56 +00:00
final List<String>? extensions;
}