step 10 : clock in & clock out tanpa wajah

This commit is contained in:
sindhu
2024-08-27 15:40:54 +07:00
parent a7d83956ec
commit 7bd8527df2

View File

@@ -1,25 +1,43 @@
import 'dart:convert'; import 'dart:convert';
import 'package:camera/camera.dart';
import 'package:absensi_sas/provider/current_check_jam_presensi_provider.dart'; import 'package:camera_web/camera_web.dart';
import 'package:absensi_sas/screen/presensi/check_distance_provider.dart'; import 'dart:io';
import 'package:absensi_sas/screen/presensi/check_presensi_jam_provider.dart'; import 'package:absensi_sas/repository/googleapis_repository.dart';
import 'package:absensi_sas/screen/presensi/presensi_clock_in_provider.dart'; import 'package:absensi_sas/screen/presensi/presensi_clock_in_provider.dart';
import 'package:absensi_sas/widget/real_date.dart'; import 'package:absensi_sas/screen/presensi/presensi_clock_out_provider.dart';
import 'package:absensi_sas/widget/sankbar_widget.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/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:flutter_image_compress/flutter_image_compress.dart';
// import 'package:geocoding/geocoding.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: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/constant.dart';
import '../../app/route.dart'; import '../../app/route.dart';
import '../../provider/camera_controller_provider.dart';
import '../../provider/current_check_distance_provider.dart'; import '../../provider/current_check_distance_provider.dart';
import '../../provider/current_check_jam_presensi_provider.dart';
import '../../provider/current_user_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 '../../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 { class PresensiScreen extends HookConsumerWidget {
const PresensiScreen({super.key}); const PresensiScreen({super.key});
@@ -38,13 +56,26 @@ class PresensiScreen extends HookConsumerWidget {
final positionLongitude = useState<String>(""); final positionLongitude = useState<String>("");
// final tTransactionCurrentDistance = useState<String>("NULL"); // final tTransactionCurrentDistance = useState<String>("NULL");
Location location = new Location();
LocationData _locationData;
Future<void> getAddressFromLocation() async { Future<void> getAddressFromLocation() async {
try { try {
isLoadingAddressUserLocation.value = true; isLoadingAddressUserLocation.value = true;
// Mendapatkan posisi pengguna // 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; isLoadingAddressUserLocation.value = false;
SanckbarWidget(context, 'Izin lokasi ditolak', snackbarType.error); SanckbarWidget(context, 'Izin lokasi ditolak', snackbarType.error);
// Handle jika pengguna menolak izin lokasi // Handle jika pengguna menolak izin lokasi
@@ -52,51 +83,55 @@ class PresensiScreen extends HookConsumerWidget {
return; return;
} }
Position position = await Geolocator.getCurrentPosition( // Position position = await Geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.high); // desiredAccuracy: LocationAccuracy.high);
// // Mendapatkan alamat dari posisi location.changeSettings(
// List<Placemark> placemarks = await placemarkFromCoordinates( accuracy: LocationAccuracy.high,
// position.latitude, position.longitude); interval: 1000,
distanceFilter: 5,
);
_locationData = await location.getLocation();
// if (positionLongitude.value.isEmpty && positionLatitude.value.isEmpty) { // Mendapatkan alamat dari posisi
// if (placemarks.isNotEmpty) { final address = await positionToAddress(
// isLoadingAddressUserLocation.value = false; LatLng(_locationData.latitude!, _locationData.longitude!));
// Placemark placemark = placemarks.first;
// // String address =
// // "${placemark.thoroughfare}, ${placemark.locality}, ${placemark.administrativeArea}, ${placemark.country},";
// String address = if (positionLongitude.value.isEmpty && positionLatitude.value.isEmpty) {
// "${placemark.street}, ${placemark.subLocality}, ${placemark.subAdministrativeArea}, ${placemark.postalCode}"; if (address.city != "") {
// print("Alamat: $address"); isLoadingAddressUserLocation.value = false;
// positionLatitude.value = position.latitude.toString(); ref.read(googleApisProvider.notifier).getAddressGoogleApis(
// positionLongitude.value = position.longitude.toString(); latitude: _locationData.latitude!,
longitude: _locationData.longitude!,
);
// if (address != "") { // String address =
// currentAddressUserLocation.value = address; // "${placemark.thoroughfare}, ${placemark.locality}, ${placemark.administrativeArea}, ${placemark.country},";
// }
// } 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 positionLatitude.value = _locationData.latitude.toString();
// ref.read(checkDistanceProvider.notifier).checkDistance( positionLongitude.value = _locationData.longitude.toString();
// selectedUser?.model.staffId ?? "", } else {
// selectedUser?.model.companyId ?? "", isLoadingAddressUserLocation.value = false;
// positionLatitude.value, SanckbarWidget(
// positionLongitude.value, 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) { } catch (e) {
print("Error: $e"); print("Error: $e");
isLoadingAddressUserLocation.value = false; isLoadingAddressUserLocation.value = false;
@@ -105,9 +140,10 @@ class PresensiScreen extends HookConsumerWidget {
} }
Future<void> requestLocationPermission() async { Future<void> requestLocationPermission() async {
var status = await Permission.location.request(); // var status = await Permission.location.request();
final status = await location.serviceEnabled();
isLoadingAddressUserLocation.value = true; isLoadingAddressUserLocation.value = true;
if (status.isGranted) { if (status) {
// Izin diberikan, lanjutkan dengan mendapatkan lokasi // Izin diberikan, lanjutkan dengan mendapatkan lokasi
getAddressFromLocation(); getAddressFromLocation();
} else { } 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 // check distance provider
ref.listen(checkDistanceProvider, (prev, next) { ref.listen(checkDistanceProvider, (prev, next) {
print('status check distance ' + next.toString()); print('status check distance ' + next.toString());