diff --git a/lib/provider/google_login_provider.dart b/lib/provider/google_login_provider.dart index 02646fd..8a40773 100644 --- a/lib/provider/google_login_provider.dart +++ b/lib/provider/google_login_provider.dart @@ -1,7 +1,8 @@ import 'package:google_sign_in/google_sign_in.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -const String googleClientID = "856240587825-klh0dfjc44bovajg1rpq5vbvs4g7rh5j.apps.googleusercontent.com"; +const String googleClientID = + "856240587825-klh0dfjc44bovajg1rpq5vbvs4g7rh5j.apps.googleusercontent.com"; final googleSignInProvider = StateProvider((ref) { return GoogleSignIn( @@ -13,6 +14,10 @@ final googleSignInProvider = StateProvider((ref) { ); }); -final currentUserGoogleProvider = StateProvider((ref) => null); +final currentUserGoogleProvider = + StateProvider((ref) => null); -final isNotifyFromLogout = StateProvider((ref) => false); \ No newline at end of file +final isNotifyFromLogout = StateProvider((ref) => false); + +final currentLatitudeProvider = StateProvider((ref) => 0.0); +final currentLongitudeProvider = StateProvider((ref) => 0.0); diff --git a/lib/screen/home/home_screen.dart b/lib/screen/home/home_screen.dart index 19d4247..a1515c0 100644 --- a/lib/screen/home/home_screen.dart +++ b/lib/screen/home/home_screen.dart @@ -1,5 +1,6 @@ import 'package:absensi_sas/app/constant.dart'; import 'package:absensi_sas/provider/current_rekap_kehadiran_home_provider.dart'; +import 'package:absensi_sas/widget/custom_google_map_widget.dart'; import 'package:dart_nominatim/dart_nominatim.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; @@ -322,7 +323,16 @@ class HomeScreen extends HookConsumerWidget { ) : FloatingActionButton( onPressed: () async { - await requestLocationPermission(); + // await requestLocationPermission(); + Navigator.push( + context, + MaterialPageRoute( + builder: (_) => CustomGoogleMapWidget( + positionLastLatitudeParam: positionLatitude, + positionLastLongitudeParam: positionLongitude, + ), + ), + ); }, backgroundColor: Color(0xFFFFFFFF), shape: CircleBorder(), diff --git a/lib/screen/presensi/presensi_screen.dart b/lib/screen/presensi/presensi_screen.dart index 28d79e3..367c6ed 100644 --- a/lib/screen/presensi/presensi_screen.dart +++ b/lib/screen/presensi/presensi_screen.dart @@ -30,7 +30,9 @@ 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 '../../provider/google_login_provider.dart'; import '../../widget/custom_dialog_presensi_selfie_sukses.dart'; +import '../../widget/custom_google_map_widget.dart'; import '../../widget/real_date.dart'; import '../../widget/real_time.dart'; import '../../widget/sankbar_widget.dart'; @@ -55,6 +57,10 @@ class PresensiScreen extends HookConsumerWidget { final positionLatitude = useState(""); final positionLongitude = useState(""); + + final currLatProvider = ref.read(currentLatitudeProvider); + final currLongProvider = ref.read(currentLongitudeProvider); + // final tTransactionCurrentDistance = useState("NULL"); Location location = new Location(); @@ -95,23 +101,34 @@ class PresensiScreen extends HookConsumerWidget { _locationData = await location.getLocation(); // Mendapatkan alamat dari posisi + // final address = await positionToAddressGoogleApis( + // LatLng(_locationData.latitude!, _locationData.longitude!)); + final address = await positionToAddressGoogleApis( - LatLng(_locationData.latitude!, _locationData.longitude!)); + LatLng(currLatProvider, currLongProvider)); if (positionLongitude.value.isEmpty && positionLatitude.value.isEmpty) { if (address != "") { isLoadingAddressUserLocation.value = false; + // ref.read(googleApisProvider.notifier).getAddressGoogleApis( + // latitude: _locationData.latitude.toString(), + // longitude: _locationData.longitude.toString(), + // ); + ref.read(googleApisProvider.notifier).getAddressGoogleApis( - latitude: _locationData.latitude.toString(), - longitude: _locationData.longitude.toString(), + latitude: currLatProvider.toString(), + longitude: currLongProvider.toString(), ); // String address = // "${placemark.thoroughfare}, ${placemark.locality}, ${placemark.administrativeArea}, ${placemark.country},"; - positionLatitude.value = _locationData.latitude.toString(); - positionLongitude.value = _locationData.longitude.toString(); + // positionLatitude.value = _locationData.latitude.toString(); + // positionLongitude.value = _locationData.longitude.toString(); + + positionLatitude.value = currLatProvider.toString(); + positionLongitude.value = currLongProvider.toString(); } else { isLoadingAddressUserLocation.value = false; SanckbarWidget( @@ -511,20 +528,34 @@ class PresensiScreen extends HookConsumerWidget { children: [ InkWell( onTap: () async { - getAddressFromLocation(); + // getAddressFromLocation(); + + // refresh location + Navigator.push( + context, + MaterialPageRoute( + builder: (_) => CustomGoogleMapWidget( + positionLastLatitudeParam: + positionLatitude, + positionLastLongitudeParam: + positionLongitude, + ), + ), + ); + // jika sudah dapat latitude dan logitude baru panggil check distance provider - if (positionLatitude.value.isNotEmpty && - positionLongitude.value.isNotEmpty) { - // panggil check distance provider - ref - .read(checkDistanceProvider.notifier) - .checkDistance( - selectedUser?.model.staffId ?? "", - selectedUser?.model.companyId ?? "", - positionLatitude.value, - positionLongitude.value, - ); - } + // if (positionLatitude.value.isNotEmpty && + // positionLongitude.value.isNotEmpty) { + // // panggil check distance provider + // ref + // .read(checkDistanceProvider.notifier) + // .checkDistance( + // selectedUser?.model.staffId ?? "", + // selectedUser?.model.companyId ?? "", + // positionLatitude.value, + // positionLongitude.value, + // ); + // } }, child: Container( width: Constant.getActualXPhone( diff --git a/lib/screen/presensi/presensi_selfie_screen.dart b/lib/screen/presensi/presensi_selfie_screen.dart index 01cb339..d4dc788 100644 --- a/lib/screen/presensi/presensi_selfie_screen.dart +++ b/lib/screen/presensi/presensi_selfie_screen.dart @@ -30,7 +30,9 @@ 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 '../../provider/google_login_provider.dart'; import '../../widget/custom_dialog_presensi_selfie_sukses.dart'; +import '../../widget/custom_google_map_widget.dart'; import '../../widget/real_date.dart'; import '../../widget/real_time.dart'; import '../../widget/sankbar_widget.dart'; @@ -40,8 +42,6 @@ import 'check_presensi_jam_provider.dart'; import 'googleapis_provider.dart'; import 'dart:io' as io; -import 'presensi_selfie_upload_area_web.dart'; - class PresensiSelfieScreen extends HookConsumerWidget { const PresensiSelfieScreen({super.key}); @@ -55,6 +55,9 @@ class PresensiSelfieScreen extends HookConsumerWidget { ref.watch(currentCheckJamPresensiProvider); final selectedUser = ref.watch(currentUserProvider); + final currLatProvider = ref.read(currentLatitudeProvider); + final currLongProvider = ref.read(currentLongitudeProvider); + final positionLatitude = useState(""); final positionLongitude = useState(""); @@ -195,8 +198,11 @@ class PresensiSelfieScreen extends HookConsumerWidget { _locationData = await location.getLocation(); // Mendapatkan alamat dari posisi + // final address = await positionToAddressGoogleApis( + // LatLng(_locationData.latitude!, _locationData.longitude!)); + final address = await positionToAddressGoogleApis( - LatLng(_locationData.latitude!, _locationData.longitude!)); + LatLng(currLatProvider, currLongProvider)); // final address = await positionToAddress( // LatLng(-7.5666203, 110.8083376), @@ -207,16 +213,24 @@ class PresensiSelfieScreen extends HookConsumerWidget { if (address != "") { isLoadingAddressUserLocation.value = false; + // ref.read(googleApisProvider.notifier).getAddressGoogleApis( + // latitude: _locationData.latitude.toString(), + // longitude: _locationData.longitude.toString(), + // ); + ref.read(googleApisProvider.notifier).getAddressGoogleApis( - latitude: _locationData.latitude.toString(), - longitude: _locationData.longitude.toString(), + latitude: currLatProvider.toString(), + longitude: currLongProvider.toString(), ); // String address = // "${placemark.thoroughfare}, ${placemark.locality}, ${placemark.administrativeArea}, ${placemark.country},"; - positionLatitude.value = _locationData.latitude.toString(); - positionLongitude.value = _locationData.longitude.toString(); + // positionLatitude.value = _locationData.latitude.toString(); + // positionLongitude.value = _locationData.longitude.toString(); + + positionLatitude.value = currLatProvider.toString(); + positionLongitude.value = currLongProvider.toString(); } else { isLoadingAddressUserLocation.value = false; SanckbarWidget( @@ -660,7 +674,21 @@ class PresensiSelfieScreen extends HookConsumerWidget { children: [ InkWell( onTap: () async { - getAddressFromLocation(); + // getAddressFromLocation(); + + // refresh location + Navigator.push( + context, + MaterialPageRoute( + builder: (_) => CustomGoogleMapWidget( + positionLastLatitudeParam: + positionLatitude, + positionLastLongitudeParam: + positionLongitude, + ), + ), + ); + // jika sudah dapat latitude dan logitude baru panggil check distance provider // if (positionLatitude.value.isNotEmpty && // positionLongitude.value.isNotEmpty) { diff --git a/lib/widget/custom_google_map_widget.dart b/lib/widget/custom_google_map_widget.dart index 178cbab..870705e 100644 --- a/lib/widget/custom_google_map_widget.dart +++ b/lib/widget/custom_google_map_widget.dart @@ -5,6 +5,12 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import '../app/constant.dart'; +import '../app/route.dart'; +import '../provider/current_menu_provider.dart'; +import '../provider/current_user_provider.dart'; +import '../provider/google_login_provider.dart'; +import '../screen/presensi/check_distance_provider.dart'; +import 'sankbar_widget.dart'; class CustomGoogleMapWidget extends HookConsumerWidget { const CustomGoogleMapWidget({ @@ -13,8 +19,8 @@ class CustomGoogleMapWidget extends HookConsumerWidget { required this.positionLastLongitudeParam, }); - final ValueNotifier positionLastLatitudeParam; - final ValueNotifier positionLastLongitudeParam; + final ValueNotifier positionLastLatitudeParam; + final ValueNotifier positionLastLongitudeParam; @override Widget build(BuildContext context, WidgetRef ref) { final mapController = useState(null); @@ -28,6 +34,24 @@ class CustomGoogleMapWidget extends HookConsumerWidget { Constant.positionLongitudeAwal, ); + final selectedUser = ref.read(currentUserProvider); + final isLoadingProsesCheckDistance = useState(false); + + useEffect(() { + WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { + final staffID = ref.read(currentUserProvider)?.model.staffId ?? "0"; + if (staffID == "0") { + //not login + Navigator.of(context) + .pushNamedAndRemoveUntil(loginRoute, (route) => true); + + // Navigator.popAndPushNamed(context, loginRoute); + return; + } + }); + return () {}; + }, []); + useEffect(() { Future loadCustomMarker() async { final icon = await BitmapDescriptor.asset( @@ -41,7 +65,7 @@ class CustomGoogleMapWidget extends HookConsumerWidget { return null; }, []); - Future getCurrentLocation() async { + Future getCurrentLocation(context) async { try { bool serviceEnabled = await Geolocator.isLocationServiceEnabled(); if (!serviceEnabled) return; @@ -66,12 +90,58 @@ class CustomGoogleMapWidget extends HookConsumerWidget { mapController.value!.animateCamera( CameraUpdate.newLatLng(currentPosition.value!), ); + + // change current position + final currentLat = currentPosition.value!.latitude; + final currentLong = currentPosition.value!.longitude; + + // update parameter di home + positionLastLatitudeParam.value = currentLat.toString(); + positionLastLongitudeParam.value = currentLong.toString(); + + // update ke state provider + ref.read(currentLatitudeProvider.notifier).state = currentLat; + ref.read(currentLongitudeProvider.notifier).state = currentLong; + + print("LATITUDE PRESENSI ${currentLat.toString()}"); + print("LONGITUDE PRESENSI ${currentLong.toString()}"); + + // check distance + ref.read(checkDistanceProvider.notifier).checkDistance( + selectedUser?.model.staffId ?? "", + selectedUser?.model.companyId ?? "", + currentLat.toString(), + currentLong.toString(), + ); } } catch (e) { print('Error: $e'); } } + // check distance provider + ref.listen(checkDistanceProvider, (prev, next) { + if (next is CheckDistanceStateLoading) { + isLoadingProsesCheckDistance.value = true; + } else if (next is CheckDistanceStateError) { + isLoadingProsesCheckDistance.value = false; + SanckbarWidget(context, next.message, snackbarType.warning); + } else if (next is CheckDistanceStateDone) { + isLoadingProsesCheckDistance.value = false; + + if (next.model.selfie == "TRUE") { + ref.read(currentPageProvider.notifier).update((state) => 99); + // Navigator.of(context).pop(); + Navigator.of(context).restorablePushNamed(presensiSelfieRoute); + } else { + if (next.model.selfie == "FALSE") { + ref.read(currentPageProvider.notifier).update((state) => 99); + Navigator.of(context).restorablePushNamed(presensiRoute); + } + } + } + }); + return Scaffold( backgroundColor: Constant.textWhite, appBar: AppBar( @@ -118,7 +188,9 @@ class CustomGoogleMapWidget extends HookConsumerWidget { bottom: 20, left: 20, child: ElevatedButton( - onPressed: getCurrentLocation, + onPressed: () async { + getCurrentLocation(context); + }, child: Text('Current Location'), ), ),