purple: add staging option to DamusPurpleURL
Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
@@ -1094,7 +1094,7 @@ enum OpenResult {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func on_open_url(state: DamusState, url: URL, result: @escaping (OpenResult?) -> Void) {
|
func on_open_url(state: DamusState, url: URL, result: @escaping (OpenResult?) -> Void) {
|
||||||
if let purple_url = DamusPurpleURL.from_url(url: url) {
|
if let purple_url = DamusPurpleURL(url: url) {
|
||||||
result(.purple(purple_url))
|
result(.purple(purple_url))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,39 +7,53 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
enum DamusPurpleURL {
|
|
||||||
case verify_npub(checkout_id: String)
|
|
||||||
case welcome(checkout_id: String)
|
|
||||||
case landing
|
|
||||||
|
|
||||||
static func from_url(url: URL) -> DamusPurpleURL? {
|
struct DamusPurpleURL: Equatable {
|
||||||
|
let is_staging: Bool
|
||||||
|
let variant: Self.Variant
|
||||||
|
|
||||||
|
enum Variant: Equatable {
|
||||||
|
case verify_npub(checkout_id: String)
|
||||||
|
case welcome(checkout_id: String)
|
||||||
|
case landing
|
||||||
|
}
|
||||||
|
|
||||||
|
init(is_staging: Bool, variant: Self.Variant) {
|
||||||
|
self.is_staging = is_staging
|
||||||
|
self.variant = variant
|
||||||
|
}
|
||||||
|
|
||||||
|
init?(url: URL) {
|
||||||
guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false) else { return nil }
|
guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false) else { return nil }
|
||||||
guard components.scheme == "damus" else { return nil }
|
guard components.scheme == "damus" else { return nil }
|
||||||
|
let is_staging = components.find("staging") != nil
|
||||||
switch components.path {
|
switch components.path {
|
||||||
case "purple:verify":
|
case "purple:verify":
|
||||||
guard let checkout_id = components.find("id") else { return nil }
|
guard let checkout_id = components.find("id") else { return nil }
|
||||||
return .verify_npub(checkout_id: checkout_id)
|
self = .init(is_staging: is_staging, variant: .verify_npub(checkout_id: checkout_id))
|
||||||
case "purple:welcome":
|
case "purple:welcome":
|
||||||
guard let checkout_id = components.find("id") else { return nil }
|
guard let checkout_id = components.find("id") else { return nil }
|
||||||
return .welcome(checkout_id: checkout_id)
|
self = .init(is_staging: is_staging, variant: .welcome(checkout_id: checkout_id))
|
||||||
case "purple:landing":
|
case "purple:landing":
|
||||||
return .landing
|
self = .init(is_staging: is_staging, variant: .landing)
|
||||||
default:
|
default:
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func url_string() -> String {
|
func url_string() -> String {
|
||||||
switch self {
|
let staging = is_staging ? "&staging=true" : ""
|
||||||
case .verify_npub(let id):
|
switch self.variant {
|
||||||
return "damus:purple:verify?id=\(id)"
|
case .verify_npub(let id):
|
||||||
case .welcome(let id):
|
return "damus:purple:verify?id=\(id)\(staging)"
|
||||||
return "damus:purple:welcome?id=\(id)"
|
case .welcome(let id):
|
||||||
case .landing:
|
return "damus:purple:welcome?id=\(id)\(staging)"
|
||||||
return "damus:purple:landing"
|
case .landing:
|
||||||
|
let staging = is_staging ? "?staging=true" : ""
|
||||||
|
return "damus:purple:landing\(staging)"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extension URLComponents {
|
extension URLComponents {
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ struct DamusPurpleURLSheetView: View {
|
|||||||
let purple_url: DamusPurpleURL
|
let purple_url: DamusPurpleURL
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
switch self.purple_url {
|
switch self.purple_url.variant {
|
||||||
case .verify_npub(let checkout_id):
|
case .verify_npub(let checkout_id):
|
||||||
DamusPurpleVerifyNpubView(damus_state: damus_state, checkout_id: checkout_id)
|
DamusPurpleVerifyNpubView(damus_state: damus_state, checkout_id: checkout_id)
|
||||||
case .welcome(_):
|
case .welcome(_):
|
||||||
@@ -28,7 +28,7 @@ struct DamusPurpleURLSheetView: View {
|
|||||||
|
|
||||||
struct DamusPurpleURLSheetView_Previews: PreviewProvider {
|
struct DamusPurpleURLSheetView_Previews: PreviewProvider {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
DamusPurpleURLSheetView(damus_state: test_damus_state, purple_url: .verify_npub(checkout_id: "123"))
|
DamusPurpleURLSheetView(damus_state: test_damus_state, purple_url: .init(is_staging: false, variant: .verify_npub(checkout_id: "123")))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,24 @@ final class UrlTests: XCTestCase {
|
|||||||
// Put teardown code here. This method is called after the invocation of each test method in the class.
|
// Put teardown code here. This method is called after the invocation of each test method in the class.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testPurpleUrls() {
|
||||||
|
let landing_staging = DamusPurpleURL(is_staging: true, variant: .landing)
|
||||||
|
let welcome_staging = DamusPurpleURL(is_staging: true, variant: .welcome(checkout_id: "abc"))
|
||||||
|
let verify_staging = DamusPurpleURL(is_staging: true, variant: .verify_npub(checkout_id: "abc"))
|
||||||
|
|
||||||
|
let landing = DamusPurpleURL(is_staging: false, variant: .landing)
|
||||||
|
let welcome = DamusPurpleURL(is_staging: false, variant: .welcome(checkout_id: "abc"))
|
||||||
|
let verify = DamusPurpleURL(is_staging: false, variant: .verify_npub(checkout_id: "abc"))
|
||||||
|
|
||||||
|
XCTAssertEqual(landing_staging, .init(url: URL(string: landing_staging.url_string())!)!)
|
||||||
|
XCTAssertEqual(welcome_staging, .init(url: URL(string: welcome_staging.url_string())!)!)
|
||||||
|
XCTAssertEqual(verify_staging, .init(url: URL(string: verify_staging.url_string())!)!)
|
||||||
|
|
||||||
|
XCTAssertEqual(landing, .init(url: URL(string: landing.url_string())!)!)
|
||||||
|
XCTAssertEqual(welcome, .init(url: URL(string: welcome.url_string())!)!)
|
||||||
|
XCTAssertEqual(verify, .init(url: URL(string: verify.url_string())!)!)
|
||||||
|
}
|
||||||
|
|
||||||
func testParseUrlTrailingParenthesis() {
|
func testParseUrlTrailingParenthesis() {
|
||||||
let testURL = URL(string: "https://en.m.wikipedia.org/wiki/Delicious_(website)")
|
let testURL = URL(string: "https://en.m.wikipedia.org/wiki/Delicious_(website)")
|
||||||
XCTAssertNotNil(testURL)
|
XCTAssertNotNil(testURL)
|
||||||
|
|||||||
Reference in New Issue
Block a user