diff --git a/packages/chicken/lib/features/poultry_science/data/model/request/submit_inspection/submit_inspection_response_schema.json b/packages/chicken/lib/features/poultry_science/data/model/request/submit_inspection/submit_inspection_response_schema.json index abe6e96..5164e8f 100644 --- a/packages/chicken/lib/features/poultry_science/data/model/request/submit_inspection/submit_inspection_response_schema.json +++ b/packages/chicken/lib/features/poultry_science/data/model/request/submit_inspection/submit_inspection_response_schema.json @@ -424,3 +424,5 @@ } + + diff --git a/packages/chicken/lib/features/poultry_science/presentation/widgets/submit_inspection_bottom_sheet/create_inspection_bottom_sheet_logic.dart b/packages/chicken/lib/features/poultry_science/presentation/widgets/submit_inspection_bottom_sheet/create_inspection_bottom_sheet_logic.dart index dd8d499..05a9215 100644 --- a/packages/chicken/lib/features/poultry_science/presentation/widgets/submit_inspection_bottom_sheet/create_inspection_bottom_sheet_logic.dart +++ b/packages/chicken/lib/features/poultry_science/presentation/widgets/submit_inspection_bottom_sheet/create_inspection_bottom_sheet_logic.dart @@ -87,6 +87,7 @@ class CreateInspectionBottomSheetLogic extends GetxController TextEditingController otherTypeOfDiseaseController = TextEditingController(); RxList pultryImagesUrls = RxList(); + RImagePickerController pultryImagesController = RImagePickerController(); RxList pultryImages = RxList(); TextEditingController hatchingTemperatureController = TextEditingController(); @@ -214,6 +215,7 @@ class CreateInspectionBottomSheetLogic extends GetxController curve: Curves.linear, ); }); + setUpPultryImagesListener(); initData(); setUpNextButtonListeners(); @@ -340,7 +342,7 @@ class CreateInspectionBottomSheetLogic extends GetxController inspectorConclusionDescriptionController.clear(); // Clear all images - pultryImages.clear(); + pultryImagesController.disposeCameraController(); pultryImagesUrls.clear(); hallImages.clear(); hallImagesUrls.clear(); @@ -590,27 +592,6 @@ class CreateInspectionBottomSheetLogic extends GetxController } } - Future uploadImage(XFile imageFile) async { - await safeCall( - call: () async { - final urls = await repository.uploadImages( - token: tokenStorageService.accessToken.value ?? '', - images: [imageFile], - ); - return urls; - }, - onSuccess: (urls) { - if (urls != null) { - pultryImagesUrls.addAll(urls); - } - pultryImages.add(imageFile); - }, - onError: (error, e) { - pultryImages.remove(imageFile); - }, - ); - } - Future?> uploadImageBatch(List images) async { if (images.isEmpty) return []; @@ -649,7 +630,7 @@ class CreateInspectionBottomSheetLogic extends GetxController hallImages.length + inputWarehouseImages.length + lossesImages.length + - pultryImages.length; + pultryImagesController.capturedImages.length; if (totalImages == 0) { isUploadingImages.value = false; @@ -702,9 +683,10 @@ class CreateInspectionBottomSheetLogic extends GetxController } // آپلود عکس‌های مرغداری - if (pultryImages.isNotEmpty) { + if (pultryImagesController.capturedImages.isNotEmpty) { uploadStatusMessage.value = 'در حال آپلود عکس‌های مرغداری...'; - final poultryImageFiles = pultryImages.toList(); + final poultryImageFiles = pultryImagesController.capturedImages + .toList(); final poultryUrls = await uploadImageBatch(poultryImageFiles); if (poultryUrls != null && poultryUrls.isNotEmpty) { @@ -971,4 +953,10 @@ class CreateInspectionBottomSheetLogic extends GetxController showError: true, ); } + + void setUpPultryImagesListener() { + pultryImagesController.addListener(() { + pultryImages.assignAll(pultryImagesController.capturedImages); + }); + } } diff --git a/packages/chicken/lib/features/poultry_science/presentation/widgets/submit_inspection_bottom_sheet/step2_page.dart b/packages/chicken/lib/features/poultry_science/presentation/widgets/submit_inspection_bottom_sheet/step2_page.dart index ff6bda2..e0309c6 100644 --- a/packages/chicken/lib/features/poultry_science/presentation/widgets/submit_inspection_bottom_sheet/step2_page.dart +++ b/packages/chicken/lib/features/poultry_science/presentation/widgets/submit_inspection_bottom_sheet/step2_page.dart @@ -55,7 +55,7 @@ Widget step2Page(CreateInspectionBottomSheetLogic controller) { ); } -Column generalConditionOfTheHall(CreateInspectionBottomSheetLogic controller) { +Widget generalConditionOfTheHall(CreateInspectionBottomSheetLogic controller) { return Column( spacing: 10, children: [ @@ -66,88 +66,100 @@ Column generalConditionOfTheHall(CreateInspectionBottomSheetLogic controller) { crossAxisAlignment: CrossAxisAlignment.start, spacing: 9, children: [ - Obx( - () => SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - spacing: 8, - children: [ - ...controller.pultryImages.map( - (entry) => Stack( - children: [ - Container( - height: 80.h, - width: 80.w, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - border: Border.all( - width: 1, - color: AppColor.blackLightHover, - ), - ), - child: ClipRRect( - borderRadius: BorderRadius.circular(8), - child: Image.file( - File(entry.path), - fit: BoxFit.cover, - ), - ), - ), - // Delete button - Positioned( - top: 4, - left: 4, - child: GestureDetector( - onTap: () => controller.removeImage( - controller.hallImages, - entry.path, - ), - child: Container( - width: 24, - height: 24, - decoration: BoxDecoration( - color: Colors.red, - shape: BoxShape.circle, + SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + spacing: 8, + children: [ + ObxValue((data) { + return Row( + children: data.value + .map( + (entry) => Stack( + children: [ + Container( + height: 80.h, + width: 80.w, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all( + width: 1, + color: AppColor.blackLightHover, + ), + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(8), + child: Image.file( + File(entry.path), + fit: BoxFit.cover, + ), + ), ), - child: Icon( - Icons.close, - color: Colors.white, - size: 16, + // Delete button + Positioned( + top: 4, + left: 4, + child: GestureDetector( + onTap: () => controller.removeImage( + controller.hallImages, + entry.path, + ), + child: Container( + width: 24, + height: 24, + decoration: BoxDecoration( + color: Colors.red, + shape: BoxShape.circle, + ), + child: Icon( + Icons.close, + color: Colors.white, + size: 16, + ), + ), + ), ), - ), - ), - ), - // Upload indicator - ], + // Upload indicator + ], + ), + ) + .toList(), + ); + }, controller.pultryImages), + + // Add image button + GestureDetector( + onTap: () async { + Get.to( + () => RImagePicker( + controller: controller.pultryImagesController, + ), + fullscreenDialog: true, + transition: Transition.fade, + duration: Duration(milliseconds: 300), + ); + }, + child: Container( + height: 80.h, + width: 80.w, + padding: EdgeInsets.all(22), + decoration: BoxDecoration( + color: Color(0xFFE9E9E9), + border: Border.all( + width: 1, + color: AppColor.blackLightHover, + ), + borderRadius: BorderRadius.circular(8), + ), + child: Assets.vec.galleryAddSvg.svg( + width: 36, + height: 36, ), ), - // Add image button - GestureDetector( - onTap: () => controller.pickImageFromCamera( - controller.pultryImages, - ), - child: Container( - height: 80.h, - width: 80.w, - padding: EdgeInsets.all(22), - decoration: BoxDecoration( - color: Color(0xFFE9E9E9), - border: Border.all( - width: 1, - color: AppColor.blackLightHover, - ), - borderRadius: BorderRadius.circular(8), - ), - child: Assets.vec.galleryAddSvg.svg( - width: 36, - height: 36, - ), - ), - ), - ], - ), + ), + ], ), ), diff --git a/packages/chicken/pubspec.lock b/packages/chicken/pubspec.lock index 10fd8a0..4744afb 100644 --- a/packages/chicken/pubspec.lock +++ b/packages/chicken/pubspec.lock @@ -145,6 +145,46 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.1" + camera: + dependency: transitive + description: + name: camera + sha256: eefad89f262a873f38d21e5eec853461737ea074d7c9ede39f3ceb135d201cab + url: "https://pub.dev" + source: hosted + version: "0.11.3" + camera_android_camerax: + dependency: transitive + description: + name: camera_android_camerax + sha256: "474d8355961658d43f1c976e2fa1ca715505bea1adbd56df34c581aaa70ec41f" + url: "https://pub.dev" + source: hosted + version: "0.6.26+2" + camera_avfoundation: + dependency: transitive + description: + name: camera_avfoundation + sha256: "035b90c1e33c2efad7548f402572078f6e514d4f82be0a315cd6c6af7e855aa8" + url: "https://pub.dev" + source: hosted + version: "0.9.22+6" + camera_platform_interface: + dependency: transitive + description: + name: camera_platform_interface + sha256: "98cfc9357e04bad617671b4c1f78a597f25f08003089dd94050709ae54effc63" + url: "https://pub.dev" + source: hosted + version: "2.12.0" + camera_web: + dependency: transitive + description: + name: camera_web + sha256: "3bc7bb1657a0f29c34116453c5d5e528c23efcf5e75aac0a3387cf108040bf65" + url: "https://pub.dev" + source: hosted + version: "0.3.5+2" characters: dependency: transitive description: diff --git a/packages/core/lib/injection/di.dart b/packages/core/lib/injection/di.dart index 65308b8..43f8723 100644 --- a/packages/core/lib/injection/di.dart +++ b/packages/core/lib/injection/di.dart @@ -14,6 +14,8 @@ Future setupAllCoreProvider() async { // await FMTCObjectBoxBackend().initialise(); await diCore.allReady(); + + } Future _setupLocalStorage() async { diff --git a/packages/core/lib/presentation/widget/image_picker/image_picker_controller.dart b/packages/core/lib/presentation/widget/image_picker/image_picker_controller.dart new file mode 100644 index 0000000..a95024a --- /dev/null +++ b/packages/core/lib/presentation/widget/image_picker/image_picker_controller.dart @@ -0,0 +1,78 @@ +import 'package:camera/camera.dart'; +import 'package:flutter/foundation.dart'; +import 'package:rasadyar_core/utils/logger_utils.dart'; + +class RImagePickerController extends ChangeNotifier { + List _cameras = []; + + CameraController? cameraController; + + bool isLoading = false; + bool isCameraReady = false; + + List capturedImages = []; + + Future getAvailableCameras() async { + _cameras = await availableCameras(); + } + + Future openCamera() async { + try { + isLoading = true; + await disposeCameraController(); + await getAvailableCameras(); + if (_cameras.isNotEmpty) { + cameraController = CameraController( + _cameras[0], + ResolutionPreset.high, + enableAudio: false, + ); + await cameraController?.initialize(); + notifyListeners(); + isCameraReady = true; + isLoading = false; + } else { + isCameraReady = false; + isLoading = false; + notifyListeners(); + } + } catch (e) { + isCameraReady = false; + isLoading = false; + notifyListeners(); + eLog(e); + } + } + + Future takePicture() async { + if (cameraController == null || !cameraController!.value.isInitialized) + return; + if (isLoading) return; + + try { + isLoading = true; + notifyListeners(); + final image = await cameraController!.takePicture(); + + capturedImages.add(image); + + isLoading = false; + } catch (e) { + eLog(e); + } finally { + isLoading = false; + notifyListeners(); + } + } + + void removeImage(int index) { + if (index < capturedImages.length) { + capturedImages.removeAt(index); + notifyListeners(); + } + } + + Future disposeCameraController() async { + await cameraController?.dispose(); + } +} diff --git a/packages/core/lib/presentation/widget/image_picker/image_picker_widget.dart b/packages/core/lib/presentation/widget/image_picker/image_picker_widget.dart new file mode 100644 index 0000000..0ff785c --- /dev/null +++ b/packages/core/lib/presentation/widget/image_picker/image_picker_widget.dart @@ -0,0 +1,158 @@ +import 'dart:io'; + +import 'package:camera/camera.dart'; +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +class RImagePicker extends StatefulWidget { + const RImagePicker({super.key, this.maxImages, required this.controller}); + final int? maxImages; + final RImagePickerController controller; + + @override + State createState() => _RImagePickerState(); +} + +class _RImagePickerState extends State { + @override + void initState() { + super.initState(); + widget.controller.openCamera(); + } + + @override + void dispose() { + widget.controller.disposeCameraController(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.black, + body: AnimatedBuilder( + animation: widget.controller, + builder: (context, child) { + if (!widget.controller.isCameraReady) { + return const Center( + child: CoreLoadingIndicator( + color: Colors.white, + variant: CoreLoadingVariant.cupertino, + size: CoreLoadingSize.medium, + ), + ); + } + + return Stack( + alignment: Alignment.center, + fit: StackFit.expand, + children: [ + CameraPreview(widget.controller.cameraController!), + + Positioned( + bottom: 40, + right: 10, + + child: RFab( + onPressed: () => Get.back(), + icon: Assets.vec.checkSvg.svg(), + backgroundColor: AppColor.greenNormal, + ), + ), + + if (widget.maxImages == null || + widget.controller.capturedImages.length < + (widget.maxImages ?? 1000)) ...[ + Positioned( + bottom: 40, + left: 0, + right: 0, + child: Center( + child: FloatingActionButton( + onPressed: widget.controller.isLoading + ? null + : () async { + await widget.controller.takePicture(); + }, + backgroundColor: Colors.white, + child: widget.controller.isLoading + ? const SizedBox( + width: 20, + height: 20, + child: CircularProgressIndicator( + strokeWidth: 2, + valueColor: AlwaysStoppedAnimation( + Colors.black, + ), + ), + ) + : const Icon(Icons.camera_alt, color: Colors.black), + ), + ), + ), + ], + + if (widget.controller.capturedImages.isNotEmpty) ...[ + Positioned( + bottom: 120, + left: 0, + right: 0, + height: 100.h, + child: ListView.separated( + itemCount: widget.controller.capturedImages.length, + padding: EdgeInsets.symmetric( + horizontal: 20.w, + vertical: 10.h, + ), + scrollDirection: Axis.horizontal, + separatorBuilder: (context, index) => SizedBox(width: 10.w), + itemBuilder: (context, index) { + final image = widget.controller.capturedImages[index]; + return Container( + width: 100.w, + height: 100.h, + decoration: BoxDecoration( + border: Border.all(color: Colors.white, width: 2), + borderRadius: BorderRadius.circular(8.r), + image: DecorationImage( + image: FileImage(File(image.path)), + fit: BoxFit.cover, + ), + ), + child: Stack( + fit: StackFit.expand, + children: [ + Positioned( + top: 2, + right: 2, + child: GestureDetector( + onTap: () => + widget.controller.removeImage(index), + child: Container( + padding: const EdgeInsets.all(4), + decoration: const BoxDecoration( + color: Colors.red, + shape: BoxShape.circle, + ), + child: const Icon( + Icons.close, + size: 16, + color: Colors.white, + ), + ), + ), + ), + ], + ), + ); + }, + ), + ), + ], + ], + ); + }, + ), + ); + } +} diff --git a/packages/core/lib/presentation/widget/widget.dart b/packages/core/lib/presentation/widget/widget.dart index e2d6bc3..9399923 100644 --- a/packages/core/lib/presentation/widget/widget.dart +++ b/packages/core/lib/presentation/widget/widget.dart @@ -50,3 +50,7 @@ export 'tabs/new_tab.dart'; export 'tabs/r_segment.dart'; export 'tabs/tab.dart'; export 'vec_widget.dart'; + +//image picker +export 'image_picker/image_picker_controller.dart'; +export 'image_picker/image_picker_widget.dart'; diff --git a/packages/core/pubspec.lock b/packages/core/pubspec.lock index a15e57e..2b06e71 100644 --- a/packages/core/pubspec.lock +++ b/packages/core/pubspec.lock @@ -77,10 +77,10 @@ packages: dependency: transitive description: name: build - sha256: dfb67ccc9a78c642193e0c2d94cb9e48c2c818b3178a86097d644acdcde6a8d9 + sha256: c1668065e9ba04752570ad7e038288559d1e2ca5c6d0131c0f5f55e39e777413 url: "https://pub.dev" source: hosted - version: "4.0.2" + version: "4.0.3" build_config: dependency: transitive description: @@ -101,10 +101,10 @@ packages: dependency: "direct dev" description: name: build_runner - sha256: "7b5b569f3df370590a85029148d6fc66c7d0201fc6f1847c07dd85d365ae9fcd" + sha256: "110c56ef29b5eb367b4d17fc79375fa8c18a6cd7acd92c05bb3986c17a079057" url: "https://pub.dev" source: hosted - version: "2.10.3" + version: "2.10.4" built_collection: dependency: transitive description: @@ -117,10 +117,10 @@ packages: dependency: transitive description: name: built_value - sha256: a30f0a0e38671e89a492c44d005b5545b830a961575bbd8336d42869ff71066d + sha256: "426cf75afdb23aa74bd4e471704de3f9393f3c7b04c1e2d9c6f1073ae0b8b139" url: "https://pub.dev" source: hosted - version: "8.12.0" + version: "8.12.1" cached_network_image: dependency: "direct main" description: @@ -145,6 +145,46 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.1" + camera: + dependency: "direct main" + description: + name: camera + sha256: eefad89f262a873f38d21e5eec853461737ea074d7c9ede39f3ceb135d201cab + url: "https://pub.dev" + source: hosted + version: "0.11.3" + camera_android_camerax: + dependency: transitive + description: + name: camera_android_camerax + sha256: "474d8355961658d43f1c976e2fa1ca715505bea1adbd56df34c581aaa70ec41f" + url: "https://pub.dev" + source: hosted + version: "0.6.26+2" + camera_avfoundation: + dependency: transitive + description: + name: camera_avfoundation + sha256: "035b90c1e33c2efad7548f402572078f6e514d4f82be0a315cd6c6af7e855aa8" + url: "https://pub.dev" + source: hosted + version: "0.9.22+6" + camera_platform_interface: + dependency: transitive + description: + name: camera_platform_interface + sha256: "98cfc9357e04bad617671b4c1f78a597f25f08003089dd94050709ae54effc63" + url: "https://pub.dev" + source: hosted + version: "2.12.0" + camera_web: + dependency: transitive + description: + name: camera_web + sha256: "3bc7bb1657a0f29c34116453c5d5e528c23efcf5e75aac0a3387cf108040bf65" + url: "https://pub.dev" + source: hosted + version: "0.3.5+2" characters: dependency: transitive description: @@ -237,10 +277,10 @@ packages: dependency: transitive description: name: cross_file - sha256: "942a4791cd385a68ccb3b32c71c427aba508a1bb949b86dff2adbe4049f16239" + sha256: "701dcfc06da0882883a2657c445103380e53e647060ad8d9dfb710c100996608" url: "https://pub.dev" source: hosted - version: "0.3.5" + version: "0.3.5+1" crypto: dependency: transitive description: @@ -309,10 +349,10 @@ packages: dependency: "direct main" description: name: device_info_plus - sha256: dd0e8e02186b2196c7848c9d394a5fd6e5b57a43a546082c5820b1ec72317e33 + sha256: "4df8babf73058181227e18b08e6ea3520cf5fc5d796888d33b7cb0f33f984b7c" url: "https://pub.dev" source: hosted - version: "12.2.0" + version: "12.3.0" device_info_plus_platform_interface: dependency: transitive description: @@ -381,18 +421,18 @@ packages: dependency: transitive description: name: file_selector_linux - sha256: "80a877f5ec570c4fb3b40720a70b6f31e8bb1315a464b4d3e92fe82754d4b21a" + sha256: "2567f398e06ac72dcf2e98a0c95df2a9edd03c2c2e0cacd4780f20cdf56263a0" url: "https://pub.dev" source: hosted - version: "0.9.3+3" + version: "0.9.4" file_selector_macos: dependency: transitive description: name: file_selector_macos - sha256: "44f24d102e368370951b98ffe86c7325b38349e634578312976607d28cc6d747" + sha256: "5e0bbe9c312416f1787a68259ea1505b52f258c587f12920422671807c4d618a" url: "https://pub.dev" source: hosted - version: "0.9.4+6" + version: "0.9.5" file_selector_platform_interface: dependency: transitive description: @@ -511,10 +551,10 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: "306f0596590e077338312f38837f595c04f28d6cdeeac392d3d74df2f0003687" + sha256: ee8068e0e1cd16c4a82714119918efdeed33b3ba7772c54b5d094ab53f9b7fd1 url: "https://pub.dev" source: hosted - version: "2.0.32" + version: "2.0.33" flutter_rating_bar: dependency: "direct main" description: @@ -591,10 +631,10 @@ packages: dependency: "direct main" description: name: flutter_svg - sha256: "055de8921be7b8e8b98a233c7a5ef84b3a6fcc32f46f1ebf5b9bb3576d108355" + sha256: "87fbd7c534435b6c5d9d98b01e1fd527812b82e68ddd8bd35fc45ed0fa8f0a95" url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.2.3" flutter_test: dependency: "direct dev" description: flutter @@ -681,10 +721,10 @@ packages: dependency: "direct main" description: name: get - sha256: c79eeb4339f1f3deffd9ec912f8a923834bec55f7b49c9e882b8fef2c139d425 + sha256: "5ed34a7925b85336e15d472cc4cfe7d9ebf4ab8e8b9f688585bf6b50f4c3d79a" url: "https://pub.dev" source: hosted - version: "4.7.2" + version: "4.7.3" get_it: dependency: "direct main" description: @@ -745,10 +785,10 @@ packages: dependency: "direct dev" description: name: hive_ce_generator - sha256: b19ac263cb37529513508ba47352c41e6de72ba879952898d9c18c9c8a955921 + sha256: c3d04f17b39cac9439e1c7d098d0b3fd93a488d167af2bd52746dbb5fc109411 url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.10.1" http: dependency: transitive description: @@ -777,10 +817,10 @@ packages: dependency: transitive description: name: image - sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928" + sha256: "51555e36056541237b15b57afc31a0f53d4f9aefd9bd00873a6dc0090e54e332" url: "https://pub.dev" source: hosted - version: "4.5.4" + version: "4.6.0" image_cropper: dependency: "direct main" description: @@ -817,26 +857,26 @@ packages: dependency: transitive description: name: image_picker_android - sha256: a1cd1584fae64f6ecca63113fd5450e3483c097cc05e43a2f073330f62adcabe + sha256: "5e9bf126c37c117cf8094215373c6d561117a3cfb50ebc5add1a61dc6e224677" url: "https://pub.dev" source: hosted - version: "0.8.13+8" + version: "0.8.13+10" image_picker_for_web: dependency: transitive description: name: image_picker_for_web - sha256: "40c2a6a0da15556dc0f8e38a3246064a971a9f512386c3339b89f76db87269b6" + sha256: "66257a3191ab360d23a55c8241c91a6e329d31e94efa7be9cf7a212e65850214" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.1" image_picker_ios: dependency: transitive description: name: image_picker_ios - sha256: "997d100ce1dda5b1ba4085194c5e36c9f8a1fb7987f6a36ab677a344cd2dc986" + sha256: "956c16a42c0c708f914021666ffcd8265dde36e673c9fa68c81f7d085d9774ad" url: "https://pub.dev" source: hosted - version: "0.8.13+2" + version: "0.8.13+3" image_picker_linux: dependency: transitive description: @@ -921,10 +961,10 @@ packages: dependency: "direct dev" description: name: json_serializable - sha256: "33a040668b31b320aafa4822b7b1e177e163fc3c1e835c6750319d4ab23aa6fe" + sha256: "6b253f7851cf1626a05c8b49c792e04a14897349798c03798137f2b5f7e0b5b1" url: "https://pub.dev" source: hosted - version: "6.11.1" + version: "6.11.3" latlong2: dependency: "direct main" description: @@ -1041,10 +1081,10 @@ packages: dependency: transitive description: name: mockito - sha256: "4feb43bc4eb6c03e832f5fcd637d1abb44b98f9cfa245c58e27382f58859f8f6" + sha256: dac24d461418d363778d53198d9ac0510b9d073869f078450f195766ec48d05e url: "https://pub.dev" source: hosted - version: "5.5.1" + version: "5.6.1" mocktail: dependency: "direct dev" description: @@ -1153,18 +1193,18 @@ packages: dependency: transitive description: name: path_provider_android - sha256: "95c68a74d3cab950fd0ed8073d9fab15c1c06eb1f3eec68676e87aabc9ecee5a" + sha256: f2c65e21139ce2c3dad46922be8272bb5963516045659e71bb16e151c93b580e url: "https://pub.dev" source: hosted - version: "2.2.21" + version: "2.2.22" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: "97390a0719146c7c3e71b6866c34f1cde92685933165c1c671984390d2aca776" + sha256: "6d13aece7b3f5c5a9731eaf553ff9dcbc2eff41087fd2df587fd0fed9a3eb0c4" url: "https://pub.dev" source: hosted - version: "2.4.4" + version: "2.5.1" path_provider_linux: dependency: transitive description: @@ -1369,18 +1409,18 @@ packages: dependency: transitive description: name: shared_preferences - sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" + sha256: "2939ae520c9024cb197fc20dee269cd8cdbf564c8b5746374ec6cacdc5169e64" url: "https://pub.dev" source: hosted - version: "2.5.3" + version: "2.5.4" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "07d552dbe8e71ed720e5205e760438ff4ecfb76ec3b32ea664350e2ca4b0c43b" + sha256: "83af5c682796c0f7719c2bbf74792d113e40ae97981b8f266fa84574573556bc" url: "https://pub.dev" source: hosted - version: "2.4.16" + version: "2.4.18" shared_preferences_foundation: dependency: transitive description: @@ -1478,18 +1518,18 @@ packages: dependency: transitive description: name: source_gen - sha256: "9098ab86015c4f1d8af6486b547b11100e73b193e1899015033cb3e14ad20243" + sha256: "07b277b67e0096c45196cbddddf2d8c6ffc49342e88bf31d460ce04605ddac75" url: "https://pub.dev" source: hosted - version: "4.0.2" + version: "4.1.1" source_helper: dependency: transitive description: name: source_helper - sha256: "6a3c6cc82073a8797f8c4dc4572146114a39652851c157db37e964d9c7038723" + sha256: e82b1996c63da42aa3e6a34cc1ec17427728a1baf72ed017717a5669a7123f0d url: "https://pub.dev" source: hosted - version: "1.3.8" + version: "1.3.9" source_map_stack_trace: dependency: transitive description: @@ -1630,10 +1670,10 @@ packages: dependency: transitive description: name: time - sha256: "370572cf5d1e58adcb3e354c47515da3f7469dac3a95b447117e728e7be6f461" + sha256: "46187cf30bffdab28c56be9a63861b36e4ab7347bf403297595d6a97e10c789f" url: "https://pub.dev" source: hosted - version: "2.1.5" + version: "2.1.6" typed_data: dependency: transitive description: @@ -1702,10 +1742,10 @@ packages: dependency: transitive description: name: watcher - sha256: "592ab6e2892f67760543fb712ff0177f4ec76c031f02f5b4ff8d3fc5eb9fb61a" + sha256: f52385d4f73589977c80797e60fe51014f7f2b957b5e9a62c3f6ada439889249 url: "https://pub.dev" source: hosted - version: "1.1.4" + version: "1.2.0" web: dependency: transitive description: diff --git a/packages/core/pubspec.yaml b/packages/core/pubspec.yaml index 6dea051..40a9c26 100644 --- a/packages/core/pubspec.yaml +++ b/packages/core/pubspec.yaml @@ -91,6 +91,7 @@ dependencies: ##code generation freezed_annotation: ^3.1.0 json_annotation: ^4.9.0 + camera: ^0.11.3 dependency_overrides: analyzer: ^8.0.0 diff --git a/pubspec.lock b/pubspec.lock index 64ff330..3cc3c63 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -145,6 +145,46 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.1" + camera: + dependency: transitive + description: + name: camera + sha256: eefad89f262a873f38d21e5eec853461737ea074d7c9ede39f3ceb135d201cab + url: "https://pub.dev" + source: hosted + version: "0.11.3" + camera_android_camerax: + dependency: transitive + description: + name: camera_android_camerax + sha256: "474d8355961658d43f1c976e2fa1ca715505bea1adbd56df34c581aaa70ec41f" + url: "https://pub.dev" + source: hosted + version: "0.6.26+2" + camera_avfoundation: + dependency: transitive + description: + name: camera_avfoundation + sha256: "035b90c1e33c2efad7548f402572078f6e514d4f82be0a315cd6c6af7e855aa8" + url: "https://pub.dev" + source: hosted + version: "0.9.22+6" + camera_platform_interface: + dependency: transitive + description: + name: camera_platform_interface + sha256: "98cfc9357e04bad617671b4c1f78a597f25f08003089dd94050709ae54effc63" + url: "https://pub.dev" + source: hosted + version: "2.12.0" + camera_web: + dependency: transitive + description: + name: camera_web + sha256: "3bc7bb1657a0f29c34116453c5d5e528c23efcf5e75aac0a3387cf108040bf65" + url: "https://pub.dev" + source: hosted + version: "0.3.5+2" change_app_package_name: dependency: "direct dev" description: