Untitled

 avatar
unknown
swift
2 years ago
8.9 kB
7
Indexable
//
//  GoogleMapsView.swift
//  Garageworks-iOS-Revamp
//
//  Created by mac on 16/11/22.
//

import SwiftUI
import GoogleMaps
import Combine

struct GoogleMapsView: UIViewRepresentable {
    
    // Listen to changes on the locationManager
    @ObservedObject var locationManager = LocationManager()
    
    var currentPosition:CLLocationCoordinate2D?
    
    //    var camera = GMSCameraUpdate()
    @Binding var zoom: Float
    @Binding var location : Location
    @Binding var showCurrentLocation : Bool
    @Binding var placeAddress : String
    @Binding var placePincode : String
    @Binding var placeCity : String
    @Binding var placeArea : String
    @Binding var currentLocation : Location
    
    func makeUIView(context: Self.Context) -> GMSMapView {
        
        //let camera = GMSCameraPosition.camera(withTarget: CLLocationCoordinate2D(latitude: location.latitude, longitude: location.longitude), zoom: 15.0)
        
        let camera = GMSCameraPosition(latitude: currentPosition?.latitude ?? 0, longitude: currentPosition?.longitude ?? 0, zoom: 10)
        
        
        var mapView = GMSMapView(frame: CGRect.zero, camera: camera)
        //        mapView.frame = CGRect.zero
        //        mapView.camera = camera
        mapView.settings.compassButton = true
        mapView.isMyLocationEnabled = true
        
        mapView.settings.scrollGestures = true
        mapView.settings.zoomGestures = true
        mapView.settings.rotateGestures = true
        mapView.settings.tiltGestures = true
        
        mapView.delegate = context.coordinator
        
        
        
        let marker = GMSMarker()
        marker.position = CLLocationCoordinate2D(latitude: currentPosition?.latitude ?? 0, longitude: currentPosition?.longitude ?? 0)
        marker.map = mapView
        
        return mapView
    }
    
    func updateUIView(_ mapView: GMSMapView, context: Self.Context) {
        
        mapView.clear()
        
        let tappedLocation = CLLocationCoordinate2D(latitude: location.latitude, longitude: location.longitude)
        
        let tappedLocationCam = GMSCameraUpdate.setTarget(tappedLocation)
        mapView.animate(with: tappedLocationCam)
        
        mapView.animate(toZoom: zoom)
        
        let marker = GMSMarker()
        marker.position = tappedLocation
        marker.map = mapView
        
        if(showCurrentLocation){
//            //            location = currentLocation
//            mapView.settings.myLocationButton.toggle()
//            mapView.settings.myLocationButton = false
            location = Location(latitude: UserDefaultsManager.fetchCurrentLat(), longitude: UserDefaultsManager.fetchCurrentLong())
            showCurrentLocation = false
        }
    }
    
    func makeCoordinator() -> Coordinator {
        return Coordinator(self)
    }
    
    final class Coordinator: NSObject, GMSMapViewDelegate {
        var parent: GoogleMapsView
        
        init(_ parent: GoogleMapsView) {
            self.parent = parent
        }
        
        func mapView(_ mapView: GMSMapView, didTapAt coordinate: CLLocationCoordinate2D) {
            print("You tapped at \(coordinate.latitude), \(coordinate.longitude)")
            
            parent.location.latitude = coordinate.latitude
            parent.location.longitude = coordinate.longitude
            fetchAddressFromLatLong(lat: coordinate.latitude, long: coordinate.longitude)
        }
        func locationManager() {
            
        }
        
        
        func fetchAddressFromLatLong(lat: Double,long: Double) {
            
            var addressString : String = ""
            var postalString : String = ""
            var cityString : String = ""
            var areaString : String = ""
            
            let geoCoder = CLGeocoder()
            let location = CLLocation(latitude: lat , longitude: long)
            geoCoder.reverseGeocodeLocation(location, completionHandler: { (placemarks, error) -> Void in
                
                //                print("Response GeoLocation : \(placemarks?[0])")
                var placeMark: CLPlacemark!
                placeMark = placemarks?[0]
                
                if placeMark.subThoroughfare != nil {
                    addressString = addressString + placeMark.subThoroughfare! + ", "
                }
                if placeMark.thoroughfare != nil {
                    addressString = addressString + placeMark.thoroughfare! + ", "
                }
                if placeMark.subLocality != nil {
                    addressString = addressString + placeMark.subLocality! + ", "
                }
                
                if placeMark.locality != nil {
                    addressString = addressString + placeMark.locality! + ", "
                }
                if placeMark.administrativeArea != nil {
                    addressString = addressString + placeMark.administrativeArea! + ", "
                }
                if placeMark.country != nil {
                    addressString = addressString + placeMark.country! + ", "
                }
                if placeMark.postalCode != nil {
                    addressString = addressString + placeMark.postalCode! + " "
                }
                if placeMark.postalCode != nil {
                    postalString = postalString + placeMark.postalCode! + " "
                }
                if placeMark.locality != nil {
                    cityString = placeMark.locality ?? ""
                }
                if placeMark.subLocality != nil {
                    areaString = placeMark.subLocality ?? ""
                }
                
                self.parent.placeAddress = addressString
                print("\n",addressString,"\n","*********")
                
                self.parent.placePincode = postalString
                //                print("\n",postalString,"\n","******")
                self.parent.placeCity = cityString
                self.parent.placeArea = areaString
                print("\n",areaString,"***areaString")
                
                
                
                // Country
                //            if let country = placeMark.addressDictionary!["Country"] as? String {
                //                print("Country :- \(country)")
                //                // City
                //                if let city = placeMark.addressDictionary!["City"] as? String {
                //                    print("City :- \(city)")
                //                    // State
                //                    if let state = placeMark.addressDictionary!["State"] as? String{
                //                        print("State :- \(state)")
                //                        // Street
                //                        if let street = placeMark.addressDictionary!["Street"] as? String{
                //                            print("Street :- \(street)")
                //                            let str = street
                //                            let streetNumber = str.components(
                //                                separatedBy: NSCharacterSet.decimalDigits.inverted).joined(separator: "")
                //                            print("streetNumber :- \(streetNumber)" as Any)
                //
                //                            // ZIP
                //                            if let zip = placeMark.addressDictionary!["ZIP"] as? String{
                //                                print("ZIP :- \(zip)")
                //                                // Location name
                //                                if let locationName = placeMark?.addressDictionary?["Name"] as? String {
                //                                    print("Location Name :- \(locationName)")
                //                                    // Street address
                //                                    if let thoroughfare = placeMark?.addressDictionary!["Thoroughfare"] as? NSString {
                //                                    print("Thoroughfare :- \(thoroughfare)")
                //
                //                                    }
                //                                }
                //                            }
                //                        }
                //                    }
                //                }
                //            }
            })
            
        }
        
    }
    
    func addCurrentUserPosition(currentPosition: CLLocationCoordinate2D){
        let marker = GMSMarker(position: currentPosition)
        print("marker Current position: \(marker)")
        marker.title = "Current Location"
        marker.rotation = Double.random(in: -10...10)
        
        
    }
}
Editor is loading...