You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			232 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			Dart
		
	
			
		
		
	
	
			232 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			Dart
		
	
import 'dart:convert';
 | 
						|
import 'dart:io';
 | 
						|
 | 
						|
import 'package:file_picker/file_picker.dart';
 | 
						|
import 'package:flutter/material.dart';
 | 
						|
import 'package:image_picker/image_picker.dart';
 | 
						|
import 'package:mohem_flutter_app/classes/colors.dart';
 | 
						|
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
 | 
						|
import 'package:mohem_flutter_app/widgets/bottom_sheet.dart';
 | 
						|
import 'package:mohem_flutter_app/widgets/bottom_sheets/attachment_options.dart';
 | 
						|
import 'package:mohem_flutter_app/widgets/dialogs/confirm_dialog.dart';
 | 
						|
import 'package:permission_handler/permission_handler.dart';
 | 
						|
 | 
						|
class ImageOptions {
 | 
						|
  static void showImageOptionsNew(BuildContext context, bool showFilesOption, Function(String, File) image) {
 | 
						|
    showMyBottomSheet(
 | 
						|
      context,
 | 
						|
      callBackFunc: () {},
 | 
						|
      child: AttachmentOptions(
 | 
						|
        showFilesOption: showFilesOption,
 | 
						|
        onCameraTap: () async {
 | 
						|
          if (Platform.isAndroid) {
 | 
						|
            cameraImageAndroid(image);
 | 
						|
          } else {
 | 
						|
            File _image = File((await ImagePicker.platform.pickImage(source: ImageSource.camera, imageQuality: 20))?.path ?? "");
 | 
						|
            String fileName = _image.path;
 | 
						|
            var bytes = File(fileName).readAsBytesSync();
 | 
						|
            String base64Encode = base64.encode(bytes);
 | 
						|
            if (base64Encode != null) {
 | 
						|
              image(base64Encode, _image);
 | 
						|
            }
 | 
						|
          }
 | 
						|
        },
 | 
						|
        onGalleryTap: () async {
 | 
						|
          if (Platform.isAndroid) {
 | 
						|
            galleryImageAndroid(image);
 | 
						|
          } else {
 | 
						|
            File _image = File((await ImagePicker.platform.pickImage(source: ImageSource.gallery, imageQuality: 20))?.path ?? "");
 | 
						|
            String fileName = _image.path;
 | 
						|
            var bytes = File(fileName).readAsBytesSync();
 | 
						|
            String base64Encode = base64.encode(bytes);
 | 
						|
            if (base64Encode != null) {
 | 
						|
              image(base64Encode, _image);
 | 
						|
            }
 | 
						|
          }
 | 
						|
        },
 | 
						|
        onFilesTap: () async {
 | 
						|
          Permission.storage.isGranted.then((isGranted) {
 | 
						|
            if (!isGranted) {
 | 
						|
              Permission.manageExternalStorage.request().then((granted) async {
 | 
						|
                if (granted == PermissionStatus.granted) {
 | 
						|
                  FilePickerResult? result = await FilePicker.platform.pickFiles(
 | 
						|
                    type: FileType.custom,
 | 
						|
                    allowedExtensions: [
 | 
						|
                      'jpg',
 | 
						|
                      'jpeg ',
 | 
						|
                      'pdf',
 | 
						|
                      'txt',
 | 
						|
                      'docx',
 | 
						|
                      'doc',
 | 
						|
                      'pptx',
 | 
						|
                      'xlsx',
 | 
						|
                      'png',
 | 
						|
                      'rar',
 | 
						|
                      'zip',
 | 
						|
                    ],
 | 
						|
                  );
 | 
						|
                  List<File> files = result!.paths.map((path) => File(path!)).toList();
 | 
						|
                  image(result.files.first.path.toString(), files.first);
 | 
						|
                } else {
 | 
						|
                  showDialog(
 | 
						|
                    context: context,
 | 
						|
                    builder: (BuildContext cxt) => ConfirmDialog(
 | 
						|
                      message: "You need to give storage permission to upload files.",
 | 
						|
                      onTap: () {
 | 
						|
                        Navigator.pop(context);
 | 
						|
                      },
 | 
						|
                    ),
 | 
						|
                  );
 | 
						|
                }
 | 
						|
              });
 | 
						|
            }
 | 
						|
          });
 | 
						|
        },
 | 
						|
      ),
 | 
						|
    );
 | 
						|
  }
 | 
						|
 | 
						|
// static void showImageOptions(BuildContext context, Function(String, File) image) {
 | 
						|
//   showModalBottomSheet(
 | 
						|
//       backgroundColor: Colors.transparent,
 | 
						|
//       context: context,
 | 
						|
//       builder: (BuildContext bc) {
 | 
						|
//         return _BottomSheet(
 | 
						|
//           children: <Widget>[
 | 
						|
//             _BottomSheetItem(
 | 
						|
//               title: "Select File Source",
 | 
						|
//               onTap: () {},
 | 
						|
//               icon: Icons.file_present,
 | 
						|
//               color: MyColors.black,
 | 
						|
//             ),
 | 
						|
//             _BottomSheetItem(
 | 
						|
//               title: "Gallery",
 | 
						|
//               icon: Icons.image,
 | 
						|
//               onTap: () async {
 | 
						|
//                 if (Platform.isAndroid) {
 | 
						|
//                   galleryImageAndroid(image);
 | 
						|
//                 } else {
 | 
						|
//                   File _image = File((await ImagePicker.platform.pickImage(source: ImageSource.gallery, imageQuality: 10))?.path ?? "");
 | 
						|
//                   String fileName = _image.path;
 | 
						|
//                   var bytes = File(fileName).readAsBytesSync();
 | 
						|
//                   String base64Encode = base64.encode(bytes);
 | 
						|
//                   if (base64Encode != null) {
 | 
						|
//                     image(base64Encode, _image);
 | 
						|
//                   }
 | 
						|
//                 }
 | 
						|
//               },
 | 
						|
//             ),
 | 
						|
//             _BottomSheetItem(
 | 
						|
//               title: "Camera",
 | 
						|
//               icon: Icons.camera_alt,
 | 
						|
//               onTap: () async {
 | 
						|
//                 if (Platform.isAndroid) {
 | 
						|
//                   cameraImageAndroid(image);
 | 
						|
//                 } else {
 | 
						|
//                   File _image = File((await ImagePicker.platform.pickImage(source: ImageSource.camera, imageQuality: 10))?.path ?? "");
 | 
						|
//                   String fileName = _image.path;
 | 
						|
//                   var bytes = File(fileName).readAsBytesSync();
 | 
						|
//                   String base64Encode = base64.encode(bytes);
 | 
						|
//                   if (base64Encode != null) {
 | 
						|
//                     image(base64Encode, _image);
 | 
						|
//                   }
 | 
						|
//                 }
 | 
						|
//               },
 | 
						|
//             ),
 | 
						|
//             _BottomSheetItem(
 | 
						|
//               title: "Cancel",
 | 
						|
//               onTap: () {},
 | 
						|
//               icon: Icons.cancel,
 | 
						|
//               color: MyColors.redColor,
 | 
						|
//             )
 | 
						|
//           ],
 | 
						|
//         );
 | 
						|
//       });
 | 
						|
// }
 | 
						|
}
 | 
						|
 | 
						|
void galleryImageAndroid(Function(String, File) image) async {
 | 
						|
  File _image = File((await ImagePicker.platform.pickImage(source: ImageSource.gallery, imageQuality: 20))?.path ?? "");
 | 
						|
 | 
						|
  String fileName = _image.path;
 | 
						|
  var bytes = File(fileName).readAsBytesSync();
 | 
						|
  String base64Encode = base64.encode(bytes);
 | 
						|
  if (base64Encode != null) {
 | 
						|
    image(base64Encode, _image);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
void cameraImageAndroid(Function(String, File) image) async {
 | 
						|
  File _image = File((await ImagePicker.platform.pickImage(source: ImageSource.camera, imageQuality: 20))?.path ?? "");
 | 
						|
  String fileName = _image.path;
 | 
						|
  var bytes = File(fileName).readAsBytesSync();
 | 
						|
  String base64Encode = base64.encode(bytes);
 | 
						|
  if (base64Encode != null) {
 | 
						|
    image(base64Encode, _image);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
class _BottomSheet extends StatelessWidget {
 | 
						|
  final List<Widget> children;
 | 
						|
 | 
						|
  const _BottomSheet({Key? key, required this.children}) : super(key: key);
 | 
						|
 | 
						|
  @override
 | 
						|
  Widget build(BuildContext context) {
 | 
						|
    return Container(
 | 
						|
      padding: const EdgeInsets.symmetric(vertical: 12.0),
 | 
						|
      decoration: BoxDecoration(color: Theme.of(context).backgroundColor, borderRadius: const BorderRadius.only(topLeft: Radius.circular(16.0), topRight: Radius.circular(16.0))),
 | 
						|
      child: SafeArea(
 | 
						|
        top: false,
 | 
						|
        child: Column(
 | 
						|
          mainAxisSize: MainAxisSize.min,
 | 
						|
          children: <Widget>[
 | 
						|
            Container(
 | 
						|
              decoration: BoxDecoration(color: Theme.of(context).dividerColor, borderRadius: BorderRadius.circular(3.0)),
 | 
						|
              width: 40.0,
 | 
						|
              height: 6.0,
 | 
						|
            ),
 | 
						|
            ...children
 | 
						|
          ],
 | 
						|
        ),
 | 
						|
      ),
 | 
						|
    );
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
class _BottomSheetItem extends StatelessWidget {
 | 
						|
  final Function onTap;
 | 
						|
  final IconData icon;
 | 
						|
  final String title;
 | 
						|
  final Color color;
 | 
						|
 | 
						|
  _BottomSheetItem({Key? key, required this.onTap, required this.title, required this.icon, this.color = MyColors.gradiantStartColor}) : super(key: key);
 | 
						|
 | 
						|
  @override
 | 
						|
  Widget build(BuildContext context) {
 | 
						|
    return InkWell(
 | 
						|
      onTap: () {
 | 
						|
        if (onTap != null) {
 | 
						|
          Navigator.pop(context);
 | 
						|
          onTap();
 | 
						|
        }
 | 
						|
      },
 | 
						|
      child: Padding(
 | 
						|
        padding: const EdgeInsets.symmetric(horizontal: 18.0, vertical: 18.0),
 | 
						|
        child: Row(
 | 
						|
          children: <Widget>[
 | 
						|
            if (icon != null)
 | 
						|
              Icon(
 | 
						|
                icon,
 | 
						|
                color: color,
 | 
						|
                size: 18.0,
 | 
						|
              ),
 | 
						|
            if (icon != null) const SizedBox(width: 24.0),
 | 
						|
            title.toText17(),
 | 
						|
          ],
 | 
						|
        ),
 | 
						|
      ),
 | 
						|
    );
 | 
						|
  }
 | 
						|
}
 |