Skip to content

Commit

Permalink
[MBL-696] Cleanup Optimizely Experiments (#1812)
Browse files Browse the repository at this point in the history
* remove nativeOnboarding experiment

* remove onboardingCategoryPersonalizationFlow experiment

* remove nativeProjectCards experiment

* remove nativeRiskMessaging experiment. leave affected code for now until more I can get more feature context

* remove OptimizelyExperiment file

* remove goToLandingPage flow and LandingPage files

* remove hasSeenLandingPage from KeyValueStoreType

* remove hasSeenCategoryPersonalizationFlow from KeyValueStoreType

* remove shouldSeeCategoryPersonalization(), goToCategoryPersonalizationOnboarding output, and LandingViewController/LandingViewModel and tests

* rename testDeeplink and testOpenPushNotification_WhenOnboardingFlowIsNotActive tests

* add _Success suffix to testContinueUserActivity

* add _Success suffix to testPerformShortcutItem_

* remove experiment name from testLaunchShortcutItem_WhenOnboardingFlowIsNotActive test

* remove testEmailDeepLinking_WhenOnboardingFlowIsNotActive

* clean up projectsLoaded output in DiscoveryPageViewModel

* .zero format suggestion

* put testConfigureDataSourceOptimizelyConfiguration test back

* put testProjectsLoaded_Success back

* put testContentInset_Success back

* put testShowPersonalization_LoggedOut and testShowPersonalization_LoggedIn back

* put testShowPersonalization_When_HasCompletedCategorySelection_IsFalse back

* put testShowPersonalization_When_HasDismissedPersonalizationCell_IsTrue back

* remove experiments property and related methods from MockOptimizelyClient

* remove _Control suffix from testDiscoveryPageBackgroundColor

* clean up experiments related code from MockOptimizelyClient

* remove LandingViewModel and LandingViewModelTests

* remove unecessary test

* update testDiscoveryPageBackgroundColor test name to testIsNativeRiskMessagingControlEnabled

* undo naming since there is already a test with that name and use case

* remov LandingPageViewControllerTests and LandingViewControllerTests snapshots

---------

Co-authored-by: Mubarak Sadoon <msadoon@gmail.com>
  • Loading branch information
scottkicks and msadoon committed Apr 19, 2023
1 parent e48374f commit 6e20524
Show file tree
Hide file tree
Showing 93 changed files with 67 additions and 3,024 deletions.
21 changes: 0 additions & 21 deletions Kickstarter-iOS/AppDelegate.swift
Expand Up @@ -135,16 +135,6 @@ internal final class AppDelegate: UIResponder, UIApplicationDelegate {
.observeForUI()
.observeValues { UIApplication.shared.open($0) }

self.viewModel.outputs.goToLandingPage
.observeForUI()
.observeValues { [weak self] in
let isIpad = AppEnvironment.current.device.userInterfaceIdiom == .pad

let landingPage = LandingPageViewController()
|> \.modalPresentationStyle .~ (isIpad ? .formSheet : .fullScreen)
self?.rootTabBarController?.present(landingPage, animated: true)
}

self.viewModel.outputs.applicationIconBadgeNumber
.observeForUI()
.observeValues { UIApplication.shared.applicationIconBadgeNumber = $0 }
Expand Down Expand Up @@ -217,17 +207,6 @@ internal final class AppDelegate: UIResponder, UIApplicationDelegate {
.observeForUI()
.observeValues { [weak self] in self?.findRedirectUrl($0) }

self.viewModel.outputs.goToCategoryPersonalizationOnboarding
.observeForControllerAction()
.observeValues { [weak self] in
let categorySelectionViewController = LandingViewController.instantiate()
let navController = NavigationController(rootViewController: categorySelectionViewController)
let isIpad = AppEnvironment.current.device.userInterfaceIdiom == .pad
navController.modalPresentationStyle = isIpad ? .formSheet : .fullScreen

self?.rootTabBarController?.present(navController, animated: true)
}

self.viewModel.outputs.emailVerificationCompleted
.observeForUI()
.observeValues { [weak self] message, success in
Expand Down
74 changes: 0 additions & 74 deletions Kickstarter-iOS/AppDelegateViewModel.swift
Expand Up @@ -129,9 +129,6 @@ public protocol AppDelegateViewModelOutputs {
/// Emits when the root view controller should navigate to activity.
var goToActivity: Signal<(), Never> { get }

/// Emits when the root view controller should navigate to the onboarding flow
var goToCategoryPersonalizationOnboarding: Signal<Void, Never> { get }

/// Emits when application should navigate to the creator's message thread
var goToCreatorMessageThread: Signal<(Param, MessageThread), Never> { get }

Expand All @@ -141,9 +138,6 @@ public protocol AppDelegateViewModelOutputs {
/// Emits when the root view controller should navigate to the creator dashboard.
var goToDiscovery: Signal<DiscoveryParams?, Never> { get }

/// Emits when the root view controller should present the Landing Page for new users.
var goToLandingPage: Signal<(), Never> { get }

/// Emits when the root view controller should present the login modal.
var goToLoginWithIntent: Signal<LoginIntent, Never> { get }

Expand Down Expand Up @@ -336,14 +330,6 @@ public final class AppDelegateViewModel: AppDelegateViewModelType, AppDelegateVi

self.registerPushTokenInSegment = self.deviceTokenDataProperty.signal

// Onboarding

self.goToCategoryPersonalizationOnboarding = Signal.combineLatest(
self.applicationLaunchOptionsProperty.signal.ignoreValues(),
self.didUpdateOptimizelyClientProperty.signal.skipNil().ignoreValues()
).ignoreValues()
.filter(shouldSeeCategoryPersonalization)

// Deep links

let deepLinkFromNotification = self.remoteNotificationProperty.signal.skipNil()
Expand Down Expand Up @@ -405,13 +391,7 @@ public final class AppDelegateViewModel: AppDelegateViewModelType, AppDelegateVi
)
.skipNil()

self.goToLandingPage = self.applicationLaunchOptionsProperty.signal.ignoreValues()
.takeWhen(self.didUpdateOptimizelyClientProperty.signal.ignoreValues())
.filter(shouldGoToLandingPage)

let deepLink = deeplinkActivated
.filter { _ in shouldGoToLandingPage() == false && shouldSeeCategoryPersonalization() == false }
.take(until: self.goToLandingPage)

let updatedUserNotificationSettings = deepLink.filter { nav in
guard case .settings(.notifications(_, _)) = nav else { return false }
Expand Down Expand Up @@ -979,11 +959,9 @@ public final class AppDelegateViewModel: AppDelegateViewModelType, AppDelegateVi
public let findRedirectUrl: Signal<URL, Never>
public let forceLogout: Signal<(), Never>
public let goToActivity: Signal<(), Never>
public let goToCategoryPersonalizationOnboarding: Signal<Void, Never>
public let goToCreatorMessageThread: Signal<(Param, MessageThread), Never>
public let goToDashboard: Signal<Param?, Never>
public let goToDiscovery: Signal<DiscoveryParams?, Never>
public let goToLandingPage: Signal<(), Never>
public let goToLoginWithIntent: Signal<LoginIntent, Never>
public let goToMessageThread: Signal<MessageThread, Never>
public let goToPerimeterXCaptcha: Signal<PerimeterXBlockResponseType, Never>
Expand Down Expand Up @@ -1278,14 +1256,6 @@ extension ShortcutItem {
private func configureOptimizely(for _: Environment) -> OptimizelyClientType? {
// FIXME: This is until we add a new feature flagging client
let mockOptimizelyClient = MockOptimizelyClient()
|> \.experiments .~ [
OptimizelyExperiment.Key.nativeRiskMessaging.rawValue: OptimizelyExperiment.Variant.control.rawValue,
OptimizelyExperiment.Key.nativeProjectCards.rawValue: OptimizelyExperiment.Variant.control.rawValue,
OptimizelyExperiment.Key.onboardingCategoryPersonalizationFlow.rawValue: OptimizelyExperiment.Variant
.control.rawValue,
OptimizelyExperiment.Key.nativeOnboarding.rawValue: OptimizelyExperiment.Variant.control.rawValue
]
_ = mockOptimizelyClient
|> \.features .~
[
OptimizelyFeature.commentFlaggingEnabled.rawValue: false,
Expand Down Expand Up @@ -1330,50 +1300,6 @@ private func visitorCookies() -> [HTTPCookie] {
.compact()
}

private func shouldSeeCategoryPersonalization() -> Bool {
let isLoggedIn = AppEnvironment.current.currentUser != nil
let hasSeenCategoryPersonalization = AppEnvironment.current.userDefaults.hasSeenCategoryPersonalizationFlow

if isLoggedIn || hasSeenCategoryPersonalization {
// Currently logged-in users should not see the onboarding flow
AppEnvironment.current.userDefaults.hasSeenCategoryPersonalizationFlow = true

return false
}

guard let variant = AppEnvironment.current.optimizelyClient?
.variant(for: .onboardingCategoryPersonalizationFlow) else {
return false
}

switch variant {
case .control, .variant2:
return false
case .variant1:
return true
}
}

private func shouldGoToLandingPage() -> Bool {
let hasNotSeenLandingPage = !AppEnvironment.current.userDefaults.hasSeenLandingPage

guard AppEnvironment.current.currentUser == nil, hasNotSeenLandingPage else {
AppEnvironment.current.userDefaults.hasSeenLandingPage = true

return false
}

let optimizelyVariant = AppEnvironment.current.optimizelyClient?
.variant(for: OptimizelyExperiment.Key.nativeOnboarding)

switch optimizelyVariant {
case .variant1, .variant2:
return hasNotSeenLandingPage
case .control, nil:
return false
}
}

private func accessTokenFromUrl(_ url: URL?) -> String? {
return url.flatMap { url in
URLComponents(url: url, resolvingAgainstBaseURL: false)?.queryItems
Expand Down

0 comments on commit 6e20524

Please sign in to comment.