pickFiles method

Future<void> pickFiles()

Implementation

Future<void> pickFiles() async {
  if (isViewScreen.value) return;

  var result = kIsWeb ? await FilePicker.platform.pickFiles(
    allowMultiple: true,
    withData: true,
  ) : await FilePicker.platform.pickFiles(
    allowMultiple: true,
    withData: false,
  );

  if (result == null || result.files.isEmpty) return;

  const int maxFileSize = 50 * 1024 * 1024;

  final validFiles = <PlatformFile>[];
  final skippedFiles = <String>[];

  for (var file in result.files) {
    if (file.size <= maxFileSize) {
      validFiles.add(file);
    } else {
      skippedFiles.add(file.name);
    }
  }

  if (skippedFiles.isNotEmpty) {
    AppUtils.showSnackBar(
      'This file exceed 50MB and were not uploaded: ${skippedFiles.join(", ")}',
    );
  }

  if (validFiles.isEmpty) {
    uploadStatus.value = 'All files are too large.';
    return;
  }

  int totalSize = validFiles.fold(0, (sum, file) => sum + file.size);

  if (totalSize > maxFileSize) {
    AppUtils.showSnackBar(
      'Total file size exceeds 50MB. Please select fewer files.',
    );
    return;
  }

  isLoading.value = true;
  uploadStatus.value = 'Uploading...';

  try {
    List fileData;

    if (kIsWeb) {
      fileData = validFiles.map((f) => f.bytes!).toList();
    } else {
      fileData = validFiles.map((f) => f.path!).toList();
    }
    final fileNames = validFiles.map((f) => f.name).toList();

    var response = await apiService.uploadFileList(
      fileData,
      fileNames,
      {
        'createdBy': context.createdBy,
        'FileTypeId': context.fileTypeId,
        'moduleId': context.moduleId,
      },
    );

    if (response.statusCode == 200) {
      List<dynamic> uploadedData = response.data['data']['Result'];

      for (var item in uploadedData) {
        files.add(
          AddonsFunDetails(
            createdBy: context.createdBy,
            funRefVal: item['Path'].toString(),
            isActive: 1,
            addOnType: 'Files',
          ),
        );
      }

      uploadStatus.value = 'Upload successful';
    } else {
      uploadStatus.value = 'Upload failed';
    }
  } catch (e) {
    uploadStatus.value = 'Error: $e';
  } finally {
    isLoading.value = false;
  }
}