From d239bbc135e5615ddde8e2799e6ad23b2abe5e3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Sch=C3=B6nig?= Date: Wed, 1 Nov 2023 14:59:56 +1100 Subject: [PATCH] Refactoring (#310) - Add and use `.asAssertingSignal()` - Add `.with()` and `TKUITriggerResult` (not yet used) --- Sources/TripKitUI/cards/TKUIHomeCard.swift | 6 ++-- .../cards/TKUIRoutingQueryInputCard.swift | 6 ++-- .../cards/TKUIRoutingResultsCard.swift | 10 +++--- .../cards/TKUIRoutingResultsMapManager.swift | 6 ++-- Sources/TripKitUI/cards/TKUITableCard.swift | 2 +- .../TripKitUI/cards/TKUITimetableCard.swift | 4 +-- .../TripKitUI/cards/TKUITripMapManager.swift | 2 +- .../cards/TKUITripOverviewCard.swift | 4 +-- .../TKUIAutocompletionViewController.swift | 4 +-- Sources/TripKitUI/helper/RxHelpers.swift | 19 +++++++++++ .../helper/TKUIInteractionResult.swift | 34 +++++++++++++++++++ .../TKUIAutocompletionViewModel.swift | 6 ++-- .../TKUIHomeCardCustomizationViewModel.swift | 2 +- .../view model/TKUIHomeViewModel+Next.swift | 2 +- .../view model/TKUINearbyViewModel.swift | 4 +-- .../TKUIRoutingQueryInputViewModel.swift | 8 ++--- .../TKUIRoutingResultsViewModel.swift | 10 +++--- .../TKUITripOverviewViewModel.swift | 2 +- Sources/TripKitUI/views/TKUIModePicker.swift | 2 +- .../views/results/TKUIResultsTitleView.swift | 2 +- .../TKUIRoutingQueryInputTitleView.swift | 4 +-- TripKit.xcodeproj/project.pbxproj | 4 +++ 22 files changed, 100 insertions(+), 43 deletions(-) create mode 100644 Sources/TripKitUI/helper/TKUIInteractionResult.swift diff --git a/Sources/TripKitUI/cards/TKUIHomeCard.swift b/Sources/TripKitUI/cards/TKUIHomeCard.swift index 53a853d14..9dda66379 100644 --- a/Sources/TripKitUI/cards/TKUIHomeCard.swift +++ b/Sources/TripKitUI/cards/TKUIHomeCard.swift @@ -152,14 +152,14 @@ open class TKUIHomeCard: TKUITableCard { searchInProgress: searchInProgress.startWith(false).asDriver(onErrorJustReturn: false), searchText: searchTextPublisher, itemSelected: selectedItem(in: tableView, dataSource: dataSource), - itemAccessoryTapped: cellAccessoryTapped.asSignal(onErrorSignalWith: .empty()), - refresh: refreshPublisher.asSignal(onErrorSignalWith: .never()), + itemAccessoryTapped: cellAccessoryTapped.asAssertingSignal(), + refresh: refreshPublisher.asAssertingSignal(), biasMapRect: homeMapManager.mapRect.startWith(.null) ) viewModel = TKUIHomeViewModel( componentViewModels: components, - actionInput: actionTriggered.asSignal(onErrorSignalWith: .empty()), + actionInput: actionTriggered.asAssertingSignal(), searchInput: searchInput ) diff --git a/Sources/TripKitUI/cards/TKUIRoutingQueryInputCard.swift b/Sources/TripKitUI/cards/TKUIRoutingQueryInputCard.swift index be0a026c0..3717139d3 100644 --- a/Sources/TripKitUI/cards/TKUIRoutingQueryInputCard.swift +++ b/Sources/TripKitUI/cards/TKUIRoutingQueryInputCard.swift @@ -91,7 +91,7 @@ public class TKUIRoutingQueryInputCard: TKUITableCard { let route = Signal.merge( titleView.rx.route, - routeTriggered.asSignal(onErrorSignalWith: .empty()) + routeTriggered.asAssertingSignal() ) viewModel = TKUIRoutingQueryInputViewModel( @@ -105,8 +105,8 @@ public class TKUIRoutingQueryInputCard: TKUITableCard { selected: selectedItem(in: tableView, dataSource: dataSource), selectedSearchMode: titleView.rx.selectedSearchMode, tappedSwap: titleView.swapButton.rx.tap.asSignal(), - accessoryTapped: accessoryTapped?.asSignal(onErrorSignalWith: .empty()), - accessoryCallback: accessoryCallback.asSignal(onErrorSignalWith: .empty()) + accessoryTapped: accessoryTapped?.asAssertingSignal(), + accessoryCallback: accessoryCallback.asAssertingSignal() ) ) diff --git a/Sources/TripKitUI/cards/TKUIRoutingResultsCard.swift b/Sources/TripKitUI/cards/TKUIRoutingResultsCard.swift index fb88cf46f..70269ebea 100644 --- a/Sources/TripKitUI/cards/TKUIRoutingResultsCard.swift +++ b/Sources/TripKitUI/cards/TKUIRoutingResultsCard.swift @@ -186,15 +186,15 @@ public class TKUIRoutingResultsCard: TKUITableCard { let inputs: TKUIRoutingResultsViewModel.UIInput = ( selected: selectedItem(in: tableView, dataSource: dataSource), - tappedSectionButton: tappedSectionButton.asSignal(onErrorSignalWith: .empty()), - tappedSearch: searchTriggers.asSignal(onErrorSignalWith: .empty()), + tappedSectionButton: tappedSectionButton.asAssertingSignal(), + tappedSearch: searchTriggers.asAssertingSignal(), tappedDate: accessoryView.timeButton.rx.tap.asSignal(), tappedShowModes: accessoryView.transportButton.rx.tap.asSignal(), tappedShowModeOptions: .empty(), - changedDate: changedTime.asSignal(onErrorSignalWith: .empty()), - changedModes: changedModes.asSignal(onErrorSignalWith: .empty()), + changedDate: changedTime.asAssertingSignal(), + changedModes: changedModes.asAssertingSignal(), changedSortOrder: .empty(), - changedSearch: changedSearch.asSignal(onErrorSignalWith: .empty()) + changedSearch: changedSearch.asAssertingSignal() ) let mapInput: TKUIRoutingResultsViewModel.MapInput = ( diff --git a/Sources/TripKitUI/cards/TKUIRoutingResultsMapManager.swift b/Sources/TripKitUI/cards/TKUIRoutingResultsMapManager.swift index 706c11887..9d4093e0e 100644 --- a/Sources/TripKitUI/cards/TKUIRoutingResultsMapManager.swift +++ b/Sources/TripKitUI/cards/TKUIRoutingResultsMapManager.swift @@ -65,18 +65,18 @@ class TKUIRoutingResultsMapManager: TKUIMapManager, TKUIRoutingResultsMapManager private var dropPinRecognizer = UILongPressGestureRecognizer() private var droppedPinPublisher = PublishSubject() var droppedPin: Signal { - return droppedPinPublisher.asSignal(onErrorSignalWith: .empty()) + return droppedPinPublisher.asAssertingSignal() } private var tapRecognizer = UITapGestureRecognizer() private var selectedRoutePublisher = PublishSubject() var selectedMapRoute: Signal { - return selectedRoutePublisher.asSignal(onErrorSignalWith: .empty()) + return selectedRoutePublisher.asAssertingSignal() } private var tappedPinPublisher = PublishSubject<(MKAnnotation, TKUIRoutingResultsViewModel.SearchMode?)>() var tappedPin: Signal<(MKAnnotation, TKUIRoutingResultsViewModel.SearchMode?)> { - return tappedPinPublisher.asSignal(onErrorSignalWith: .empty()) + return tappedPinPublisher.asAssertingSignal() } private var disposeBag = DisposeBag() diff --git a/Sources/TripKitUI/cards/TKUITableCard.swift b/Sources/TripKitUI/cards/TKUITableCard.swift index e010a9413..2c5ae936a 100644 --- a/Sources/TripKitUI/cards/TKUITableCard.swift +++ b/Sources/TripKitUI/cards/TKUITableCard.swift @@ -34,7 +34,7 @@ open class TKUITableCard: TGTableCard { public func selectedIndex(in tableView: UITableView) -> Signal { #if targetEnvironment(macCatalyst) - return highlighted.asSignal(onErrorSignalWith: .empty()) + return highlighted.asAssertingSignal() #else return tableView.rx.itemSelected.asSignal() #endif diff --git a/Sources/TripKitUI/cards/TKUITimetableCard.swift b/Sources/TripKitUI/cards/TKUITimetableCard.swift index 01bc03408..5e124e906 100644 --- a/Sources/TripKitUI/cards/TKUITimetableCard.swift +++ b/Sources/TripKitUI/cards/TKUITimetableCard.swift @@ -181,14 +181,14 @@ public class TKUITimetableCard : TKUITableCard { let loadMoreAfter = loadMorePublisher .map { dataSource[$0] } - .asSignal(onErrorSignalWith: .empty()) + .asAssertingSignal() accessoryView.searchBar.text = filter let filterObservable = accessoryView.searchBar.rx.text.orEmpty let input: TKUITimetableViewModel.UIInput = ( selected: selectedItem(in: tableView, dataSource: dataSource), - showAlerts: cellAlertPublisher.asSignal(onErrorSignalWith: .empty()), + showAlerts: cellAlertPublisher.asAssertingSignal(), filter: filterObservable.asDriver(), date: datePublisher.asDriver(onErrorDriveWith: .empty()), refresh: .empty(), diff --git a/Sources/TripKitUI/cards/TKUITripMapManager.swift b/Sources/TripKitUI/cards/TKUITripMapManager.swift index a422a3880..52855fa7f 100644 --- a/Sources/TripKitUI/cards/TKUITripMapManager.swift +++ b/Sources/TripKitUI/cards/TKUITripMapManager.swift @@ -24,7 +24,7 @@ public class TKUITripMapManager: TKUIMapManager, TKUITripMapManagerType { private var dropPinRecognizer = UILongPressGestureRecognizer() private var droppedPinPublisher = PublishSubject() var droppedPin: Signal { - return droppedPinPublisher.asSignal(onErrorSignalWith: .empty()) + return droppedPinPublisher.asAssertingSignal() } private var disposeBag = DisposeBag() diff --git a/Sources/TripKitUI/cards/TKUITripOverviewCard.swift b/Sources/TripKitUI/cards/TKUITripOverviewCard.swift index 4d5aaf882..f4423fdbe 100644 --- a/Sources/TripKitUI/cards/TKUITripOverviewCard.swift +++ b/Sources/TripKitUI/cards/TKUITripOverviewCard.swift @@ -139,13 +139,13 @@ public class TKUITripOverviewCard: TKUITableCard { let mergedSelection = Observable.merge( selectedItem(in: tableView, dataSource: dataSource).asObservable(), alternativesTapped.map { dataSource[$0] } - ).asSignal(onErrorSignalWith: .empty()) + ).asAssertingSignal() viewModel = TKUITripOverviewViewModel( presentedTrip: presentedTrip, inputs: TKUITripOverviewViewModel.UIInput( selected: mergedSelection, - alertsEnabled: alertsToggled.asSignal(onErrorSignalWith: .empty()), + alertsEnabled: alertsToggled.asAssertingSignal(), isVisible: isVisible.asDriver(onErrorJustReturn: true) ), includeTimeToLeaveNotification: includeTimeToLeaveNotification diff --git a/Sources/TripKitUI/controller/TKUIAutocompletionViewController.swift b/Sources/TripKitUI/controller/TKUIAutocompletionViewController.swift index e2f8abf15..058bc50aa 100644 --- a/Sources/TripKitUI/controller/TKUIAutocompletionViewController.swift +++ b/Sources/TripKitUI/controller/TKUIAutocompletionViewController.swift @@ -83,8 +83,8 @@ public class TKUIAutocompletionViewController: UITableViewController { viewModel = TKUIAutocompletionViewModel( providers: providers, searchText: searchText, - selected: tableView.rx.itemSelected.map { dataSource[$0] }.asSignal(onErrorSignalWith: .empty()), - accessorySelected: accessoryTapped.asSignal(onErrorSignalWith: .empty()), + selected: tableView.rx.itemSelected.map { dataSource[$0] }.asAssertingSignal(), + accessorySelected: accessoryTapped.asAssertingSignal(), biasMapRect: .just(biasMapRect) ) diff --git a/Sources/TripKitUI/helper/RxHelpers.swift b/Sources/TripKitUI/helper/RxHelpers.swift index cc817ceee..b4169db03 100644 --- a/Sources/TripKitUI/helper/RxHelpers.swift +++ b/Sources/TripKitUI/helper/RxHelpers.swift @@ -29,6 +29,15 @@ extension Driver where SharingStrategy == DriverSharingStrategy { } +extension ObservableConvertibleType { + func asAssertingSignal() -> Signal { + return asSignal { error in + assertionFailure("Shouldn't have errored but did, with: \(error)") + return .empty() + } + } +} + extension TableViewSectionedDataSource where Section : SectionModelType, Section.Item : Equatable { func indexPath(of needle: Section.Item?) -> IndexPath? { @@ -44,3 +53,13 @@ extension TableViewSectionedDataSource where Section : SectionModelType, Section } } + +// MARK: - .with + +extension Signal { + func with(_ driver: O, combiner: @escaping (Element, D) -> S) -> Signal where O: ObservableConvertibleType, O.Element == D { + asObservable() + .withLatestFrom(driver, resultSelector: combiner) + .asAssertingSignal() + } +} diff --git a/Sources/TripKitUI/helper/TKUIInteractionResult.swift b/Sources/TripKitUI/helper/TKUIInteractionResult.swift new file mode 100644 index 000000000..480899ccf --- /dev/null +++ b/Sources/TripKitUI/helper/TKUIInteractionResult.swift @@ -0,0 +1,34 @@ +// +// TKUITriggerResult.swift +// TripKitUI-iOS +// +// Created by Adrian Schönig on 25/10/2023. +// Copyright © 2023 SkedGo Pty Ltd. All rights reserved. +// + +import Foundation + +enum TKUIInteractionResult { + /// Interaction was successfully processed, and will be reflected on screen. Nothing else needed to be done. + case success + + /// Interaction was successfully processed, and user should be navigated to a new scren. + case navigation(N) + + /// Further input required by user before finalising the action + case followUp(F) + + var followUp: F? { + switch self { + case .followUp(let action): return action + case .navigation, .success: return nil + } + } + + var next: N? { + switch self { + case .followUp, .success: return nil + case .navigation(let next): return next + } + } +} diff --git a/Sources/TripKitUI/view model/TKUIAutocompletionViewModel.swift b/Sources/TripKitUI/view model/TKUIAutocompletionViewModel.swift index 155a275b4..f90bf01d4 100644 --- a/Sources/TripKitUI/view model/TKUIAutocompletionViewModel.swift +++ b/Sources/TripKitUI/view model/TKUIAutocompletionViewModel.swift @@ -133,7 +133,7 @@ class TKUIAutocompletionViewModel { return Observable.empty() } } - .asSignal(onErrorSignalWith: .empty()) + .asAssertingSignal() accessorySelection = (accessorySelected ?? .empty()) .compactMap(\.result) @@ -146,13 +146,13 @@ class TKUIAutocompletionViewModel { return Observable.empty() } } - .asSignal(onErrorSignalWith: .empty()) + .asAssertingSignal() triggerAction = selected .filter(\.isAction) .compactMap(\.provider) - error = errorPublisher.asSignal(onErrorSignalWith: .never()) + error = errorPublisher.asAssertingSignal() } let sections: Driver<[Section]> diff --git a/Sources/TripKitUI/view model/TKUIHomeCardCustomizationViewModel.swift b/Sources/TripKitUI/view model/TKUIHomeCardCustomizationViewModel.swift index 17aa36a1c..1e2ebea5b 100644 --- a/Sources/TripKitUI/view model/TKUIHomeCardCustomizationViewModel.swift +++ b/Sources/TripKitUI/view model/TKUIHomeCardCustomizationViewModel.swift @@ -37,7 +37,7 @@ class TKUIHomeCardCustomizationViewModel { next = done .asObservable() .withLatestFrom(updatedItems) { Next.done($1) } - .asSignal(onErrorSignalWith: .empty()) + .asAssertingSignal() } let sections: Driver<[Section]> diff --git a/Sources/TripKitUI/view model/TKUIHomeViewModel+Next.swift b/Sources/TripKitUI/view model/TKUIHomeViewModel+Next.swift index efe7aae4d..ba0288386 100644 --- a/Sources/TripKitUI/view model/TKUIHomeViewModel+Next.swift +++ b/Sources/TripKitUI/view model/TKUIHomeViewModel+Next.swift @@ -66,7 +66,7 @@ extension TKUIHomeViewModel { componentActions.asObservable() .withLatestFrom(customization) { ($0, $1) } .compactMap(Self.buildNext(for:customization:)) - .asSignal(onErrorSignalWith: .empty()) + .asAssertingSignal() } diff --git a/Sources/TripKitUI/view model/TKUINearbyViewModel.swift b/Sources/TripKitUI/view model/TKUINearbyViewModel.swift index 6c8f7e256..6856cab87 100644 --- a/Sources/TripKitUI/view model/TKUINearbyViewModel.swift +++ b/Sources/TripKitUI/view model/TKUINearbyViewModel.swift @@ -138,7 +138,7 @@ public class TKUINearbyViewModel { self.mapAnnotationToSelect = cardInput.selection .asObservable() .compactMap { $0.mapAnnotation } - .asSignal(onErrorSignalWith: .empty()) + .asAssertingSignal() self.mapOverlays = filteredNearby.map { $0.overlays } @@ -160,7 +160,7 @@ public class TKUINearbyViewModel { return nil } } - .asSignal(onErrorSignalWith: .empty()) + .asAssertingSignal() } fileprivate let refreshPublisher: PublishSubject diff --git a/Sources/TripKitUI/view model/TKUIRoutingQueryInputViewModel.swift b/Sources/TripKitUI/view model/TKUIRoutingQueryInputViewModel.swift index bfb9cfe97..500c2b80c 100644 --- a/Sources/TripKitUI/view model/TKUIRoutingQueryInputViewModel.swift +++ b/Sources/TripKitUI/view model/TKUIRoutingQueryInputViewModel.swift @@ -88,12 +88,12 @@ class TKUIRoutingQueryInputViewModel { .withLatestFrom(state) .filter { $0.origin != nil && $0.destination != nil } .map { Next.route(origin: $0.origin!, destination: $0.destination!) } - .asSignal(onErrorSignalWith: .empty()) + .asAssertingSignal() let routeASAP = state .filter { $0.mode == nil && $0.origin != nil && $0.destination != nil } .map { Next.route(origin: $0.origin!, destination: $0.destination!) } - .asSignal(onErrorSignalWith: .empty()) + .asAssertingSignal() // If we have a `TKUICustomization.shared.locationInfoTapHandler` set, we: // - Add an (i) in the TKUIAutocompletionViewModel, which then triggers @@ -136,7 +136,7 @@ class TKUIRoutingQueryInputViewModel { } } .compactMap { $0 } - .asSignal(onErrorSignalWith: Signal.empty()) + .asAssertingSignal() } else { accessoryTaps = .empty() } @@ -145,7 +145,7 @@ class TKUIRoutingQueryInputViewModel { routeASAP, selections, accessoryTaps, - tapInfoRoutePublisher.asSignal(onErrorSignalWith: .empty()) + tapInfoRoutePublisher.asAssertingSignal() ]) } diff --git a/Sources/TripKitUI/view model/TKUIRoutingResultsViewModel.swift b/Sources/TripKitUI/view model/TKUIRoutingResultsViewModel.swift index 17898adef..918b0e629 100644 --- a/Sources/TripKitUI/view model/TKUIRoutingResultsViewModel.swift +++ b/Sources/TripKitUI/view model/TKUIRoutingResultsViewModel.swift @@ -60,7 +60,7 @@ class TKUIRoutingResultsViewModel { .share(replay: 1, scope: .forever) let errorPublisher = PublishSubject() - self.error = errorPublisher.asSignal(onErrorSignalWith: .empty()) + self.error = errorPublisher.asAssertingSignal() // Monitor the builder's annotation's coordinates let originOrDestinationChanged = builderChangedWithID @@ -205,7 +205,7 @@ class TKUIRoutingResultsViewModel { let region = Self.regionForModes(for: tuple.1) return Next.presentModeConfigurator(modes: modes, region: region) } - .asSignal(onErrorSignalWith: .empty()) + .asAssertingSignal() let presentTime = inputs.tappedDate.asObservable() .withLatestFrom(builderChanged) @@ -220,7 +220,7 @@ class TKUIRoutingResultsViewModel { } return .presentDatePicker(time: time, timeZone: builder.timeZone) } - .asSignal(onErrorSignalWith: .empty()) + .asAssertingSignal() let presentTimeAutomatically = builderChanged .compactMap { builder -> Next? in @@ -233,13 +233,13 @@ class TKUIRoutingResultsViewModel { } return .presentDatePicker(time: time, timeZone: builder.timeZone) } - .asSignal(onErrorSignalWith: .empty()) + .asAssertingSignal() let presentSearch = inputs.tappedSearch .asObservable() .withLatestFrom(builderChanged) .map { Next.showSearch(origin: $0.origin, destination: $0.destination, mode: $0.mode) } - .asSignal(onErrorSignalWith: .empty()) + .asAssertingSignal() let presentLocationInfo = mapInput.tappedPin .map { Next.showLocation($0, mode: $1) } diff --git a/Sources/TripKitUI/view model/TKUITripOverviewViewModel.swift b/Sources/TripKitUI/view model/TKUITripOverviewViewModel.swift index b731fce43..394ff1b49 100644 --- a/Sources/TripKitUI/view model/TKUITripOverviewViewModel.swift +++ b/Sources/TripKitUI/view model/TKUITripOverviewViewModel.swift @@ -41,7 +41,7 @@ class TKUITripOverviewViewModel { } refreshMap = Observable.merge(tripChanged, servicesFetched) - .asSignal(onErrorSignalWith: .empty()) + .asAssertingSignal() let tripUpdated: Infallible = presentedTrip .asObservable() diff --git a/Sources/TripKitUI/views/TKUIModePicker.swift b/Sources/TripKitUI/views/TKUIModePicker.swift index b39603af2..c639580a0 100644 --- a/Sources/TripKitUI/views/TKUIModePicker.swift +++ b/Sources/TripKitUI/views/TKUIModePicker.swift @@ -267,7 +267,7 @@ public class TKUIModePicker: UIView where Item: TKUIModePickerItem { public var rx_pickedModes: Signal> { return tap .map { [weak self] in self?.pickedModes ?? [] } - .asSignal(onErrorSignalWith: .empty()) + .asAssertingSignal() } /// Visible modes that are currently enabled diff --git a/Sources/TripKitUI/views/results/TKUIResultsTitleView.swift b/Sources/TripKitUI/views/results/TKUIResultsTitleView.swift index cea922bcb..4a18f856e 100644 --- a/Sources/TripKitUI/views/results/TKUIResultsTitleView.swift +++ b/Sources/TripKitUI/views/results/TKUIResultsTitleView.swift @@ -31,7 +31,7 @@ class TKUIResultsTitleView: UIView, TGPreferrableView { private let locationSearchPublisher = PublishSubject() var locationTapped: Signal { - return locationSearchPublisher.asSignal(onErrorSignalWith: .empty()) + return locationSearchPublisher.asAssertingSignal() } public var preferredView: UIView? { diff --git a/Sources/TripKitUI/views/results/TKUIRoutingQueryInputTitleView.swift b/Sources/TripKitUI/views/results/TKUIRoutingQueryInputTitleView.swift index c8bb320f1..a580c92ca 100644 --- a/Sources/TripKitUI/views/results/TKUIRoutingQueryInputTitleView.swift +++ b/Sources/TripKitUI/views/results/TKUIRoutingQueryInputTitleView.swift @@ -282,13 +282,13 @@ extension Reactive where Base == TKUIRoutingQueryInputTitleView { } var selectedSearchMode: Signal { - base.switchMode.asSignal(onErrorSignalWith: .empty()) + base.switchMode.asAssertingSignal() } var route: Signal { return Signal.merge( base.routeButton.rx.tap.asSignal(), - base.route.asSignal(onErrorSignalWith: .empty()) + base.route.asAssertingSignal() ) } } diff --git a/TripKit.xcodeproj/project.pbxproj b/TripKit.xcodeproj/project.pbxproj index b5d7171f3..7eace2240 100644 --- a/TripKit.xcodeproj/project.pbxproj +++ b/TripKit.xcodeproj/project.pbxproj @@ -45,6 +45,7 @@ 3A89090C27E47414005A49B1 /* TKServer+UserAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A89090A27E47414005A49B1 /* TKServer+UserAccount.swift */; }; 3A8A9BBC2A0B460900BF4603 /* TKOneOffLocationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A8A9BBB2A0B460900BF4603 /* TKOneOffLocationManager.swift */; }; 3A8A9BBD2A0B460900BF4603 /* TKOneOffLocationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A8A9BBB2A0B460900BF4603 /* TKOneOffLocationManager.swift */; }; + 3A8C799F2AE8B1BF002F52A3 /* TKUIInteractionResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A8C799E2AE8B1BF002F52A3 /* TKUIInteractionResult.swift */; }; 3A96B93B293F102800556A44 /* routes-sf.json in Resources */ = {isa = PBXBuildFile; fileRef = 3A96B93A293F102800556A44 /* routes-sf.json */; }; 3A99FCCF29FB8C110086E22F /* Subject+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A99FCC529FB8C110086E22F /* Subject+Rx.swift */; }; 3A99FCD029FB8C110086E22F /* Publisher+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A99FCC629FB8C110086E22F /* Publisher+Rx.swift */; }; @@ -939,6 +940,7 @@ 3A89090727E473EE005A49B1 /* TKLocationProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TKLocationProvider.swift; sourceTree = ""; }; 3A89090A27E47414005A49B1 /* TKServer+UserAccount.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "TKServer+UserAccount.swift"; sourceTree = ""; }; 3A8A9BBB2A0B460900BF4603 /* TKOneOffLocationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TKOneOffLocationManager.swift; sourceTree = ""; }; + 3A8C799E2AE8B1BF002F52A3 /* TKUIInteractionResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TKUIInteractionResult.swift; sourceTree = ""; }; 3A963D6026D46AD300C328A1 /* en-US */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-US"; path = "en-US.lproj/TripKit.strings"; sourceTree = ""; }; 3A96B93A293F102800556A44 /* routes-sf.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "routes-sf.json"; sourceTree = ""; }; 3A99FCC529FB8C110086E22F /* Subject+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Subject+Rx.swift"; sourceTree = ""; }; @@ -2614,6 +2616,7 @@ D3AB4793273DEAED0086C956 /* TKUIModePickerLayoutHelper.swift */, 3AFF27CC26C6975F007809CD /* TKUICustomization.swift */, 3AFF27CB26C6975F007809CD /* TKUIDebugActionHandler.swift */, + 3A8C799E2AE8B1BF002F52A3 /* TKUIInteractionResult.swift */, 3AFF27C626C6975F007809CD /* TKUIMapManagerHelper.swift */, 3AFF27AF26C6975F007809CD /* TKUITripSegmentDisplayable.swift */, 3AFF27C526C6975F007809CD /* TKWheelchairAccessibility+UI.swift */, @@ -3697,6 +3700,7 @@ 3AFF2AF326C69B56007809CD /* TKUITableCard.swift in Sources */, 3AFF2B7426C69BB9007809CD /* TKUIServiceTitleView.swift in Sources */, 3AFF2B5726C69BA4007809CD /* TKUISheet.swift in Sources */, + 3A8C799F2AE8B1BF002F52A3 /* TKUIInteractionResult.swift in Sources */, 3AFF2BD326C69BFC007809CD /* RxPickerViewAdapter.swift in Sources */, D33949ED2732AC3F00B38B79 /* TKUITimePickerSheet+Configuration.swift in Sources */, 3AFF2B8926C69BBE007809CD /* TKUIHomeHeaderView.swift in Sources */,