step 7 : presensi selfie get address and coordinate fix

This commit is contained in:
sindhu
2024-08-26 12:39:53 +07:00
parent 62409f9feb
commit f85afe7103
11 changed files with 430 additions and 234 deletions

View File

@@ -0,0 +1,45 @@
import 'package:dio/dio.dart';
import 'base_repository.dart';
class GoogleApisRepository extends BaseRepository {
GoogleApisRepository({required super.graphql, required super.dio});
Future<String?> getAddressFromCoordinates(
double latitude, double longitude) async {
final dio = Dio();
const apiKey = "AIzaSyAVUr4Ku4O1HlSkK8n9KGnUyqvsXBL-yfs";
final latitudeString = latitude.toString();
final longitudeString = longitude.toString();
const url =
'https://maps.googleapis.com/maps/api/geocode/json';
try {
final response = await dio.get(
url,
queryParameters: {
'latlng': '$latitudeString,$longitudeString',
'key': apiKey,
},
);
if (response.statusCode == 200) {
final data = response.data;
// Mengambil compound_code dari hasil JSON
final plusCode = data['plus_code'];
if (plusCode != null && plusCode['compound_code'] != null) {
return plusCode['compound_code'];
} else {
print('Alamat Tidak Ditemukan');
return null;
}
} else {
print('Failed to load data');
return null;
}
} catch (e) {
print('Error: $e');
return null;
}
}
}

View File

@@ -1,12 +1,15 @@
import 'package:absensi_sas/app/constant.dart';
import 'package:absensi_sas/provider/current_rekap_kehadiran_home_provider.dart';
import 'package:dart_nominatim/dart_nominatim.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:geocoding/geocoding.dart';
import 'package:geolocator/geolocator.dart';
// import 'package:geocoding/geocoding.dart';
// import 'package:geolocator/geolocator.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:latlong2/latlong.dart';
import 'package:location/location.dart';
// import 'package:permission_handler/permission_handler.dart';
import 'package:fluentui_system_icons/fluentui_system_icons.dart';
import '../../app/route.dart';
@@ -42,6 +45,8 @@ class HomeScreen extends HookConsumerWidget {
// ref.watch(currentUserGoogleProvider);
final googleSignIn = ref.watch(googleSignInProvider);
Location location = new Location();
LocationData _locationData;
useEffect(() {
WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
@@ -95,9 +100,10 @@ class HomeScreen extends HookConsumerWidget {
try {
isLoadingProsesCheckDistance.value = true;
// Mendapatkan posisi pengguna
LocationPermission permission = await Geolocator.requestPermission();
// LocationPermission permission = await Geolocator.requestPermission();
final permission = await location.hasPermission();
if (permission == LocationPermission.denied) {
if (permission == PermissionStatus.denied) {
isLoadingProsesCheckDistance.value = false;
SanckbarWidget(context, 'Izin lokasi ditolak', snackbarType.error);
// Handle jika pengguna menolak izin lokasi
@@ -105,25 +111,29 @@ class HomeScreen extends HookConsumerWidget {
return;
}
Position position = await Geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.high);
// Position position = await Geolocator.getCurrentPosition(
// desiredAccuracy: LocationAccuracy.high);
location.changeSettings(
accuracy: LocationAccuracy.high,
interval: 1000,
distanceFilter: 5,
);
_locationData = await location.getLocation();
// positionLatitude.value = position.latitude.toString();
// positionLongitude.value = position.longitude.toString();
positionLatitude.value = _locationData.latitude.toString();
positionLongitude.value = _locationData.longitude.toString();
// Mendapatkan alamat dari posisi
List<Placemark> placemarks = await placemarkFromCoordinates(
position.latitude, position.longitude);
final address = await positionToAddress(
LatLng(_locationData.latitude!, _locationData.longitude!));
if (placemarks.isNotEmpty) {
isLoadingProsesCheckDistance.value = false;
Placemark placemark = placemarks.first;
// String address =
// "${placemark.thoroughfare}, ${placemark.locality}, ${placemark.administrativeArea}, ${placemark.country},";
String address =
"${placemark.street}, ${placemark.subLocality}, ${placemark.subAdministrativeArea}, ${placemark.postalCode}";
print("Alamat: $address");
positionLatitude.value = position.latitude.toString();
positionLongitude.value = position.longitude.toString();
if (address.city != "") {
positionLatitude.value = _locationData.latitude.toString();
positionLongitude.value = _locationData.longitude.toString();
// panggil check distance provider
ref.read(checkDistanceProvider.notifier).checkDistance(
@@ -146,10 +156,12 @@ class HomeScreen extends HookConsumerWidget {
}
Future<void> requestLocationPermission() async {
var status = await Permission.location.request();
// var status = await Permission.location.request();
final status = await location.serviceEnabled();
isLoadingProsesCheckDistance.value = true;
if (status.isGranted) {
if (status) {
// Izin diberikan, lanjutkan dengan mendapatkan lokasi
// print('izin diberikan');
getAddressFromLocation();
} else {
isLoadingProsesCheckDistance.value = false;

View File

@@ -1,7 +1,7 @@
import 'package:absensi_sas/app/constant.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:geocoding/geocoding.dart';
// import 'package:geocoding/geocoding.dart';
import 'package:geolocator/geolocator.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
@@ -89,39 +89,39 @@ class HomeScreenV1 extends HookConsumerWidget {
return;
}
Position position = await Geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.high);
// Position position = await Geolocator.getCurrentPosition(
// desiredAccuracy: LocationAccuracy.high);
// Mendapatkan alamat dari posisi
List<Placemark> placemarks = await placemarkFromCoordinates(
position.latitude, position.longitude);
// // Mendapatkan alamat dari posisi
// List<Placemark> placemarks = await placemarkFromCoordinates(
// position.latitude, position.longitude);
if (placemarks.isNotEmpty) {
isLoadingProsesCheckDistance.value = false;
Placemark placemark = placemarks.first;
// String address =
// "${placemark.thoroughfare}, ${placemark.locality}, ${placemark.administrativeArea}, ${placemark.country},";
// if (placemarks.isNotEmpty) {
// isLoadingProsesCheckDistance.value = false;
// Placemark placemark = placemarks.first;
// // String address =
// // "${placemark.thoroughfare}, ${placemark.locality}, ${placemark.administrativeArea}, ${placemark.country},";
String address =
"${placemark.street}, ${placemark.subLocality}, ${placemark.subAdministrativeArea}, ${placemark.postalCode}";
print("Alamat: $address");
// String address =
// "${placemark.street}, ${placemark.subLocality}, ${placemark.subAdministrativeArea}, ${placemark.postalCode}";
// print("Alamat: $address");
positionLatitude.value = position.latitude.toString();
positionLongitude.value = position.longitude.toString();
// positionLatitude.value = position.latitude.toString();
// positionLongitude.value = position.longitude.toString();
// panggil check distance provider
ref.read(checkDistanceProvider.notifier).checkDistance(
selectedUser?.model.staffId ?? "",
selectedUser?.model.companyId ?? "",
positionLatitude.value,
positionLongitude.value,
);
} else {
isLoadingProsesCheckDistance.value = false;
SanckbarWidget(
context, 'Tidak dapat menemukan alamat.', snackbarType.error);
print("Tidak dapat menemukan alamat.");
}
// // panggil check distance provider
// ref.read(checkDistanceProvider.notifier).checkDistance(
// selectedUser?.model.staffId ?? "",
// selectedUser?.model.companyId ?? "",
// positionLatitude.value,
// positionLongitude.value,
// );
// } else {
// isLoadingProsesCheckDistance.value = false;
// SanckbarWidget(
// context, 'Tidak dapat menemukan alamat.', snackbarType.error);
// print("Tidak dapat menemukan alamat.");
// }
} catch (e) {
print("Error: $e");
isLoadingProsesCheckDistance.value = false;

View File

@@ -0,0 +1,69 @@
import 'package:equatable/equatable.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../provider/dio_provider.dart';
import '../../provider/graphql_provider.dart';
import '../../repository/base_repository.dart';
import '../../repository/googleapis_repository.dart';
// 3. state provider
final googleApisProvider =
StateNotifierProvider<GoogleApisNotifier, GoogleApisState>(
(ref) => GoogleApisNotifier(ref: ref));
// 2. notifier
class GoogleApisNotifier extends StateNotifier<GoogleApisState> {
final Ref ref;
GoogleApisNotifier({required this.ref}) : super(GoogleApisStateInit());
void getAddressGoogleApis(
{required double latitude, required double longitude}) async {
try {
state = GoogleApisStateLoading();
final graphql = ref.read(graphqlProvider(''));
final dio = ref.read(dioProvider);
final resp = await GoogleApisRepository(graphql: graphql, dio: dio).getAddressFromCoordinates(
latitude,
longitude,
);
// print(resp);
state = GoogleApisStateDone(model: resp);
} catch (e) {
if (e is BaseRepositoryException) {
state = GoogleApisStateError(message: e.message ?? "");
} else {
state = GoogleApisStateError(message: e.toString());
}
}
}
}
// 1. state
abstract class GoogleApisState extends Equatable {
final DateTime date;
const GoogleApisState(this.date);
@override
List<Object?> get props => [date];
}
class GoogleApisStateInit extends GoogleApisState {
GoogleApisStateInit() : super(DateTime.now());
}
class GoogleApisStateLoading extends GoogleApisState {
GoogleApisStateLoading() : super(DateTime.now());
}
class GoogleApisStateError extends GoogleApisState {
final String message;
GoogleApisStateError({
required this.message,
}) : super(DateTime.now());
}
class GoogleApisStateDone extends GoogleApisState {
final String? model;
GoogleApisStateDone({
required this.model,
}) : super(DateTime.now());
}

View File

@@ -8,7 +8,7 @@ import 'package:absensi_sas/widget/real_date.dart';
import 'package:absensi_sas/widget/sankbar_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:geocoding/geocoding.dart';
// import 'package:geocoding/geocoding.dart';
import 'package:geolocator/geolocator.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:permission_handler/permission_handler.dart';
@@ -55,48 +55,48 @@ class PresensiScreen extends HookConsumerWidget {
Position position = await Geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.high);
// Mendapatkan alamat dari posisi
List<Placemark> placemarks = await placemarkFromCoordinates(
position.latitude, position.longitude);
// // Mendapatkan alamat dari posisi
// List<Placemark> placemarks = await placemarkFromCoordinates(
// position.latitude, position.longitude);
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},";
// 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},";
String address =
"${placemark.street}, ${placemark.subLocality}, ${placemark.subAdministrativeArea}, ${placemark.postalCode}";
print("Alamat: $address");
// String address =
// "${placemark.street}, ${placemark.subLocality}, ${placemark.subAdministrativeArea}, ${placemark.postalCode}";
// print("Alamat: $address");
positionLatitude.value = position.latitude.toString();
positionLongitude.value = position.longitude.toString();
// positionLatitude.value = position.latitude.toString();
// positionLongitude.value = position.longitude.toString();
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');
// 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');
// panggil check distance provider
ref.read(checkDistanceProvider.notifier).checkDistance(
selectedUser?.model.staffId ?? "",
selectedUser?.model.companyId ?? "",
positionLatitude.value,
positionLongitude.value,
);
}
}
// // 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;

View File

@@ -1,18 +1,22 @@
import 'dart:convert';
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/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/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:geocoding/geocoding.dart';
import 'package:geolocator/geolocator.dart';
// import 'package:geocoding/geocoding.dart';
// import 'package:geolocator/geolocator.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:image_picker/image_picker.dart';
import 'package:latlong2/latlong.dart';
import 'package:location/location.dart';
import 'package:mobkit_dashed_border/mobkit_dashed_border.dart';
import 'package:permission_handler/permission_handler.dart';
// import 'package:permission_handler/permission_handler.dart';
import '../../app/constant.dart';
import '../../app/route.dart';
@@ -25,6 +29,7 @@ import '../../widget/real_time.dart';
import '../../widget/sankbar_widget.dart';
import 'check_distance_provider.dart';
import 'check_presensi_jam_provider.dart';
import 'googleapis_provider.dart';
import 'presensi_selfie_upload_area.dart';
import 'dart:io' as io;
@@ -52,6 +57,9 @@ class PresensiSelfieScreen extends HookConsumerWidget {
final fileSize = useState(0);
final fileName = useState("");
Location location = new Location();
LocationData _locationData;
getBase64() async {
// List<int> imageBytes = await fileData.value?.readAsBytes();
if (fileData.value != null) {
@@ -163,9 +171,10 @@ class PresensiSelfieScreen extends HookConsumerWidget {
try {
isLoadingAddressUserLocation.value = true;
// Mendapatkan posisi pengguna
LocationPermission permission = await Geolocator.requestPermission();
// LocationPermission permission = await Geolocator.requestPermission();
final permission = await location.hasPermission();
if (permission == LocationPermission.denied) {
if (permission == PermissionStatus.denied) {
isLoadingAddressUserLocation.value = false;
SanckbarWidget(context, 'Izin lokasi ditolak', snackbarType.error);
// Handle jika pengguna menolak izin lokasi
@@ -173,30 +182,42 @@ class PresensiSelfieScreen extends HookConsumerWidget {
return;
}
Position position = await Geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.high);
// Position position = await Geolocator.getCurrentPosition(
// locationSettings: LocationSettings(
// accuracy: LocationAccuracy.high,
// ),
// );
location.changeSettings(
accuracy: LocationAccuracy.high,
interval: 1000,
distanceFilter: 5,
);
_locationData = await location.getLocation();
// Mendapatkan alamat dari posisi
List<Placemark> placemarks = await placemarkFromCoordinates(
position.latitude, position.longitude);
final address = await positionToAddress(
LatLng(_locationData.latitude!, _locationData.longitude!));
// final address = await positionToAddress(
// LatLng(-7.5666203, 110.8083376),
// );
// Mendapatkan alamat dari posisi
if (positionLongitude.value.isEmpty && positionLatitude.value.isEmpty) {
if (placemarks.isNotEmpty) {
if (address.city != "") {
isLoadingAddressUserLocation.value = false;
Placemark placemark = placemarks.first;
ref.read(googleApisProvider.notifier).getAddressGoogleApis(
latitude: _locationData.latitude!,
longitude: _locationData.longitude!,
);
// String address =
// "${placemark.thoroughfare}, ${placemark.locality}, ${placemark.administrativeArea}, ${placemark.country},";
String address =
"${placemark.street}, ${placemark.subLocality}, ${placemark.subAdministrativeArea}, ${placemark.postalCode}";
print("Alamat: $address");
positionLatitude.value = position.latitude.toString();
positionLongitude.value = position.longitude.toString();
if (address != "") {
currentAddressUserLocation.value = address;
}
positionLatitude.value = _locationData.latitude.toString();
positionLongitude.value = _locationData.longitude.toString();
} else {
isLoadingAddressUserLocation.value = false;
SanckbarWidget(
@@ -226,9 +247,10 @@ class PresensiSelfieScreen extends HookConsumerWidget {
}
Future<void> requestLocationPermission() async {
var status = await Permission.location.request();
// var status = await PermissionStatus.location.request();
final status = await location.serviceEnabled();
isLoadingAddressUserLocation.value = true;
if (status.isGranted) {
if (status) {
// Izin diberikan, lanjutkan dengan mendapatkan lokasi
getAddressFromLocation();
} else {
@@ -261,6 +283,19 @@ class PresensiSelfieScreen 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 jam presensi
ref.listen(checkPresensiJamProvider, (prev, next) {
if (next is CheckPresensiJamStateLoading) {
@@ -508,7 +543,7 @@ class PresensiSelfieScreen extends HookConsumerWidget {
appBar: AppBar(
title: Text(
// 'Home Screen',
'Presensi Selfie',
'Presensi Selfie ${positionLatitude.value} , ${positionLongitude.value}',
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: Constant.textBlack,
@@ -628,18 +663,18 @@ class PresensiSelfieScreen extends HookConsumerWidget {
onTap: () async {
getAddressFromLocation();
// 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(

View File

@@ -1,6 +1,5 @@
import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
import 'package:geocoding/geocoding.dart';
class TestMap extends StatefulWidget {
const TestMap({super.key});
@@ -104,37 +103,37 @@ class _TestMapState extends State<TestMap> {
Map<String, dynamic> posx = await determinePosition();
print('${posx}');
if (posx['error'] == false) {
Position position = posx['position'];
List<Placemark> placemarks = await placemarkFromCoordinates(
position.latitude, position.longitude);
print('placemark : ${placemarks}');
// if (posx['error'] == false) {
// Position position = posx['position'];
// List<Placemark> placemarks = await placemarkFromCoordinates(
// position.latitude, position.longitude);
// print('placemark : ${placemarks}');
double jarakx = await Geolocator.distanceBetween(-7.5350973,
110.7921524, position.latitude, position.longitude);
// double jarakx = await Geolocator.distanceBetween(-7.5350973,
// 110.7921524, position.latitude, position.longitude);
setState(() {
jarak = jarakx.toString() + " meter";
longitude = position.longitude.toString();
latitude = position.latitude.toString();
addressFromCoordinat = placemarks[0].street.toString() +
" , " +
placemarks[0].subLocality.toString() +
" , " +
placemarks[0].locality.toString() +
" , " +
placemarks[0].postalCode.toString() +
" , " +
placemarks[0].country.toString();
});
} else {
setState(() {
longitude = "";
addressFromCoordinat = "";
jarak = "";
latitude = posx['message'].toString();
});
}
// setState(() {
// jarak = jarakx.toString() + " meter";
// longitude = position.longitude.toString();
// latitude = position.latitude.toString();
// addressFromCoordinat = placemarks[0].street.toString() +
// " , " +
// placemarks[0].subLocality.toString() +
// " , " +
// placemarks[0].locality.toString() +
// " , " +
// placemarks[0].postalCode.toString() +
// " , " +
// placemarks[0].country.toString();
// });
// } else {
// setState(() {
// longitude = "";
// addressFromCoordinat = "";
// jarak = "";
// latitude = posx['message'].toString();
// });
// }
},
),
SizedBox(