From 7bd8527df29af03414aec2c25942c5d13c02caad Mon Sep 17 00:00:00 2001 From: sindhu Date: Tue, 27 Aug 2024 15:40:54 +0700 Subject: [PATCH] step 10 : clock in & clock out tanpa wajah --- lib/screen/presensi/presensi_screen.dart | 155 +++++++++++++++-------- 1 file changed, 102 insertions(+), 53 deletions(-) diff --git a/lib/screen/presensi/presensi_screen.dart b/lib/screen/presensi/presensi_screen.dart index 10f15fc..0ed00d6 100644 --- a/lib/screen/presensi/presensi_screen.dart +++ b/lib/screen/presensi/presensi_screen.dart @@ -1,25 +1,43 @@ import 'dart:convert'; - -import 'package:absensi_sas/provider/current_check_jam_presensi_provider.dart'; -import 'package:absensi_sas/screen/presensi/check_distance_provider.dart'; -import 'package:absensi_sas/screen/presensi/check_presensi_jam_provider.dart'; +import 'package:camera/camera.dart'; +import 'package:camera_web/camera_web.dart'; +import 'dart:io'; +import 'package:absensi_sas/repository/googleapis_repository.dart'; import 'package:absensi_sas/screen/presensi/presensi_clock_in_provider.dart'; -import 'package:absensi_sas/widget/real_date.dart'; -import 'package:absensi_sas/widget/sankbar_widget.dart'; +import 'package:absensi_sas/screen/presensi/presensi_clock_out_provider.dart'; +import 'package:absensi_sas/widget/custom_drawer.dart'; +import 'package:dart_nominatim/dart_nominatim.dart'; +import 'package:file_picker/file_picker.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:flutter_image_compress/flutter_image_compress.dart'; // import 'package:geocoding/geocoding.dart'; -import 'package:geolocator/geolocator.dart'; +// import 'package:geolocator/geolocator.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:permission_handler/permission_handler.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:image_picker_web/image_picker_web.dart'; +import 'package:latlong2/latlong.dart'; +import 'package:location/location.dart'; +import 'package:mobkit_dashed_border/mobkit_dashed_border.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +// import 'package:permission_handler/permission_handler.dart'; import '../../app/constant.dart'; import '../../app/route.dart'; +import '../../provider/camera_controller_provider.dart'; import '../../provider/current_check_distance_provider.dart'; +import '../../provider/current_check_jam_presensi_provider.dart'; import '../../provider/current_user_provider.dart'; -import '../../widget/custom_drawer.dart'; +import '../../widget/custom_dialog_presensi_selfie_sukses.dart'; +import '../../widget/real_date.dart'; import '../../widget/real_time.dart'; -import 'presensi_clock_out_provider.dart'; +import '../../widget/sankbar_widget.dart'; +import 'camera_page.dart'; +import 'check_distance_provider.dart'; +import 'check_presensi_jam_provider.dart'; +import 'googleapis_provider.dart'; +import 'dart:io' as io; class PresensiScreen extends HookConsumerWidget { const PresensiScreen({super.key}); @@ -38,13 +56,26 @@ class PresensiScreen extends HookConsumerWidget { final positionLongitude = useState(""); // final tTransactionCurrentDistance = useState("NULL"); + Location location = new Location(); + LocationData _locationData; + Future getAddressFromLocation() async { try { isLoadingAddressUserLocation.value = true; // Mendapatkan posisi pengguna - LocationPermission permission = await Geolocator.requestPermission(); + // LocationPermission permission = await Geolocator.requestPermission(); - if (permission == LocationPermission.denied) { + // if (permission == LocationPermission.denied) { + // isLoadingAddressUserLocation.value = false; + // SanckbarWidget(context, 'Izin lokasi ditolak', snackbarType.error); + // // Handle jika pengguna menolak izin lokasi + // print("Izin lokasi ditolak"); + // return; + // } + + final permission = await location.hasPermission(); + + if (permission == PermissionStatus.denied) { isLoadingAddressUserLocation.value = false; SanckbarWidget(context, 'Izin lokasi ditolak', snackbarType.error); // Handle jika pengguna menolak izin lokasi @@ -52,51 +83,55 @@ class PresensiScreen extends HookConsumerWidget { return; } - Position position = await Geolocator.getCurrentPosition( - desiredAccuracy: LocationAccuracy.high); + // Position position = await Geolocator.getCurrentPosition( + // desiredAccuracy: LocationAccuracy.high); - // // Mendapatkan alamat dari posisi - // List placemarks = await placemarkFromCoordinates( - // position.latitude, position.longitude); + location.changeSettings( + accuracy: LocationAccuracy.high, + interval: 1000, + distanceFilter: 5, + ); + _locationData = await location.getLocation(); - // if (positionLongitude.value.isEmpty && positionLatitude.value.isEmpty) { - // if (placemarks.isNotEmpty) { - // isLoadingAddressUserLocation.value = false; - // Placemark placemark = placemarks.first; - // // String address = - // // "${placemark.thoroughfare}, ${placemark.locality}, ${placemark.administrativeArea}, ${placemark.country},"; + // Mendapatkan alamat dari posisi + final address = await positionToAddress( + LatLng(_locationData.latitude!, _locationData.longitude!)); - // String address = - // "${placemark.street}, ${placemark.subLocality}, ${placemark.subAdministrativeArea}, ${placemark.postalCode}"; - // print("Alamat: $address"); + if (positionLongitude.value.isEmpty && positionLatitude.value.isEmpty) { + if (address.city != "") { + isLoadingAddressUserLocation.value = false; - // positionLatitude.value = position.latitude.toString(); - // positionLongitude.value = position.longitude.toString(); + ref.read(googleApisProvider.notifier).getAddressGoogleApis( + latitude: _locationData.latitude!, + longitude: _locationData.longitude!, + ); - // if (address != "") { - // currentAddressUserLocation.value = address; - // } - // } else { - // isLoadingAddressUserLocation.value = false; - // SanckbarWidget( - // context, 'Tidak dapat menemukan alamat.', snackbarType.error); - // print("Tidak dapat menemukan alamat."); - // } - // } else { - // // jika sudah dapat latitude dan logitude baru panggil check distance provider - // if (positionLatitude.value.isNotEmpty && - // positionLongitude.value.isNotEmpty) { - // print('check distance provider'); + // String address = + // "${placemark.thoroughfare}, ${placemark.locality}, ${placemark.administrativeArea}, ${placemark.country},"; - // // panggil check distance provider - // ref.read(checkDistanceProvider.notifier).checkDistance( - // selectedUser?.model.staffId ?? "", - // selectedUser?.model.companyId ?? "", - // positionLatitude.value, - // positionLongitude.value, - // ); - // } - // } + positionLatitude.value = _locationData.latitude.toString(); + positionLongitude.value = _locationData.longitude.toString(); + } else { + isLoadingAddressUserLocation.value = false; + SanckbarWidget( + context, 'Tidak dapat menemukan alamat.', snackbarType.error); + print("Tidak dapat menemukan alamat."); + } + } else { + // jika sudah dapat latitude dan logitude baru panggil check distance provider + if (positionLatitude.value.isNotEmpty && + positionLongitude.value.isNotEmpty) { + print('check distance provider'); + + // panggil check distance provider + ref.read(checkDistanceProvider.notifier).checkDistance( + selectedUser?.model.staffId ?? "", + selectedUser?.model.companyId ?? "", + positionLatitude.value, + positionLongitude.value, + ); + } + } } catch (e) { print("Error: $e"); isLoadingAddressUserLocation.value = false; @@ -105,9 +140,10 @@ class PresensiScreen extends HookConsumerWidget { } Future requestLocationPermission() async { - var status = await Permission.location.request(); + // var status = await Permission.location.request(); + final status = await location.serviceEnabled(); isLoadingAddressUserLocation.value = true; - if (status.isGranted) { + if (status) { // Izin diberikan, lanjutkan dengan mendapatkan lokasi getAddressFromLocation(); } else { @@ -118,6 +154,19 @@ class PresensiScreen extends HookConsumerWidget { } } + // googleApis address + ref.listen(googleApisProvider, (prev, next) { + if (next is GoogleApisStateLoading) { + isLoadingProsesCheckDistance.value = true; + } else if (next is GoogleApisStateError) { + isLoadingProsesCheckDistance.value = false; + SanckbarWidget(context, next.message, snackbarType.warning); + } else if (next is GoogleApisStateDone) { + isLoadingProsesCheckDistance.value = false; + currentAddressUserLocation.value = next.model ?? "0"; + } + }); + // check distance provider ref.listen(checkDistanceProvider, (prev, next) { print('status check distance ' + next.toString());