Skip to content

Commit

Permalink
Merge branch 'main' into updateSchemaForAttribution
Browse files Browse the repository at this point in the history
  • Loading branch information
ifosli committed Feb 23, 2024
2 parents 1c3fdea + 523660f commit 08eee33
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 91 deletions.
18 changes: 15 additions & 3 deletions Library/Navigation.swift
Original file line number Diff line number Diff line change
Expand Up @@ -552,6 +552,11 @@ private func parsedParams(url: URL, fromTemplate template: String) -> RouteParam
object[key] = value
}

// If the deeplink opens the project page, track the url.
if urlComponents.first == "projects" {
object[RouteParamsDecoded.CodingKeys.deeplinkUrl.rawValue] = url.absoluteString
}

return object
}

Expand All @@ -560,10 +565,11 @@ private func stringToInt(_ string: String) -> Int? {
}

// Return refInfo object if it contains any information. Otherwise, just return nil.
// TODO(MBL-1220): Add deeplink url to the refInfo if it exists.
private func refInfoFromParams(_ params: RouteParamsDecoded) -> RefInfo? {
if let refTag = params.refTag() {
return RefInfo(refTag)
let refTag = params.refTag()
let url = params.deeplinkUrl()
if refTag != nil || url != nil {
return RefInfo(refTag, deeplinkUrl: url)
}
return nil
}
Expand All @@ -583,6 +589,7 @@ extension Dictionary {
extension RouteParamsDecoded {
fileprivate enum CodingKeys: String, CodingKey {
case comment
case deeplinkUrl = "deeplink_url"
case messageThreadId = "message_thread_id"
case notificationParam = "notification_param"
case checkoutParam = "checkout_param"
Expand All @@ -604,6 +611,11 @@ extension RouteParamsDecoded {
return self[key].flatMap { String($0) }
}

public func deeplinkUrl() -> String? {
let key = CodingKeys.deeplinkUrl.rawValue
return self[key]
}

public func enabledParam() -> Bool? {
let key = CodingKeys.enabledParam.rawValue
return self[key].flatMap(Bool.init)
Expand Down
158 changes: 71 additions & 87 deletions Library/NavigationTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -40,124 +40,93 @@ public final class NavigationTests: XCTestCase {
"/checkouts/1/payments/use_stored_card"
)

KSRAssertMatch(
.project(.slug("project"), .root, refInfo: nil),
"/projects/creator/project"
)
self.assertProjectMatch(path: "/projects/creator/project", navigation: .root)

KSRAssertMatch(nil, "/projects/creator/project?token=4")

KSRAssertMatch(nil, "/projects/creator/project?ref=discovery&token=4")

KSRAssertMatch(
.project(.slug("project"), .checkout(1, .thanks(racing: nil)), refInfo: nil),
"/projects/creator/project/checkouts/1/thanks"
self.assertProjectMatch(
path: "/projects/creator/project/checkouts/1/thanks",
navigation: .checkout(1, .thanks(racing: nil))
)

KSRAssertMatch(
.project(.slug("project"), .checkout(1, .thanks(racing: true)), refInfo: nil),
"/projects/creator/project/checkouts/1/thanks?racing=1"
self.assertProjectMatch(
path: "/projects/creator/project/checkouts/1/thanks?racing=1",
navigation: .checkout(1, .thanks(racing: true))
)

KSRAssertMatch(
.project(.slug("project"), .root, refInfo: RefInfo(.discovery)),
"/projects/creator/project?ref=discovery"
self.assertProjectMatch(
path: "/projects/creator/project?ref=discovery",
navigation: .root,
refTag: .discovery
)

KSRAssertMatch(
.project(.slug("project"), .comments, refInfo: nil),
"/projects/creator/project/comments"
)
self.assertProjectMatch(path: "/projects/creator/project/comments", navigation: .comments)

KSRAssertMatch(
.project(.slug("project"), .commentThread("dead", nil), refInfo: nil),
"/projects/creator/project/comments?comment=dead"
self.assertProjectMatch(
path: "/projects/creator/project/comments?comment=dead",
navigation: .commentThread("dead", nil)
)

KSRAssertMatch(
.project(.slug("project"), .commentThread("dead", "beef"), refInfo: nil),
"/projects/creator/project/comments?comment=dead&reply=beef"
self.assertProjectMatch(
path: "/projects/creator/project/comments?comment=dead&reply=beef",
navigation: .commentThread("dead", "beef")
)

KSRAssertMatch(
.project(.slug("project"), .creatorBio, refInfo: nil),
"/projects/creator/project/creator_bio"
)
self.assertProjectMatch(path: "/projects/creator/project/creator_bio", navigation: .creatorBio)

KSRAssertMatch(
.project(.slug("project"), .root, refInfo: nil),
"/projects/creator/project/description"
)
self.assertProjectMatch(path: "/projects/creator/project/description", navigation: .root)

KSRAssertMatch(
.project(.slug("project"), .friends, refInfo: nil),
"/projects/creator/project/friends"
)
self.assertProjectMatch(path: "/projects/creator/project/friends", navigation: .friends)

KSRAssertMatch(
.project(.slug("project"), .pledge(.bigPrint), refInfo: nil),
"/projects/creator/project/pledge/big_print"
self.assertProjectMatch(
path: "/projects/creator/project/pledge/big_print",
navigation: .pledge(.bigPrint)
)

KSRAssertMatch(
.project(.slug("project"), .pledge(.changeMethod), refInfo: nil),
"/projects/creator/project/pledge/change_method"
self.assertProjectMatch(
path: "/projects/creator/project/pledge/change_method",
navigation: .pledge(.changeMethod)
)

KSRAssertMatch(
.project(.slug("project"), .pledge(.destroy), refInfo: nil),
"/projects/creator/project/pledge/destroy"
self.assertProjectMatch(
path: "/projects/creator/project/pledge/destroy",
navigation: .pledge(.destroy)
)

KSRAssertMatch(
.project(.slug("project"), .pledge(.edit), refInfo: nil),
"/projects/creator/project/pledge/edit"
)
self.assertProjectMatch(path: "/projects/creator/project/pledge/edit", navigation: .pledge(.edit))

KSRAssertMatch(
.project(.slug("project"), .pledge(.new), refInfo: nil),
"/projects/creator/project/pledge/new"
)
self.assertProjectMatch(path: "/projects/creator/project/pledge/new", navigation: .pledge(.new))

KSRAssertMatch(
.project(.slug("project"), .pledge(.root), refInfo: nil),
"/projects/creator/project/pledge"
)
self.assertProjectMatch(path: "/projects/creator/project/pledge", navigation: .pledge(.root))

KSRAssertMatch(
.project(.slug("project"), .pledge(.manage), refInfo: RefInfo(.emailBackerFailedTransaction)),
"/projects/creator/project/pledge?ref=ksr_email_backer_failed_transaction"
self.assertProjectMatch(
path: "/projects/creator/project/pledge?ref=ksr_email_backer_failed_transaction",
navigation: .pledge(.manage),
refTag: .emailBackerFailedTransaction
)

KSRAssertMatch(
.project(.slug("project"), .updates, refInfo: nil),
"/projects/creator/project/posts"
)
self.assertProjectMatch(path: "/projects/creator/project/posts", navigation: .updates)

KSRAssertMatch(
.project(.slug("project"), .update(1, .root), refInfo: nil),
"/projects/creator/project/posts/1"
)
self.assertProjectMatch(path: "/projects/creator/project/posts/1", navigation: .update(1, .root))

KSRAssertMatch(
.project(.slug("project"), .update(2, .comments), refInfo: nil),
"/projects/creator/project/posts/2/comments"
self.assertProjectMatch(
path: "/projects/creator/project/posts/2/comments",
navigation: .update(2, .comments)
)

KSRAssertMatch(
.project(.slug("project"), .update(2, .commentThread("dead", nil)), refInfo: nil),
"/projects/creator/project/posts/2/comments?comment=dead"
self.assertProjectMatch(
path: "/projects/creator/project/posts/2/comments?comment=dead",
navigation: .update(2, .commentThread("dead", nil))
)

KSRAssertMatch(
.project(.slug("project"), .update(2, .commentThread("dead", "beef")), refInfo: nil),
"/projects/creator/project/posts/2/comments?comment=dead&reply=beef"
self.assertProjectMatch(
path: "/projects/creator/project/posts/2/comments?comment=dead&reply=beef",
navigation: .update(2, .commentThread("dead", "beef"))
)

KSRAssertMatch(
.project(.slug("project"), .survey(3), refInfo: nil),
"/projects/creator/project/surveys/3"
)
self.assertProjectMatch(path: "/projects/creator/project/surveys/3", navigation: .survey(3))

KSRAssertMatch(
.signup,
Expand Down Expand Up @@ -198,10 +167,7 @@ public final class NavigationTests: XCTestCase {
"/authorize"
)

KSRAssertMatch(
.project(.slug("project"), .messageCreator, refInfo: nil),
"/projects/creator/project/messages/new"
)
self.assertProjectMatch(path: "/projects/creator/project/messages/new", navigation: .messageCreator)

KSRAssertMatch(
.user(.slug("self"), .survey(3)),
Expand Down Expand Up @@ -248,10 +214,28 @@ public final class NavigationTests: XCTestCase {
}

func testRecognizesKsrUrlScheme() {
let projectRoute = Navigation
.match(URL(string: "ksr://www.kickstarter.com/projects/creator/project")!)
let url = "ksr://www.kickstarter.com/projects/creator/project"
let projectRoute = Navigation.match(URL(string: url)!)
let refInfo = RefInfo(nil, deeplinkUrl: url)

XCTAssertNotNil(projectRoute)
XCTAssertEqual(.project(.slug("project"), .root, refInfo: nil), projectRoute)
XCTAssertEqual(.project(.slug("project"), .root, refInfo: refInfo), projectRoute)
}

// MARK: - Helpers

private func refInfoFromPath(_ path: String, refTag: RefTag? = nil) -> RefInfo {
let baseUrl = AppEnvironment.current.apiService.serverConfig.webBaseUrl.absoluteString
let url = URL(string: "\(baseUrl)\(path)")
return RefInfo(refTag, deeplinkUrl: url?.absoluteString)
}

private func assertProjectMatch(path: String,
navigation: Navigation.Project,
refTag: RefTag? = nil) {
KSRAssertMatch(
.project(.slug("project"), navigation, refInfo: self.refInfoFromPath(path, refTag: refTag)),
path
)
}
}
4 changes: 3 additions & 1 deletion Library/RefInfo.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@ import KsApi

public struct RefInfo: Equatable, Hashable {
public let refTag: RefTag?
public let deeplinkUrl: String?

public init(_ refTag: RefTag?) {
public init(_ refTag: RefTag?, deeplinkUrl: String? = nil) {
self.refTag = refTag
self.deeplinkUrl = deeplinkUrl
}
}

Expand Down

0 comments on commit 08eee33

Please sign in to comment.