damus

nostr ios client
git clone git://jb55.com/damus
Log | Files | Refs | README | LICENSE

DamusPurpleURL.swift (1975B)


      1 //
      2 //  DamusPurpleURL.swift
      3 //  damus
      4 //
      5 //  Created by Daniel Nogueira on 2024-01-13.
      6 //
      7 
      8 import Foundation
      9 
     10 
     11 struct DamusPurpleURL: Equatable {
     12     let is_staging: Bool
     13     let variant: Self.Variant
     14 
     15     enum Variant: Equatable {
     16         case verify_npub(checkout_id: String)
     17         case welcome(checkout_id: String)
     18         case landing
     19     }
     20 
     21     init(is_staging: Bool, variant: Self.Variant) {
     22         self.is_staging = is_staging
     23         self.variant = variant
     24     }
     25 
     26     init?(url: URL) {
     27         guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false) else { return nil }
     28         guard components.scheme == "damus" else { return nil }
     29         let is_staging = components.find("staging") != nil
     30         switch components.path {
     31             case "purple:verify":
     32                 guard let checkout_id = components.find("id") else { return nil }
     33                 self = .init(is_staging: is_staging, variant: .verify_npub(checkout_id: checkout_id))
     34             case "purple:welcome":
     35                 guard let checkout_id = components.find("id") else { return nil }
     36                 self = .init(is_staging: is_staging, variant: .welcome(checkout_id: checkout_id))
     37             case "purple:landing":
     38                 self = .init(is_staging: is_staging, variant: .landing)
     39             default:
     40                 return nil
     41         }
     42     }
     43 
     44     func url_string() -> String {
     45         let staging = is_staging ? "&staging=true" : ""
     46         switch self.variant {
     47         case .verify_npub(let id):
     48             return "damus:purple:verify?id=\(id)\(staging)"
     49         case .welcome(let id):
     50             return "damus:purple:welcome?id=\(id)\(staging)"
     51         case .landing:
     52             let staging = is_staging ? "?staging=true" : ""
     53             return "damus:purple:landing\(staging)"
     54         }
     55     }
     56 
     57 }
     58 
     59 extension URLComponents {
     60     func find(_ name: String) -> String? {
     61         self.queryItems?.first(where: { qi in qi.name == name })?.value
     62     }
     63 }