import 'package:camerawesome/camerawesome_plugin.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../../../core/utils/app_snackbar.dart'; import '../controllers/scanner_controller.dart'; class ScannerView extends GetView { const ScannerView({super.key}); @override Widget build(BuildContext context) { return Scaffold( body: Stack( children: [ // 1. Camera Layer CameraAwesomeBuilder.awesome( saveConfig: SaveConfig.photo( pathBuilder: (sensors) async { final path = await controller.getSavePath(); if (sensors.length == 1) { return SingleCaptureRequest(path, sensors.first); } else { // For multiple sensors, we take the first one for the path return MultipleCaptureRequest({ for (var sensor in sensors) sensor: path, }); } }, ), onMediaTap: (media) { final path = media.captureRequest.when( single: (single) => single.file?.path, multiple: (multiple) => multiple.fileBySensor.values.first?.path, ); if (path != null) { controller.addImage(path); } }, onMediaCaptureEvent: (event) { if (event.status == MediaCaptureStatus.success) { final path = event.captureRequest.when( single: (single) => single.file?.path, multiple: (multiple) => multiple.fileBySensor.values.first?.path, ); if (path != null) { controller.addImage(path); } } }, topActionsBuilder: (state) => AwesomeTopActions( state: state, children: [ AwesomeFlashButton(state: state), const Spacer(), TextButton.icon( onPressed: () => Get.back(), icon: const Icon(Icons.close, color: Colors.white), label: const Text('إغلاق', style: TextStyle(color: Colors.white)), ), ], ), middleContentBuilder: (state) => const Center( child: Text( 'قم بمحاذاة الفاتورة داخل الإطار', style: TextStyle( color: Colors.white, fontSize: 16, backgroundColor: Colors.black26, ), ), ), bottomActionsBuilder: (state) => AwesomeBottomActions( state: state, left: const SizedBox(), right: AwesomeCameraSwitchButton(state: state), ), ), // 2. Batch Overlay (Bottom) Positioned( bottom: 120, left: 0, right: 0, child: Obx(() => controller.capturedImages.isEmpty ? const SizedBox() : Container( height: 100, padding: const EdgeInsets.symmetric(horizontal: 16), child: ListView.builder( scrollDirection: Axis.horizontal, itemCount: controller.capturedImages.length, itemBuilder: (context, index) { return Padding( padding: const EdgeInsets.only(right: 8.0), child: Stack( children: [ ClipRRect( borderRadius: BorderRadius.circular(8), child: Image.file( controller.capturedImages[index], width: 80, height: 100, fit: BoxFit.cover, ), ), Positioned( top: 0, right: 0, child: GestureDetector( onTap: () => controller.removeImage(index), child: Container( decoration: const BoxDecoration( color: Colors.red, shape: BoxShape.circle, ), child: const Icon(Icons.close, size: 16, color: Colors.white), ), ), ), ], ), ); }, ), )), ), // 3. Upload Button Positioned( top: 20, left: 80, right: 80, child: Obx(() => controller.capturedImages.isEmpty ? const SizedBox() : ElevatedButton.icon( onPressed: controller.isProcessing.value ? null : () { if (controller.companies.isEmpty) { AppSnackbar.showError( 'خطأ', 'لا توجد شركات مسجلة في حسابك'); return; } if (controller.companies.length == 1) { controller .uploadBatch(controller.companies[0]['id']); return; } _showCompanySelectionDialog(context); }, style: ElevatedButton.styleFrom( backgroundColor: const Color(0xFF0F4C81), padding: const EdgeInsets.symmetric(vertical: 16), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(30)), ), icon: controller.isProcessing.value ? SizedBox( width: 20, height: 20, child: CircularProgressIndicator( value: controller.uploadProgress.value > 0 ? controller.uploadProgress.value : null, color: Colors.white, strokeWidth: 2)) : const Icon(Icons.cloud_upload, color: Colors.white), label: Text( 'رفع ${controller.capturedImages.length} فواتير', style: const TextStyle( fontSize: 16, fontWeight: FontWeight.bold, color: Colors.white), ), )), ), ], ), ); } void _showCompanySelectionDialog(BuildContext context) { showDialog( context: context, builder: (context) => AlertDialog( title: const Text('اختر الشركة', textAlign: TextAlign.right, style: TextStyle(fontFamily: 'El Messiri')), content: SizedBox( width: double.maxFinite, child: ListView.builder( shrinkWrap: true, itemCount: controller.companies.length, itemBuilder: (context, index) { final company = controller.companies[index]; return ListTile( title: Text(company['name'] ?? '', textAlign: TextAlign.right), subtitle: Text(company['tax_identification_number'] ?? '', textAlign: TextAlign.right), leading: const Icon(Icons.business, color: Color(0xFF0F4C81)), onTap: () { Navigator.pop(context); controller.uploadBatch(company['id']); }, ); }, ), ), ), ); } }