Skip to content

Commit

Permalink
[MBL-855] Remove creator dashboard (#1853)
Browse files Browse the repository at this point in the history
* Remove flag from remoteConfig

* Delete dashboard from root view model

* Delete dashboard from navigation

* Delete goToDashboard signals

* Delete creator message thread and project activity signals

* Delete all the files

* Delete view models and clean up

* Delete project activity files

* Fix format

* Fix tests

* Delete creator-specific notification enums for notifications that would currently do nothing anyways

* Update screenshots after merge

* Delete redundant test

* Add tabbaritemsstyles test back in and fix format

* Delete unused isMember

* Re-add accidentally deleted goToDiscovery

Co-authored-by: Scott Clampet <110618242+scottkicks@users.noreply.github.com>

* Readd goToReportProject methods that got deleted in a bad merge

* Fix format

* Add rosetta to build-and-cache

---------

Co-authored-by: Scott Clampet <110618242+scottkicks@users.noreply.github.com>
  • Loading branch information
ifosli and scottkicks committed Oct 5, 2023
1 parent f857029 commit b06f4b1
Show file tree
Hide file tree
Showing 114 changed files with 89 additions and 13,518 deletions.
1 change: 1 addition & 0 deletions .circleci/config.yml
Expand Up @@ -95,6 +95,7 @@ jobs:
environment:
- *default_environment
steps:
- macos/install-rosetta
- checkout
- run:
name: SPM SSH Workaround
Expand Down
25 changes: 0 additions & 25 deletions Kickstarter-iOS/AppDelegate.swift
Expand Up @@ -97,16 +97,6 @@ internal final class AppDelegate: UIResponder, UIApplicationDelegate {
.observeForUI()
.observeValues { [weak self] in self?.rootTabBarController?.switchToActivities() }

self.viewModel.outputs.goToDashboard
.observeForUI()
.observeValues { [weak self] in self?.rootTabBarController?.switchToDashboard(project: $0) }

self.viewModel.outputs.goToCreatorMessageThread
.observeForUI()
.observeValues { [weak self] in
self?.goToCreatorMessageThread($0, $1)
}

self.viewModel.outputs.goToLoginWithIntent
.observeForControllerAction()
.observeValues { [weak self] intent in
Expand All @@ -121,12 +111,6 @@ internal final class AppDelegate: UIResponder, UIApplicationDelegate {
.observeForUI()
.observeValues { [weak self] in self?.goToMessageThread($0) }

self.viewModel.outputs.goToProjectActivities
.observeForUI()
.observeValues { [weak self] in
self?.goToProjectActivities($0)
}

self.viewModel.outputs.goToSearch
.observeForUI()
.observeValues { [weak self] in self?.rootTabBarController?.switchToSearch() }
Expand Down Expand Up @@ -398,15 +382,6 @@ internal final class AppDelegate: UIResponder, UIApplicationDelegate {
self.rootTabBarController?.switchToMessageThread(messageThread)
}

private func goToCreatorMessageThread(_ projectId: Param, _ messageThread: MessageThread) {
self.rootTabBarController?
.switchToCreatorMessageThread(projectId: projectId, messageThread: messageThread)
}

private func goToProjectActivities(_ projectId: Param) {
self.rootTabBarController?.switchToProjectActivities(projectId: projectId)
}

private func findRedirectUrl(_ url: URL) {
let session = URLSession(configuration: .default, delegate: self, delegateQueue: nil)
let task = session.dataTask(with: url)
Expand Down
76 changes: 3 additions & 73 deletions Kickstarter-iOS/AppDelegateViewModel.swift
Expand Up @@ -126,13 +126,7 @@ public protocol AppDelegateViewModelOutputs {
/// Emits when the root view controller should navigate to activity.
var goToActivity: Signal<(), Never> { get }

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

/// Emits when the root view controller should navigate to the creator dashboard.
var goToDashboard: Signal<Param?, Never> { get }

/// Emits when the root view controller should navigate to the creator dashboard.
/// Emits when the root view controller should navigate to the discovery screen.
var goToDiscovery: Signal<DiscoveryParams?, Never> { get }

/// Emits when the root view controller should present the login modal.
Expand All @@ -144,9 +138,6 @@ public protocol AppDelegateViewModelOutputs {
/// Emits when the root view controller should navigate to the user's profile.
var goToProfile: Signal<(), Never> { get }

/// Emits when should navigate to the project activities view
var goToProjectActivities: Signal<Param, Never> { get }

/// Emits a URL when we should open it in the safari browser.
var goToMobileSafari: Signal<URL, Never> { get }

Expand Down Expand Up @@ -522,18 +513,6 @@ public final class AppDelegateViewModel: AppDelegateViewModelType, AppDelegateVi
goToLogin.mapConst(.generic)
)

self.goToCreatorMessageThread = deepLink
.map { navigation -> (Param, Int)? in
guard case let .creatorMessages(projectId, messageThreadId) = navigation else { return nil }
return .some((projectId, messageThreadId: messageThreadId))
}
.skipNil()
.switchMap { projectId, messageThreadId in
AppEnvironment.current.apiService.fetchMessageThread(messageThreadId: messageThreadId)
.demoteErrors()
.map { (projectId, $0.messageThread) }
}

self.goToMessageThread = deepLink
.map { navigation -> Int? in
guard case let .messages(messageThreadId) = navigation else { return nil }
Expand All @@ -546,13 +525,6 @@ public final class AppDelegateViewModel: AppDelegateViewModelType, AppDelegateVi
.map { $0.messageThread }
}

self.goToProjectActivities = deepLink
.map { navigation -> Param? in
guard case let .projectActivity(projectId) = navigation else { return nil }
return .some(projectId)
}
.skipNil()

self.goToProfile = deepLink
.filter { $0 == .tab(.me) }
.ignoreValues()
Expand All @@ -565,13 +537,6 @@ public final class AppDelegateViewModel: AppDelegateViewModelType, AppDelegateVi

self.goToMobileSafari = resolvedRedirectUrl

self.goToDashboard = deepLink
.map { link -> Param?? in
guard case let .tab(.dashboard(param)) = link else { return nil }
return .some(param)
}
.skipNil()

let projectRootLink = Signal.merge(projectLink, projectPreviewLink)
.filter { _, subpage, _, _ in subpage == .root }
.map { _, _, vcs, _ in vcs }
Expand Down Expand Up @@ -951,13 +916,10 @@ public final class AppDelegateViewModel: AppDelegateViewModelType, AppDelegateVi
public let findRedirectUrl: Signal<URL, Never>
public let forceLogout: Signal<(), Never>
public let goToActivity: Signal<(), Never>
public let goToCreatorMessageThread: Signal<(Param, MessageThread), Never>
public let goToDashboard: Signal<Param?, Never>
public let goToDiscovery: Signal<DiscoveryParams?, Never>
public let goToLoginWithIntent: Signal<LoginIntent, Never>
public let goToMessageThread: Signal<MessageThread, Never>
public let goToProfile: Signal<(), Never>
public let goToProjectActivities: Signal<Param, Never>
public let goToMobileSafari: Signal<URL, Never>
public let goToSearch: Signal<(), Never>
public let postNotification: Signal<Notification, Never>
Expand Down Expand Up @@ -1052,15 +1014,9 @@ private func navigation(fromPushEnvelope envelope: PushEnvelope) -> Navigation?
switch activity.category {
case .backing:
guard let projectId = activity.projectId else { return nil }
if envelope.forCreator == true {
return .projectActivity(.id(projectId))
}
return .project(.id(projectId), .root, refTag: .push)
case .failure, .launch, .success, .cancellation, .suspension:
guard let projectId = activity.projectId else { return nil }
if envelope.forCreator == .some(true) {
return .tab(.dashboard(project: .id(projectId)))
}
return .project(.id(projectId), .root, refTag: .push)

case .update:
Expand All @@ -1087,10 +1043,6 @@ private func navigation(fromPushEnvelope envelope: PushEnvelope) -> Navigation?
}
return .project(.id(projectId), .comments, refTag: .push)

case .backingAmount, .backingCanceled, .backingDropped, .backingReward:
guard let projectId = activity.projectId else { return nil }
return .tab(.dashboard(project: .id(projectId)))

case .follow:
return .tab(.activity)

Expand All @@ -1100,18 +1052,11 @@ private func navigation(fromPushEnvelope envelope: PushEnvelope) -> Navigation?
}

if let project = envelope.project {
if envelope.forCreator == .some(true) {
return .tab(.dashboard(project: .id(project.id)))
}
return .project(.id(project.id), .root, refTag: .push)
}

if let message = envelope.message {
if envelope.forCreator == .some(true) {
return .creatorMessages(.id(message.projectId), messageThreadId: message.messageThreadId)
} else {
return .messages(messageThreadId: message.messageThreadId)
}
return .messages(messageThreadId: message.messageThreadId)
}

if let survey = envelope.survey {
Expand All @@ -1132,9 +1077,6 @@ private func navigation(fromPushEnvelope envelope: PushEnvelope) -> Navigation?
// Figures out a `Navigation` to route the user to from a shortcut item.
private func navigation(fromShortcutItem shortcutItem: ShortcutItem) -> SignalProducer<Navigation?, Never> {
switch shortcutItem {
case .creatorDashboard:
return SignalProducer(value: .tab(.dashboard(project: nil)))

case .recommendedForYou:
let params = .defaults
|> DiscoveryParams.lens.recommended .~ true
Expand Down Expand Up @@ -1179,14 +1121,10 @@ private func shortcutItems(forUser user: User?) -> SignalProducer<[ShortcutItem]

// Figures out which shortcut items to show to a user based on whether they are a project member and/or
// has recommendations.
private func shortcutItems(isProjectMember: Bool, hasRecommendations: Bool)
private func shortcutItems(isProjectMember _: Bool, hasRecommendations: Bool)
-> [ShortcutItem] {
var items: [ShortcutItem] = []

if isProjectMember {
items.append(.creatorDashboard)
}

if hasRecommendations {
items.append(.recommendedForYou)
}
Expand All @@ -1208,14 +1146,6 @@ private func dictionary(fromUrlComponents urlComponents: URLComponents) -> [Stri
extension ShortcutItem {
public var applicationShortcutItem: UIApplicationShortcutItem {
switch self {
case .creatorDashboard:
return .init(
type: self.typeString,
localizedTitle: Strings.accessibility_discovery_buttons_creator_dashboard(),
localizedSubtitle: nil,
icon: UIApplicationShortcutIcon(templateImageName: "shortcut-icon-bars"),
userInfo: nil
)
case .projectsWeLove:
return .init(
type: self.typeString,
Expand Down
88 changes: 1 addition & 87 deletions Kickstarter-iOS/AppDelegateViewModelTests.swift
Expand Up @@ -22,9 +22,7 @@ final class AppDelegateViewModelTests: TestCase {
private let findRedirectUrl = TestObserver<URL, Never>()
private let forceLogout = TestObserver<(), Never>()
private let goToActivity = TestObserver<(), Never>()
private let goToDashboard = TestObserver<Param?, Never>()
private let goToDiscovery = TestObserver<DiscoveryParams?, Never>()
private let goToProjectActivities = TestObserver<Param, Never>()
private let goToLoginWithIntent = TestObserver<LoginIntent, Never>()
private let goToProfile = TestObserver<(), Never>()
private let goToMobileSafari = TestObserver<URL, Never>()
Expand Down Expand Up @@ -71,12 +69,10 @@ final class AppDelegateViewModelTests: TestCase {
self.vm.outputs.findRedirectUrl.observe(self.findRedirectUrl.observer)
self.vm.outputs.forceLogout.observe(self.forceLogout.observer)
self.vm.outputs.goToActivity.observe(self.goToActivity.observer)
self.vm.outputs.goToDashboard.observe(self.goToDashboard.observer)
self.vm.outputs.goToDiscovery.observe(self.goToDiscovery.observer)
self.vm.outputs.goToLoginWithIntent.observe(self.goToLoginWithIntent.observer)
self.vm.outputs.goToProfile.observe(self.goToProfile.observer)
self.vm.outputs.goToMobileSafari.observe(self.goToMobileSafari.observer)
self.vm.outputs.goToProjectActivities.observe(self.goToProjectActivities.observer)
self.vm.outputs.goToSearch.observe(self.goToSearch.observer)
self.vm.outputs.postNotification.map { $0.name }.observe(self.postNotificationName.observer)
self.vm.outputs.presentViewController.map { ($0 as! UINavigationController).viewControllers.count }
Expand Down Expand Up @@ -719,25 +715,6 @@ final class AppDelegateViewModelTests: TestCase {
self.goToActivity.assertValueCount(1)
}

func testGoToDashboard() {
self.vm.inputs.applicationDidFinishLaunching(
application: UIApplication.shared,
launchOptions: [:]
)

self.goToDashboard.assertValueCount(0)

let url = "https://www.kickstarter.com/projects/tequila/help-me-transform-this-pile-of-wood/dashboard"
let result = self.vm.inputs.applicationOpenUrl(
application: UIApplication.shared,
url: URL(string: url)!,
options: [:]
)
XCTAssertTrue(result)

self.goToDashboard.assertValueCount(1)
}

func testGoToDiscovery() {
self.vm.inputs.applicationDidFinishLaunching(
application: UIApplication.shared,
Expand Down Expand Up @@ -1195,25 +1172,13 @@ final class AppDelegateViewModelTests: TestCase {
}
}

func testOpenNotification_NewBacking_ForCreator() {
let projectId = (backingForCreatorPushData["activity"] as? [String: AnyObject])
.flatMap { $0["project_id"] as? Int }
let param = Param.id(projectId ?? -1)

self.vm.inputs.didReceive(remoteNotification: backingForCreatorPushData)

self.goToProjectActivities.assertValues([param])
}

func testOpenNotification_NewBacking_ForCreator_WithBadData() {
var badPushData = backingForCreatorPushData
var badActivityData = badPushData["activity"] as? [String: AnyObject]
badActivityData?["project_id"] = nil
badPushData["activity"] = badActivityData

self.vm.inputs.didReceive(remoteNotification: badPushData)

self.goToDashboard.assertValueCount(0)
}

func testOpenNotification_ProjectUpdate() {
Expand Down Expand Up @@ -1314,29 +1279,6 @@ final class AppDelegateViewModelTests: TestCase {
}
}

func testOpenNotification_CreatorActivity() {
let categories: [Activity.Category] = [.backingAmount, .backingCanceled, .backingDropped, .backingReward]

let projectId = (backingForCreatorPushData["activity"] as? [String: AnyObject])
.flatMap { $0["project_id"] as? Int }
let param = Param.id(projectId ?? -1)

self.vm.inputs.applicationDidFinishLaunching(
application: UIApplication.shared,
launchOptions: [:]
)

categories.enumerated().forEach { idx, state in
var pushData = genericActivityPushData
pushData["activity"]?["category"] = state.rawValue

self.vm.inputs.didReceive(remoteNotification: pushData)

self.goToDashboard.assertValueCount(idx + 1)
self.goToDashboard.assertLastValue(param)
}
}

func testOpenNotification_PostLike() {
withEnvironment(apiService: MockService(fetchProjectResult: .success(.template))) {
let pushData: [String: Any] = [
Expand Down Expand Up @@ -1369,7 +1311,6 @@ final class AppDelegateViewModelTests: TestCase {

self.vm.inputs.didReceive(remoteNotification: pushData)

self.goToDashboard.assertValueCount(0)
self.goToDiscovery.assertValueCount(0)
self.presentViewController.assertValueCount(0)
}
Expand Down Expand Up @@ -1475,38 +1416,11 @@ final class AppDelegateViewModelTests: TestCase {
self.scheduler.advance(by: .seconds(5))

self.setApplicationShortcutItems.assertValues([
[.creatorDashboard, .recommendedForYou, .projectsWeLove, .search]
[.recommendedForYou, .projectsWeLove, .search]
])
}
}

func testPerformShortcutItem_CreatorDashboard() {
self.vm.inputs.applicationDidFinishLaunching(
application: UIApplication.shared,
launchOptions: [:]
)

self.goToDashboard.assertValueCount(0)

self.vm.inputs.applicationPerformActionForShortcutItem(
ShortcutItem.creatorDashboard.applicationShortcutItem
)

self.goToDashboard.assertValueCount(1)
}

func testLaunchShortcutItem_CreatorDashboard() {
self.vm.inputs.applicationDidFinishLaunching(
application: UIApplication.shared,
launchOptions: [
UIApplication.LaunchOptionsKey.shortcutItem: ShortcutItem.creatorDashboard.applicationShortcutItem
]
)

self.goToDashboard.assertValueCount(1)
XCTAssertFalse(self.vm.outputs.applicationDidFinishLaunchingReturnValue)
}

func testPerformShortcutItem_ProjectsWeLove() {
self.vm.inputs.applicationDidFinishLaunching(
application: UIApplication.shared,
Expand Down

This file was deleted.

Binary file not shown.

0 comments on commit b06f4b1

Please sign in to comment.