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.
cloudsolutions-atoms/lib/modules/copilot/copilot_helper.dart

78 lines
2.6 KiB
Dart

import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/devices_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/device/predict_device_model.dart';
import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart';
import 'package:test_sa/views/widgets/equipment/predict_device_list.dart';
class CopilotHelper {
static Future<PredictedAsset?> pickImageFromCamera(BuildContext context, {bool pickMode = false}) async {
final status = await Permission.camera.status;
if (status.isGranted) {
return openCamera(context, pickMode: pickMode);
}
final permission = await Permission.camera.request();
if (permission.isGranted) {
return openCamera(context, pickMode: pickMode);
}
if (permission.isPermanentlyDenied) {
await openAppSettings();
return null;
}
debugPrint('Camera permission denied');
return null;
}
static Future<PredictedAsset?> openCamera(BuildContext context, {bool pickMode = false}) async {
final XFile? pickedFile = await ImagePicker().pickImage(
source: ImageSource.camera,
imageQuality: 70,
);
if (pickedFile == null) {
return null;
}
final File imageFile = File(pickedFile.path);
return uploadImage(imageFile, context, pickMode: pickMode);
}
static Future<PredictedAsset?> uploadImage(File imageFile, BuildContext context, {bool pickMode = false}) async {
try {
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
AssetProvider assetProvider = Provider.of<AssetProvider>(context, listen: false);
PredictDeviceResponse? response = await assetProvider.predictDevice(imageFile);
Navigator.pop(context);
if (response != null && response.success == true) {
final List<PredictedAsset> predictedAssetList = response.predictedAsset ?? [];
if (predictedAssetList.isNotEmpty) {
return Navigator.push<PredictedAsset?>(
context,
MaterialPageRoute(builder: (context) => PredictDeviceView(predictedAsset: predictedAssetList, pickMode: pickMode)),
);
} else {
context.showInfoDialog("No Predicted asset found");
}
} else {
context.showInfoDialog("Failed to recognize the asset. Please try again.");
}
} catch (e) {
debugPrint('Upload error: $e');
}
return null;
}
}