From 1a656e66027878842016c8d178ad07cc1eb305b9 Mon Sep 17 00:00:00 2001 From: Lucas Jorge Hubert Date: Tue, 23 May 2023 10:01:57 -0300 Subject: [PATCH 1/4] Implement ride types --- .gitignore | 1 + eUberUI.xcodeproj/project.pbxproj | 4 ++ .../hatchback.imageset/Contents.json | 12 +++++ .../hatchback.imageset/hatchback.png | Bin 0 -> 30589 bytes .../motorbike.imageset/Contents.json | 12 +++++ .../motorbike.imageset/motorbike.png | Bin 0 -> 38485 bytes .../suv.imageset/Contents.json | 12 +++++ eUberUI/Assets.xcassets/suv.imageset/suv.png | Bin 0 -> 31167 bytes eUberUI/Core/Home/View/HomeView.swift | 42 ++++++++++-------- .../Core/Home/View/MapViewActionButton.swift | 2 + .../Home/View/UberMapViewRepresentable.swift | 13 +++++- .../View/LocationSearchView.swift | 6 ++- eUberUI/Core/Trips/View/RideRequestView.swift | 26 ++++++++--- eUberUI/Core/Trips/View/RideType.swift | 33 ++++++++++++++ 14 files changed, 134 insertions(+), 29 deletions(-) create mode 100644 eUberUI/Assets.xcassets/hatchback.imageset/Contents.json create mode 100644 eUberUI/Assets.xcassets/hatchback.imageset/hatchback.png create mode 100644 eUberUI/Assets.xcassets/motorbike.imageset/Contents.json create mode 100644 eUberUI/Assets.xcassets/motorbike.imageset/motorbike.png create mode 100644 eUberUI/Assets.xcassets/suv.imageset/Contents.json create mode 100644 eUberUI/Assets.xcassets/suv.imageset/suv.png create mode 100644 eUberUI/Core/Trips/View/RideType.swift diff --git a/.gitignore b/.gitignore index 0d7c7ab..18d6b11 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.xcuserstate +*.xcuserstate diff --git a/eUberUI.xcodeproj/project.pbxproj b/eUberUI.xcodeproj/project.pbxproj index 1f33a9b..86727db 100644 --- a/eUberUI.xcodeproj/project.pbxproj +++ b/eUberUI.xcodeproj/project.pbxproj @@ -9,6 +9,7 @@ /* Begin PBXBuildFile section */ C91BB1442A16BDC000C0B971 /* RideRequestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C91BB1432A16BDC000C0B971 /* RideRequestView.swift */; }; C97221BD2A169FD40014EABA /* MapViewState.swift in Sources */ = {isa = PBXBuildFile; fileRef = C97221BC2A169FD40014EABA /* MapViewState.swift */; }; + C9AA5E762A1C113E00824737 /* RideType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9AA5E752A1C113E00824737 /* RideType.swift */; }; C9CFFE442A15179E00708A15 /* eUberUIApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9CFFE432A15179E00708A15 /* eUberUIApp.swift */; }; C9CFFE482A1517A200708A15 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C9CFFE472A1517A200708A15 /* Assets.xcassets */; }; C9CFFE4B2A1517A200708A15 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C9CFFE4A2A1517A200708A15 /* Preview Assets.xcassets */; }; @@ -46,6 +47,7 @@ /* Begin PBXFileReference section */ C91BB1432A16BDC000C0B971 /* RideRequestView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RideRequestView.swift; sourceTree = ""; }; C97221BC2A169FD40014EABA /* MapViewState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = MapViewState.swift; path = ../../../../../../../Users/lucashubert/Downloads/MapViewState.swift; sourceTree = ""; }; + C9AA5E752A1C113E00824737 /* RideType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = RideType.swift; path = eUberUI/Core/Trips/View/RideType.swift; sourceTree = SOURCE_ROOT; }; C9CFFE402A15179E00708A15 /* eUberUI.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = eUberUI.app; sourceTree = BUILT_PRODUCTS_DIR; }; C9CFFE432A15179E00708A15 /* eUberUIApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = eUberUIApp.swift; sourceTree = ""; }; C9CFFE472A1517A200708A15 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; @@ -181,6 +183,7 @@ isa = PBXGroup; children = ( C97221BC2A169FD40014EABA /* MapViewState.swift */, + C9AA5E752A1C113E00824737 /* RideType.swift */, ); path = Models; sourceTree = ""; @@ -394,6 +397,7 @@ buildActionMask = 2147483647; files = ( C9CFFE8B2A15410900708A15 /* LocationSearchView.swift in Sources */, + C9AA5E762A1C113E00824737 /* RideType.swift in Sources */, C9CFFE7D2A151D2400708A15 /* HomeView.swift in Sources */, C9CFFE812A151F7400708A15 /* LocationManager.swift in Sources */, C9CFFE502A1517A200708A15 /* eUberUI.xcdatamodeld in Sources */, diff --git a/eUberUI/Assets.xcassets/hatchback.imageset/Contents.json b/eUberUI/Assets.xcassets/hatchback.imageset/Contents.json new file mode 100644 index 0000000..ed9916f --- /dev/null +++ b/eUberUI/Assets.xcassets/hatchback.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "hatchback.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/eUberUI/Assets.xcassets/hatchback.imageset/hatchback.png b/eUberUI/Assets.xcassets/hatchback.imageset/hatchback.png new file mode 100644 index 0000000000000000000000000000000000000000..98e9f09581097d0b73229c9d310bb43b61beee90 GIT binary patch literal 30589 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 AH~;_u literal 0 HcmV?d00001 diff --git a/eUberUI/Assets.xcassets/motorbike.imageset/Contents.json b/eUberUI/Assets.xcassets/motorbike.imageset/Contents.json new file mode 100644 index 0000000..de7b6d8 --- /dev/null +++ b/eUberUI/Assets.xcassets/motorbike.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "motorbike.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/eUberUI/Assets.xcassets/motorbike.imageset/motorbike.png b/eUberUI/Assets.xcassets/motorbike.imageset/motorbike.png new file mode 100644 index 0000000000000000000000000000000000000000..fefd65f7d217bf11d028f088929dc847e0ecf930 GIT binary patch literal 38485 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 literal 0 HcmV?d00001 diff --git a/eUberUI/Assets.xcassets/suv.imageset/Contents.json b/eUberUI/Assets.xcassets/suv.imageset/Contents.json new file mode 100644 index 0000000..9bf8087 --- /dev/null +++ b/eUberUI/Assets.xcassets/suv.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "suv.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/eUberUI/Assets.xcassets/suv.imageset/suv.png b/eUberUI/Assets.xcassets/suv.imageset/suv.png new file mode 100644 index 0000000000000000000000000000000000000000..19352dba07f86762cd9a06d8d0ede30745206382 GIT binary patch literal 31167 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 literal 0 HcmV?d00001 diff --git a/eUberUI/Core/Home/View/HomeView.swift b/eUberUI/Core/Home/View/HomeView.swift index dca10e3..cbb2d74 100644 --- a/eUberUI/Core/Home/View/HomeView.swift +++ b/eUberUI/Core/Home/View/HomeView.swift @@ -11,26 +11,32 @@ struct HomeView: View { @State private var mapState = MapViewState.noInput var body: some View { - ZStack(alignment: .top) { - UberMapViewRepresentable(mapState: $mapState) - .ignoresSafeArea() - - if mapState == .searchingForLocation { - LocationSearchView(mapState: $mapState) - } else if mapState == .noInput{ - LocationSearchActivationView() - .padding(.vertical, 72) - .onTapGesture { - withAnimation(.spring()) { - mapState = .searchingForLocation + ZStack(alignment: .bottom) { + ZStack(alignment: .top) { + UberMapViewRepresentable(mapState: $mapState) + .ignoresSafeArea() + + if mapState == .searchingForLocation { + LocationSearchView(mapState: $mapState) + } else if mapState == .noInput{ + LocationSearchActivationView() + .padding(.vertical, 72) + .onTapGesture { + withAnimation(.spring()) { + mapState = .searchingForLocation + } } - } + } + + MapViewActionButton(mapState: $mapState) + .padding(.leading) + .padding(.top, 4) } - - MapViewActionButton(mapState: $mapState) - .padding(.leading) - .padding(.top, 4) - } + if mapState == .locationSelected { + RideRequestView() + .transition(.move(edge: .bottom)) + } + }.edgesIgnoringSafeArea(.bottom) } } diff --git a/eUberUI/Core/Home/View/MapViewActionButton.swift b/eUberUI/Core/Home/View/MapViewActionButton.swift index 811e816..b53593f 100644 --- a/eUberUI/Core/Home/View/MapViewActionButton.swift +++ b/eUberUI/Core/Home/View/MapViewActionButton.swift @@ -9,6 +9,7 @@ import SwiftUI struct MapViewActionButton: View { @Binding var mapState: MapViewState + @EnvironmentObject var viewModel: LocationSearchViewModel var body: some View { Button { @@ -36,6 +37,7 @@ struct MapViewActionButton: View { case .searchingForLocation: mapState = .noInput case .locationSelected: + viewModel.selectedLocationCoordinate = nil mapState = .noInput } } diff --git a/eUberUI/Core/Home/View/UberMapViewRepresentable.swift b/eUberUI/Core/Home/View/UberMapViewRepresentable.swift index 931a9bb..167c6bf 100644 --- a/eUberUI/Core/Home/View/UberMapViewRepresentable.swift +++ b/eUberUI/Core/Home/View/UberMapViewRepresentable.swift @@ -92,14 +92,23 @@ extension UberMapViewRepresentable { anno.coordinate = coordinate self.parent.mapView.addAnnotation(anno) self.parent.mapView.selectAnnotation(anno, animated: true) - - parent.mapView.showAnnotations(parent.mapView.annotations, animated: true) } func configurePolyline(withDestinationCoordinate coordinate: CLLocationCoordinate2D) { guard let userLocationCoordinate = self.userLocationCoordinate else { return } getDestinationRoute(from: userLocationCoordinate, to: coordinate) { route in self.parent.mapView.addOverlay(route.polyline) + let rect = self.parent.mapView.mapRectThatFits( + route.polyline.boundingMapRect, + edgePadding: .init( + top: 64, + left: 32, + bottom: 500, + right: 32 + ) + ) + self.parent.mapView.setRegion(MKCoordinateRegion(rect), animated: true) + } } diff --git a/eUberUI/Core/LocationSearch/View/LocationSearchView.swift b/eUberUI/Core/LocationSearch/View/LocationSearchView.swift index c641cae..bc19bc7 100644 --- a/eUberUI/Core/LocationSearch/View/LocationSearchView.swift +++ b/eUberUI/Core/LocationSearch/View/LocationSearchView.swift @@ -58,8 +58,10 @@ struct LocationSearchView: View { ForEach(viewModel.resuls, id: \.self) { result in LocationSearchResultCell(title: result.title, subtitle: result.subtitle) .onTapGesture { - mapState = .locationSelected - viewModel.selectLocation(result) + withAnimation { + mapState = .locationSelected + viewModel.selectLocation(result) + } } } } diff --git a/eUberUI/Core/Trips/View/RideRequestView.swift b/eUberUI/Core/Trips/View/RideRequestView.swift index be2b976..2779cae 100644 --- a/eUberUI/Core/Trips/View/RideRequestView.swift +++ b/eUberUI/Core/Trips/View/RideRequestView.swift @@ -8,12 +8,16 @@ import SwiftUI struct RideRequestView: View { + + @State private var selectedRideType: RideType = .eUberX + var body: some View { VStack { Capsule() .foregroundColor((Color(.systemYellow))) .frame(width: 48, height: 8) .opacity(0.6) + .padding(.vertical, 8) HStack { VStack { @@ -77,25 +81,31 @@ struct RideRequestView: View { ScrollView(.horizontal) { HStack(spacing: 12) { - ForEach(0 ..< 3, id: \.self) { _ in - VStack(alignment: .leading) { - Image(systemName: "bolt.car.fill") + ForEach(RideType.allCases, id: \.self) { rideType in + VStack { + Image(rideType.imageName) .resizable() .scaledToFit() .frame(width: 48, height: 48) - VStack(spacing: 4) { - Text("Smart X") + VStack(alignment: .leading, spacing: 4) { + Text(rideType.description) .font(.system(size: 14, weight: .semibold)) Text("$ 5.80") .font(.system(size: 14, weight: .semibold)) } - .padding(8) } + .padding(.top, 8) .frame(width: 112, height: 140) - .background(Color(.systemGroupedBackground)) + .background(Color(rideType == selectedRideType ? .systemYellow : .systemGroupedBackground)) + .scaleEffect(rideType == selectedRideType ? 1.1 : 1.0) .cornerRadius(10) + .onTapGesture { + withAnimation(.linear) { + selectedRideType = rideType + } + } } } }.padding(.horizontal) @@ -138,7 +148,9 @@ struct RideRequestView: View { } } + .padding(.bottom, 24) .background(.white) + .cornerRadius(16) } } diff --git a/eUberUI/Core/Trips/View/RideType.swift b/eUberUI/Core/Trips/View/RideType.swift new file mode 100644 index 0000000..72055c1 --- /dev/null +++ b/eUberUI/Core/Trips/View/RideType.swift @@ -0,0 +1,33 @@ +// +// RideType.swift +// eUberUI +// +// Created by Lucas Hubert on 22/05/23. +// + +import Foundation + +enum RideType: Int, CaseIterable, Identifiable { + case eUberX + case eUberPlus + case eUbertBike + + var id: Int { return rawValue } + + var description: String { + switch self { + case .eUberX: return "eUber X" + case .eUberPlus: return "eUber Plus" + case .eUbertBike: return "eUber Bike" + } + } + + var imageName: String { + switch self { + case .eUberX: return "hatchback" + case .eUberPlus: return "suv" + case .eUbertBike: return "motorbike" + } + } + +} From 4c659d6954f1b10344d224f565d885a6ebd59ed1 Mon Sep 17 00:00:00 2001 From: Lucas Jorge Hubert Date: Tue, 23 May 2023 10:48:35 -0300 Subject: [PATCH 2/4] build price calculator --- eUberUI.xcodeproj/project.pbxproj | 4 ++++ eUberUI/Core/Home/View/HomeView.swift | 6 +++++ .../Home/View/UberMapViewRepresentable.swift | 3 ++- .../ViewModel/LocationSearchViewModel.swift | 20 +++++++++++++++++ eUberUI/Core/Trips/View/Double.swift | 22 +++++++++++++++++++ eUberUI/Core/Trips/View/RideRequestView.swift | 3 ++- eUberUI/Core/Trips/View/RideType.swift | 22 ++++++++++++++++--- eUberUI/Managers/LocationManager.swift | 5 ++++- 8 files changed, 79 insertions(+), 6 deletions(-) create mode 100644 eUberUI/Core/Trips/View/Double.swift diff --git a/eUberUI.xcodeproj/project.pbxproj b/eUberUI.xcodeproj/project.pbxproj index 86727db..de08ea2 100644 --- a/eUberUI.xcodeproj/project.pbxproj +++ b/eUberUI.xcodeproj/project.pbxproj @@ -10,6 +10,7 @@ C91BB1442A16BDC000C0B971 /* RideRequestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C91BB1432A16BDC000C0B971 /* RideRequestView.swift */; }; C97221BD2A169FD40014EABA /* MapViewState.swift in Sources */ = {isa = PBXBuildFile; fileRef = C97221BC2A169FD40014EABA /* MapViewState.swift */; }; C9AA5E762A1C113E00824737 /* RideType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9AA5E752A1C113E00824737 /* RideType.swift */; }; + C9AA5E782A1CFA5600824737 /* Double.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9AA5E772A1CFA5600824737 /* Double.swift */; }; C9CFFE442A15179E00708A15 /* eUberUIApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9CFFE432A15179E00708A15 /* eUberUIApp.swift */; }; C9CFFE482A1517A200708A15 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C9CFFE472A1517A200708A15 /* Assets.xcassets */; }; C9CFFE4B2A1517A200708A15 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C9CFFE4A2A1517A200708A15 /* Preview Assets.xcassets */; }; @@ -48,6 +49,7 @@ C91BB1432A16BDC000C0B971 /* RideRequestView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RideRequestView.swift; sourceTree = ""; }; C97221BC2A169FD40014EABA /* MapViewState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = MapViewState.swift; path = ../../../../../../../Users/lucashubert/Downloads/MapViewState.swift; sourceTree = ""; }; C9AA5E752A1C113E00824737 /* RideType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = RideType.swift; path = eUberUI/Core/Trips/View/RideType.swift; sourceTree = SOURCE_ROOT; }; + C9AA5E772A1CFA5600824737 /* Double.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = Double.swift; path = eUberUI/Core/Trips/View/Double.swift; sourceTree = SOURCE_ROOT; }; C9CFFE402A15179E00708A15 /* eUberUI.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = eUberUI.app; sourceTree = BUILT_PRODUCTS_DIR; }; C9CFFE432A15179E00708A15 /* eUberUIApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = eUberUIApp.swift; sourceTree = ""; }; C9CFFE472A1517A200708A15 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; @@ -191,6 +193,7 @@ C9CFFE772A151CB500708A15 /* Extensions */ = { isa = PBXGroup; children = ( + C9AA5E772A1CFA5600824737 /* Double.swift */, ); path = Extensions; sourceTree = ""; @@ -402,6 +405,7 @@ C9CFFE812A151F7400708A15 /* LocationManager.swift in Sources */, C9CFFE502A1517A200708A15 /* eUberUI.xcdatamodeld in Sources */, C9CFFE8F2A154F1900708A15 /* LocationSearchViewModel.swift in Sources */, + C9AA5E782A1CFA5600824737 /* Double.swift in Sources */, C97221BD2A169FD40014EABA /* MapViewState.swift in Sources */, C9CFFE8D2A15447800708A15 /* LocationSearchResultCell.swift in Sources */, C9CFFE442A15179E00708A15 /* eUberUIApp.swift in Sources */, diff --git a/eUberUI/Core/Home/View/HomeView.swift b/eUberUI/Core/Home/View/HomeView.swift index cbb2d74..f8b10bc 100644 --- a/eUberUI/Core/Home/View/HomeView.swift +++ b/eUberUI/Core/Home/View/HomeView.swift @@ -9,6 +9,7 @@ import SwiftUI struct HomeView: View { @State private var mapState = MapViewState.noInput + @EnvironmentObject var locationViewModel: LocationSearchViewModel var body: some View { ZStack(alignment: .bottom) { @@ -37,6 +38,11 @@ struct HomeView: View { .transition(.move(edge: .bottom)) } }.edgesIgnoringSafeArea(.bottom) + .onReceive(LocationManager.shared.$userLocation) { location in + if let location = location { + locationViewModel.userLocation = location + } + } } } diff --git a/eUberUI/Core/Home/View/UberMapViewRepresentable.swift b/eUberUI/Core/Home/View/UberMapViewRepresentable.swift index 167c6bf..7b4d04e 100644 --- a/eUberUI/Core/Home/View/UberMapViewRepresentable.swift +++ b/eUberUI/Core/Home/View/UberMapViewRepresentable.swift @@ -10,7 +10,7 @@ import MapKit struct UberMapViewRepresentable: UIViewRepresentable { let mapView = MKMapView() - let locationManager = LocationManager() + let locationManager = LocationManager.shared @Binding var mapState: MapViewState @EnvironmentObject var locationViewModel: LocationSearchViewModel @@ -37,6 +37,7 @@ struct UberMapViewRepresentable: UIViewRepresentable { context.coordinator.addAndSelectAnnotation(withCoordinate: coordinate) context.coordinator.configurePolyline(withDestinationCoordinate: coordinate) } + break } } diff --git a/eUberUI/Core/LocationSearch/ViewModel/LocationSearchViewModel.swift b/eUberUI/Core/LocationSearch/ViewModel/LocationSearchViewModel.swift index 33aad5e..7f47b10 100644 --- a/eUberUI/Core/LocationSearch/ViewModel/LocationSearchViewModel.swift +++ b/eUberUI/Core/LocationSearch/ViewModel/LocationSearchViewModel.swift @@ -21,6 +21,8 @@ class LocationSearchViewModel: NSObject, ObservableObject { } } + var userLocation: CLLocationCoordinate2D? + override init() { super.init() searchCompleter.delegate = self @@ -51,6 +53,24 @@ class LocationSearchViewModel: NSObject, ObservableObject { search.start(completionHandler: completion) } + func computeRidePrice(forType type: RideType) -> Double { + guard let destCoordinate = selectedLocationCoordinate else { return 0.0 } + guard let userCoordinate = self.userLocation else { return 0.0 } + + let userLocation = CLLocation( + latitude: userCoordinate.latitude, + longitude: userCoordinate.longitude + ) + + let destination = CLLocation( + latitude: destCoordinate.latitude, + longitude: destCoordinate.longitude + ) + + let tripDistanceInMeters = userLocation.distance(from: destination) + return type.computePrice(for: tripDistanceInMeters) + } + } // MARK: - MKLocalSearchCompleterDelegate diff --git a/eUberUI/Core/Trips/View/Double.swift b/eUberUI/Core/Trips/View/Double.swift new file mode 100644 index 0000000..fba1230 --- /dev/null +++ b/eUberUI/Core/Trips/View/Double.swift @@ -0,0 +1,22 @@ +// +// Double.swift +// eUberUI +// +// Created by Lucas Hubert on 23/05/23. +// + +import Foundation + +extension Double { + private var currencyFormatter: NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .currency + formatter.minimumFractionDigits = 2 + formatter.maximumFractionDigits = 2 + return formatter + } + + func toCurrency() -> String { + return currencyFormatter.string(for: self) ?? "" + } +} diff --git a/eUberUI/Core/Trips/View/RideRequestView.swift b/eUberUI/Core/Trips/View/RideRequestView.swift index 2779cae..eb5ae0a 100644 --- a/eUberUI/Core/Trips/View/RideRequestView.swift +++ b/eUberUI/Core/Trips/View/RideRequestView.swift @@ -10,6 +10,7 @@ import SwiftUI struct RideRequestView: View { @State private var selectedRideType: RideType = .eUberX + @EnvironmentObject var locationViewModel: LocationSearchViewModel var body: some View { VStack { @@ -92,7 +93,7 @@ struct RideRequestView: View { Text(rideType.description) .font(.system(size: 14, weight: .semibold)) - Text("$ 5.80") + Text(locationViewModel.computeRidePrice(forType: rideType).toCurrency()) .font(.system(size: 14, weight: .semibold)) } } diff --git a/eUberUI/Core/Trips/View/RideType.swift b/eUberUI/Core/Trips/View/RideType.swift index 72055c1..2466812 100644 --- a/eUberUI/Core/Trips/View/RideType.swift +++ b/eUberUI/Core/Trips/View/RideType.swift @@ -10,7 +10,7 @@ import Foundation enum RideType: Int, CaseIterable, Identifiable { case eUberX case eUberPlus - case eUbertBike + case eUberBike var id: Int { return rawValue } @@ -18,7 +18,7 @@ enum RideType: Int, CaseIterable, Identifiable { switch self { case .eUberX: return "eUber X" case .eUberPlus: return "eUber Plus" - case .eUbertBike: return "eUber Bike" + case .eUberBike: return "eUber Bike" } } @@ -26,8 +26,24 @@ enum RideType: Int, CaseIterable, Identifiable { switch self { case .eUberX: return "hatchback" case .eUberPlus: return "suv" - case .eUbertBike: return "motorbike" + case .eUberBike: return "motorbike" } } + var baseFare: Double { + switch self { + case .eUberBike: return 5 + case .eUberPlus: return 20 + case .eUberX: return 10 + } + } + + func computePrice(for distanceInMeters: Double) -> Double { + let distanceInMiles = distanceInMeters / 1600 + switch self { + case .eUberBike: return distanceInMiles * 1.5 + baseFare + case .eUberX: return distanceInMiles * 2.0 + baseFare + case .eUberPlus: return distanceInMiles * 2.3 + baseFare + } + } } diff --git a/eUberUI/Managers/LocationManager.swift b/eUberUI/Managers/LocationManager.swift index a097f18..7ceace5 100644 --- a/eUberUI/Managers/LocationManager.swift +++ b/eUberUI/Managers/LocationManager.swift @@ -9,6 +9,8 @@ import CoreLocation class LocationManager: NSObject, ObservableObject { private let locationManager = CLLocationManager() + static let shared = LocationManager() + @Published var userLocation: CLLocationCoordinate2D? override init() { super.init() @@ -21,7 +23,8 @@ class LocationManager: NSObject, ObservableObject { extension LocationManager: CLLocationManagerDelegate { func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { - guard !locations.isEmpty else { return } + guard let loc = locations.first else { return } + self.userLocation = loc.coordinate locationManager.stopUpdatingLocation() } } From b9a049ca14444de2911a963c8bd8f4ef4d3f0df1 Mon Sep 17 00:00:00 2001 From: Lucas Jorge Hubert Date: Tue, 23 May 2023 11:34:20 -0300 Subject: [PATCH 3/4] Implement Uber ride detail and destination title --- eUberUI.xcodeproj/project.pbxproj | 4 ++++ eUberUI/Core/Home/View/MapViewActionButton.swift | 2 +- .../Core/Home/View/UberMapViewRepresentable.swift | 2 +- .../ViewModel/LocationSearchViewModel.swift | 6 +++--- eUberUI/Core/Trips/View/EUberLocation.swift | 13 +++++++++++++ eUberUI/Core/Trips/View/RideRequestView.swift | 10 ++++++---- 6 files changed, 28 insertions(+), 9 deletions(-) create mode 100644 eUberUI/Core/Trips/View/EUberLocation.swift diff --git a/eUberUI.xcodeproj/project.pbxproj b/eUberUI.xcodeproj/project.pbxproj index de08ea2..6eb1cb1 100644 --- a/eUberUI.xcodeproj/project.pbxproj +++ b/eUberUI.xcodeproj/project.pbxproj @@ -11,6 +11,7 @@ C97221BD2A169FD40014EABA /* MapViewState.swift in Sources */ = {isa = PBXBuildFile; fileRef = C97221BC2A169FD40014EABA /* MapViewState.swift */; }; C9AA5E762A1C113E00824737 /* RideType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9AA5E752A1C113E00824737 /* RideType.swift */; }; C9AA5E782A1CFA5600824737 /* Double.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9AA5E772A1CFA5600824737 /* Double.swift */; }; + C9AA5E7A2A1CFCD900824737 /* EUberLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9AA5E792A1CFCD900824737 /* EUberLocation.swift */; }; C9CFFE442A15179E00708A15 /* eUberUIApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9CFFE432A15179E00708A15 /* eUberUIApp.swift */; }; C9CFFE482A1517A200708A15 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C9CFFE472A1517A200708A15 /* Assets.xcassets */; }; C9CFFE4B2A1517A200708A15 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C9CFFE4A2A1517A200708A15 /* Preview Assets.xcassets */; }; @@ -50,6 +51,7 @@ C97221BC2A169FD40014EABA /* MapViewState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = MapViewState.swift; path = ../../../../../../../Users/lucashubert/Downloads/MapViewState.swift; sourceTree = ""; }; C9AA5E752A1C113E00824737 /* RideType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = RideType.swift; path = eUberUI/Core/Trips/View/RideType.swift; sourceTree = SOURCE_ROOT; }; C9AA5E772A1CFA5600824737 /* Double.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = Double.swift; path = eUberUI/Core/Trips/View/Double.swift; sourceTree = SOURCE_ROOT; }; + C9AA5E792A1CFCD900824737 /* EUberLocation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = EUberLocation.swift; path = eUberUI/Core/Trips/View/EUberLocation.swift; sourceTree = SOURCE_ROOT; }; C9CFFE402A15179E00708A15 /* eUberUI.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = eUberUI.app; sourceTree = BUILT_PRODUCTS_DIR; }; C9CFFE432A15179E00708A15 /* eUberUIApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = eUberUIApp.swift; sourceTree = ""; }; C9CFFE472A1517A200708A15 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; @@ -186,6 +188,7 @@ children = ( C97221BC2A169FD40014EABA /* MapViewState.swift */, C9AA5E752A1C113E00824737 /* RideType.swift */, + C9AA5E792A1CFCD900824737 /* EUberLocation.swift */, ); path = Models; sourceTree = ""; @@ -400,6 +403,7 @@ buildActionMask = 2147483647; files = ( C9CFFE8B2A15410900708A15 /* LocationSearchView.swift in Sources */, + C9AA5E7A2A1CFCD900824737 /* EUberLocation.swift in Sources */, C9AA5E762A1C113E00824737 /* RideType.swift in Sources */, C9CFFE7D2A151D2400708A15 /* HomeView.swift in Sources */, C9CFFE812A151F7400708A15 /* LocationManager.swift in Sources */, diff --git a/eUberUI/Core/Home/View/MapViewActionButton.swift b/eUberUI/Core/Home/View/MapViewActionButton.swift index b53593f..3bb68da 100644 --- a/eUberUI/Core/Home/View/MapViewActionButton.swift +++ b/eUberUI/Core/Home/View/MapViewActionButton.swift @@ -37,7 +37,7 @@ struct MapViewActionButton: View { case .searchingForLocation: mapState = .noInput case .locationSelected: - viewModel.selectedLocationCoordinate = nil + viewModel.selectedEUberLocation = nil mapState = .noInput } } diff --git a/eUberUI/Core/Home/View/UberMapViewRepresentable.swift b/eUberUI/Core/Home/View/UberMapViewRepresentable.swift index 7b4d04e..54b9644 100644 --- a/eUberUI/Core/Home/View/UberMapViewRepresentable.swift +++ b/eUberUI/Core/Home/View/UberMapViewRepresentable.swift @@ -33,7 +33,7 @@ struct UberMapViewRepresentable: UIViewRepresentable { case .searchingForLocation: break case .locationSelected: - if let coordinate = locationViewModel.selectedLocationCoordinate { + if let coordinate = locationViewModel.selectedEUberLocation?.coordinate { context.coordinator.addAndSelectAnnotation(withCoordinate: coordinate) context.coordinator.configurePolyline(withDestinationCoordinate: coordinate) } diff --git a/eUberUI/Core/LocationSearch/ViewModel/LocationSearchViewModel.swift b/eUberUI/Core/LocationSearch/ViewModel/LocationSearchViewModel.swift index 7f47b10..0d5f0dc 100644 --- a/eUberUI/Core/LocationSearch/ViewModel/LocationSearchViewModel.swift +++ b/eUberUI/Core/LocationSearch/ViewModel/LocationSearchViewModel.swift @@ -11,7 +11,7 @@ import MapKit class LocationSearchViewModel: NSObject, ObservableObject { @Published var resuls = [MKLocalSearchCompletion]() - @Published var selectedLocationCoordinate: CLLocationCoordinate2D? + @Published var selectedEUberLocation: EUberLocation? private let searchCompleter = MKLocalSearchCompleter() @@ -39,7 +39,7 @@ class LocationSearchViewModel: NSObject, ObservableObject { } guard let item = response?.mapItems.first else { return } let coordinate = item.placemark.coordinate - self.selectedLocationCoordinate = coordinate + self.selectedEUberLocation = EUberLocation(title: localSearch.title, coordinate: coordinate) print("DEBUG: Location coordinates \(coordinate)") } @@ -54,7 +54,7 @@ class LocationSearchViewModel: NSObject, ObservableObject { } func computeRidePrice(forType type: RideType) -> Double { - guard let destCoordinate = selectedLocationCoordinate else { return 0.0 } + guard let destCoordinate = selectedEUberLocation?.coordinate else { return 0.0 } guard let userCoordinate = self.userLocation else { return 0.0 } let userLocation = CLLocation( diff --git a/eUberUI/Core/Trips/View/EUberLocation.swift b/eUberUI/Core/Trips/View/EUberLocation.swift new file mode 100644 index 0000000..8431276 --- /dev/null +++ b/eUberUI/Core/Trips/View/EUberLocation.swift @@ -0,0 +1,13 @@ +// +// EUberLocation.swift +// eUberUI +// +// Created by Lucas Hubert on 23/05/23. +// + +import CoreLocation + +struct EUberLocation { + let title: String + let coordinate: CLLocationCoordinate2D +} diff --git a/eUberUI/Core/Trips/View/RideRequestView.swift b/eUberUI/Core/Trips/View/RideRequestView.swift index eb5ae0a..e75c8ca 100644 --- a/eUberUI/Core/Trips/View/RideRequestView.swift +++ b/eUberUI/Core/Trips/View/RideRequestView.swift @@ -17,7 +17,7 @@ struct RideRequestView: View { Capsule() .foregroundColor((Color(.systemYellow))) .frame(width: 48, height: 8) - .opacity(0.6) + .opacity(0.3) .padding(.vertical, 8) HStack { @@ -52,9 +52,11 @@ struct RideRequestView: View { .padding(.bottom, 10) HStack { - Text("Destination location") - .font(.system(size: 16, weight: .semibold)) - .foregroundColor(.gray) + if let location = locationViewModel.selectedEUberLocation { + Text(location.title) + .font(.system(size: 16, weight: .semibold)) + .foregroundColor(.gray) + } Spacer() From 977f200f3022278bae7f8a3b32353daa0a2fa3be Mon Sep 17 00:00:00 2001 From: Lucas Jorge Hubert Date: Tue, 23 May 2023 13:00:01 -0300 Subject: [PATCH 4/4] finish refactor and dark theme adapter --- eUberUI.xcodeproj/project.pbxproj | 4 ++ .../BackgroundColor.colorset/Contents.json | 38 +++++++++++++++++++ eUberUI/Assets.xcassets/Colors/Contents.json | 6 +++ .../PrimaryTextColor.colorset/Contents.json | 38 +++++++++++++++++++ .../Contents.json | 38 +++++++++++++++++++ eUberUI/Core/Home/View/HomeView.swift | 2 +- .../Core/Home/View/MapViewActionButton.swift | 4 +- .../Home/View/UberMapViewRepresentable.swift | 27 ++----------- .../View/LocationSearchView.swift | 2 +- .../ViewModel/LocationSearchViewModel.swift | 33 ++++++++++++++++ eUberUI/Core/Trips/View/Color.swift | 18 +++++++++ eUberUI/Core/Trips/View/RideRequestView.swift | 9 +++-- 12 files changed, 187 insertions(+), 32 deletions(-) create mode 100644 eUberUI/Assets.xcassets/Colors/BackgroundColor.colorset/Contents.json create mode 100644 eUberUI/Assets.xcassets/Colors/Contents.json create mode 100644 eUberUI/Assets.xcassets/Colors/PrimaryTextColor.colorset/Contents.json create mode 100644 eUberUI/Assets.xcassets/Colors/SecondaryBackgroundColor.colorset/Contents.json create mode 100644 eUberUI/Core/Trips/View/Color.swift diff --git a/eUberUI.xcodeproj/project.pbxproj b/eUberUI.xcodeproj/project.pbxproj index 6eb1cb1..8a2353c 100644 --- a/eUberUI.xcodeproj/project.pbxproj +++ b/eUberUI.xcodeproj/project.pbxproj @@ -27,6 +27,7 @@ C9CFFE8B2A15410900708A15 /* LocationSearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9CFFE8A2A15410900708A15 /* LocationSearchView.swift */; }; C9CFFE8D2A15447800708A15 /* LocationSearchResultCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9CFFE8C2A15447800708A15 /* LocationSearchResultCell.swift */; }; C9CFFE8F2A154F1900708A15 /* LocationSearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9CFFE8E2A154F1900708A15 /* LocationSearchViewModel.swift */; }; + C9DD5C842A1D0B4500B357DB /* Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DD5C832A1D0B4500B357DB /* Color.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -71,6 +72,7 @@ C9CFFE8A2A15410900708A15 /* LocationSearchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationSearchView.swift; sourceTree = ""; }; C9CFFE8C2A15447800708A15 /* LocationSearchResultCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationSearchResultCell.swift; sourceTree = ""; }; C9CFFE8E2A154F1900708A15 /* LocationSearchViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationSearchViewModel.swift; sourceTree = ""; }; + C9DD5C832A1D0B4500B357DB /* Color.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = Color.swift; path = eUberUI/Core/Trips/View/Color.swift; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -197,6 +199,7 @@ isa = PBXGroup; children = ( C9AA5E772A1CFA5600824737 /* Double.swift */, + C9DD5C832A1D0B4500B357DB /* Color.swift */, ); path = Extensions; sourceTree = ""; @@ -407,6 +410,7 @@ C9AA5E762A1C113E00824737 /* RideType.swift in Sources */, C9CFFE7D2A151D2400708A15 /* HomeView.swift in Sources */, C9CFFE812A151F7400708A15 /* LocationManager.swift in Sources */, + C9DD5C842A1D0B4500B357DB /* Color.swift in Sources */, C9CFFE502A1517A200708A15 /* eUberUI.xcdatamodeld in Sources */, C9CFFE8F2A154F1900708A15 /* LocationSearchViewModel.swift in Sources */, C9AA5E782A1CFA5600824737 /* Double.swift in Sources */, diff --git a/eUberUI/Assets.xcassets/Colors/BackgroundColor.colorset/Contents.json b/eUberUI/Assets.xcassets/Colors/BackgroundColor.colorset/Contents.json new file mode 100644 index 0000000..aa42afa --- /dev/null +++ b/eUberUI/Assets.xcassets/Colors/BackgroundColor.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "1.000", + "red" : "1.000" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.130", + "green" : "0.130", + "red" : "0.130" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/eUberUI/Assets.xcassets/Colors/Contents.json b/eUberUI/Assets.xcassets/Colors/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/eUberUI/Assets.xcassets/Colors/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/eUberUI/Assets.xcassets/Colors/PrimaryTextColor.colorset/Contents.json b/eUberUI/Assets.xcassets/Colors/PrimaryTextColor.colorset/Contents.json new file mode 100644 index 0000000..8e26632 --- /dev/null +++ b/eUberUI/Assets.xcassets/Colors/PrimaryTextColor.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.130", + "green" : "0.130", + "red" : "0.130" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "1.000", + "red" : "1.000" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/eUberUI/Assets.xcassets/Colors/SecondaryBackgroundColor.colorset/Contents.json b/eUberUI/Assets.xcassets/Colors/SecondaryBackgroundColor.colorset/Contents.json new file mode 100644 index 0000000..6ee398c --- /dev/null +++ b/eUberUI/Assets.xcassets/Colors/SecondaryBackgroundColor.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.921", + "green" : "0.921", + "red" : "0.921" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.261", + "green" : "0.261", + "red" : "0.261" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/eUberUI/Core/Home/View/HomeView.swift b/eUberUI/Core/Home/View/HomeView.swift index f8b10bc..61b9022 100644 --- a/eUberUI/Core/Home/View/HomeView.swift +++ b/eUberUI/Core/Home/View/HomeView.swift @@ -33,7 +33,7 @@ struct HomeView: View { .padding(.leading) .padding(.top, 4) } - if mapState == .locationSelected { + if mapState == .locationSelected || mapState == .polylineAdded { RideRequestView() .transition(.move(edge: .bottom)) } diff --git a/eUberUI/Core/Home/View/MapViewActionButton.swift b/eUberUI/Core/Home/View/MapViewActionButton.swift index 3bb68da..2b85f98 100644 --- a/eUberUI/Core/Home/View/MapViewActionButton.swift +++ b/eUberUI/Core/Home/View/MapViewActionButton.swift @@ -36,7 +36,7 @@ struct MapViewActionButton: View { print("DEBUG: No input") case .searchingForLocation: mapState = .noInput - case .locationSelected: + case .locationSelected, .polylineAdded: viewModel.selectedEUberLocation = nil mapState = .noInput } @@ -46,7 +46,7 @@ struct MapViewActionButton: View { switch state { case .noInput: return "line.3.horizontal" - case .searchingForLocation, .locationSelected: + case .searchingForLocation, .locationSelected, .polylineAdded: return "arrow.left" } } diff --git a/eUberUI/Core/Home/View/UberMapViewRepresentable.swift b/eUberUI/Core/Home/View/UberMapViewRepresentable.swift index 54b9644..b6f8b5c 100644 --- a/eUberUI/Core/Home/View/UberMapViewRepresentable.swift +++ b/eUberUI/Core/Home/View/UberMapViewRepresentable.swift @@ -30,7 +30,7 @@ struct UberMapViewRepresentable: UIViewRepresentable { case .noInput: context.coordinator.clearMapViewAndRecenterOnUserLocation() break - case .searchingForLocation: + case .searchingForLocation, .polylineAdded: break case .locationSelected: if let coordinate = locationViewModel.selectedEUberLocation?.coordinate { @@ -97,8 +97,9 @@ extension UberMapViewRepresentable { func configurePolyline(withDestinationCoordinate coordinate: CLLocationCoordinate2D) { guard let userLocationCoordinate = self.userLocationCoordinate else { return } - getDestinationRoute(from: userLocationCoordinate, to: coordinate) { route in + self.parent.locationViewModel.getDestinationRoute(from: userLocationCoordinate, to: coordinate) { route in self.parent.mapView.addOverlay(route.polyline) + self.parent.mapState = .polylineAdded let rect = self.parent.mapView.mapRectThatFits( route.polyline.boundingMapRect, edgePadding: .init( @@ -113,28 +114,6 @@ extension UberMapViewRepresentable { } } - func getDestinationRoute( - from userLocation: CLLocationCoordinate2D, - to destination: CLLocationCoordinate2D, - completion: @escaping(MKRoute) -> Void - ) { - let userPlacemark = MKPlacemark(coordinate: userLocation) - let userDestination = MKPlacemark(coordinate: destination) - let request = MKDirections.Request() - request.source = MKMapItem(placemark: userPlacemark) - request.destination = MKMapItem(placemark: userDestination) - let direction = MKDirections(request: request) - - direction.calculate { response, error in - if let error = error { - print("DEBUG: Failed to get direction with error \(error.localizedDescription)") - } - - guard let route = response?.routes.first else { return } - completion(route) - } - } - func clearMapViewAndRecenterOnUserLocation() { parent.mapView.removeAnnotations(parent.mapView.annotations) parent.mapView.removeOverlays(parent.mapView.overlays) diff --git a/eUberUI/Core/LocationSearch/View/LocationSearchView.swift b/eUberUI/Core/LocationSearch/View/LocationSearchView.swift index bc19bc7..80103a7 100644 --- a/eUberUI/Core/LocationSearch/View/LocationSearchView.swift +++ b/eUberUI/Core/LocationSearch/View/LocationSearchView.swift @@ -67,7 +67,7 @@ struct LocationSearchView: View { } } } - .background(.white) + .background(Color.theme.backgroundColor) .opacity(0.9) } } diff --git a/eUberUI/Core/LocationSearch/ViewModel/LocationSearchViewModel.swift b/eUberUI/Core/LocationSearch/ViewModel/LocationSearchViewModel.swift index 0d5f0dc..515266a 100644 --- a/eUberUI/Core/LocationSearch/ViewModel/LocationSearchViewModel.swift +++ b/eUberUI/Core/LocationSearch/ViewModel/LocationSearchViewModel.swift @@ -12,6 +12,8 @@ class LocationSearchViewModel: NSObject, ObservableObject { @Published var resuls = [MKLocalSearchCompletion]() @Published var selectedEUberLocation: EUberLocation? + @Published var pickupTime: String? + @Published var dropOffTime: String? private let searchCompleter = MKLocalSearchCompleter() @@ -71,6 +73,37 @@ class LocationSearchViewModel: NSObject, ObservableObject { return type.computePrice(for: tripDistanceInMeters) } + func getDestinationRoute( + from userLocation: CLLocationCoordinate2D, + to destination: CLLocationCoordinate2D, + completion: @escaping(MKRoute) -> Void + ) { + let userPlacemark = MKPlacemark(coordinate: userLocation) + let userDestination = MKPlacemark(coordinate: destination) + let request = MKDirections.Request() + request.source = MKMapItem(placemark: userPlacemark) + request.destination = MKMapItem(placemark: userDestination) + let direction = MKDirections(request: request) + + direction.calculate { response, error in + if let error = error { + print("DEBUG: Failed to get direction with error \(error.localizedDescription)") + } + + guard let route = response?.routes.first else { return } + self.configurePickupAndDropOffTimes(with: route.expectedTravelTime) + completion(route) + } + } + + func configurePickupAndDropOffTimes(with expectedTravelTime: Double) { + let formatter = DateFormatter() + formatter.dateFormat = "hh:mm a" + + pickupTime = formatter.string(from: Date()) + dropOffTime = formatter.string(from: Date() + expectedTravelTime) + } + } // MARK: - MKLocalSearchCompleterDelegate diff --git a/eUberUI/Core/Trips/View/Color.swift b/eUberUI/Core/Trips/View/Color.swift new file mode 100644 index 0000000..9e293b5 --- /dev/null +++ b/eUberUI/Core/Trips/View/Color.swift @@ -0,0 +1,18 @@ +// +// Color.swift +// eUberUI +// +// Created by Lucas Hubert on 23/05/23. +// + +import SwiftUI + +extension Color { + static let theme = ColorTheme() +} + +struct ColorTheme { + let backgroundColor = Color("BackgroundColor") + let secondaryBackgroundColor = Color("SecondaryBackgroundColor") + let primaryTextColor = Color("PrimaryTextColor") +} diff --git a/eUberUI/Core/Trips/View/RideRequestView.swift b/eUberUI/Core/Trips/View/RideRequestView.swift index e75c8ca..dac5eee 100644 --- a/eUberUI/Core/Trips/View/RideRequestView.swift +++ b/eUberUI/Core/Trips/View/RideRequestView.swift @@ -45,7 +45,7 @@ struct RideRequestView: View { Spacer() - Text("01:30 PM") + Text(locationViewModel.pickupTime ?? "-") .font(.system(size: 14, weight: .bold)) .foregroundColor(.gray) } @@ -60,7 +60,7 @@ struct RideRequestView: View { Spacer() - Text("01:40 PM") + Text(locationViewModel.dropOffTime ?? "-") .font(.system(size: 14, weight: .bold)) .foregroundColor(.gray) } @@ -101,7 +101,8 @@ struct RideRequestView: View { } .padding(.top, 8) .frame(width: 112, height: 140) - .background(Color(rideType == selectedRideType ? .systemYellow : .systemGroupedBackground)) + .foregroundColor(rideType == selectedRideType ? .black : Color.theme.primaryTextColor) + .background(rideType == selectedRideType ? .yellow : Color.theme.secondaryBackgroundColor) .scaleEffect(rideType == selectedRideType ? 1.1 : 1.0) .cornerRadius(10) .onTapGesture { @@ -152,7 +153,7 @@ struct RideRequestView: View { } .padding(.bottom, 24) - .background(.white) + .background(Color.theme.backgroundColor) .cornerRadius(16) } }