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.
116 lines
3.3 KiB
Dart
116 lines
3.3 KiB
Dart
import 'dart:async';
|
|
|
|
import 'package:flutter/foundation.dart' show ChangeNotifier;
|
|
import 'package:flutter/material.dart';
|
|
import 'package:google_maps_flutter_platform_interface/src/types/camera.dart';
|
|
import 'package:hmg_patient_app_new/features/location/GeocodeResponse.dart';
|
|
import 'package:hmg_patient_app_new/features/location/PlaceDetails.dart';
|
|
import 'package:hmg_patient_app_new/features/location/location_repo.dart';
|
|
import 'package:hmg_patient_app_new/services/error_handler_service.dart';
|
|
import 'package:huawei_map/huawei_map.dart' as HMSCameraServices;
|
|
import 'package:google_maps_flutter/google_maps_flutter.dart' as GMSMapServices;
|
|
|
|
|
|
|
|
import 'PlacePrediction.dart';
|
|
|
|
class LocationViewModel extends ChangeNotifier {
|
|
final LocationRepo locationRepo;
|
|
final ErrorHandlerService errorHandlerService;
|
|
|
|
LocationViewModel({required this.locationRepo, required this.errorHandlerService});
|
|
|
|
List<PlacePrediction> predictions = [];
|
|
PlacePrediction? selectedPrediction;
|
|
bool isPredictionLoading = false;
|
|
GeocodeResponse? geocodeResponse;
|
|
PlaceDetails? placeDetails;
|
|
|
|
Location? mapCapturedLocation;
|
|
|
|
FutureOr<void> getPlacesPrediction(String input) async {
|
|
predictions = [];
|
|
isPredictionLoading= true;
|
|
final result = await locationRepo.getPlacePredictionsAsInput(input);
|
|
result.fold(
|
|
(failure) {
|
|
errorHandlerService.handleError(failure: failure);
|
|
},
|
|
(apiModel) {
|
|
predictions = apiModel.data??[];
|
|
},
|
|
);
|
|
isPredictionLoading = false;
|
|
notifyListeners();
|
|
}
|
|
|
|
FutureOr<void> getPlaceEncodedData(double? lat, double? lng) async {
|
|
geocodeResponse = null;
|
|
final result = await locationRepo.getGeoCodeFromLatLng(lat!, lng!);
|
|
result.fold(
|
|
(failure) {
|
|
errorHandlerService.handleError(failure: failure);
|
|
},
|
|
(apiModel) {
|
|
print("Geocode Response: ${apiModel.data}");
|
|
geocodeResponse = apiModel.data;
|
|
},
|
|
);
|
|
notifyListeners();
|
|
}
|
|
|
|
FutureOr<void> getPlaceDetails(String placeID) async {
|
|
placeDetails = null;
|
|
final result = await locationRepo.getPlaceDetailsOfSelectedPrediction(placeID);
|
|
result.fold(
|
|
(failure) {
|
|
errorHandlerService.handleError(failure: failure);
|
|
},
|
|
(apiModel) {
|
|
placeDetails = apiModel.data;
|
|
},
|
|
);
|
|
notifyListeners();
|
|
}
|
|
|
|
handleGMSMapCameraMoved(GMSMapServices.CameraPosition value) {
|
|
mapCapturedLocation = Location(lat: value.target.latitude, lng: value.target.longitude);
|
|
|
|
}
|
|
|
|
handleHMSMapCameraMoved(HMSCameraServices.CameraPosition value) {
|
|
mapCapturedLocation = Location(lat: value.target.lat, lng: value.target.lng);
|
|
}
|
|
|
|
handleOnCameraIdle(){
|
|
if(mapCapturedLocation != null) {
|
|
getPlaceEncodedData(mapCapturedLocation!.lat, mapCapturedLocation!.lng);
|
|
}
|
|
}
|
|
|
|
void updateSearchQuery(String? value) {
|
|
if(value == null || value.isEmpty){
|
|
predictions = [];
|
|
return;
|
|
}
|
|
|
|
getPlacesPrediction(value);
|
|
}
|
|
|
|
void flushSearchPredictions() {
|
|
predictions = [];
|
|
mapCapturedLocation= null;
|
|
placeDetails= null;
|
|
geocodeResponse= null;
|
|
selectedPrediction= null;
|
|
|
|
notifyListeners();
|
|
}
|
|
|
|
FutureOr<void> selectPlacePrediction(PlacePrediction placePrediction) async{
|
|
selectedPrediction= placePrediction;
|
|
await getPlaceDetails(placePrediction.placeID);
|
|
}
|
|
|
|
|
|
} |