damus

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

Router.swift (9501B)


      1 //
      2 //  Router.swift
      3 //  damus
      4 //
      5 //  Created by Scott Penrose on 5/7/23.
      6 //
      7 
      8 import SwiftUI
      9 
     10 enum Route: Hashable {
     11     case ProfileByKey(pubkey: Pubkey)
     12     case Profile(profile: ProfileModel, followers: FollowersModel)
     13     case Followers(followers: FollowersModel)
     14     case Relay(relay: RelayURL, showActionButtons: Binding<Bool>)
     15     case RelayDetail(relay: RelayURL, metadata: RelayMetadata?)
     16     case Following(following: FollowingModel)
     17     case MuteList
     18     case RelayConfig
     19     case Script(script: ScriptModel)
     20     case Bookmarks
     21     case Config
     22     case EditMetadata
     23     case DMChat(dms: DirectMessageModel)
     24     case UserRelays(relays: [RelayURL])
     25     case KeySettings(keypair: Keypair)
     26     case AppearanceSettings(settings: UserSettingsStore)
     27     case NotificationSettings(settings: UserSettingsStore)
     28     case ZapSettings(settings: UserSettingsStore)
     29     case TranslationSettings(settings: UserSettingsStore)
     30     case ReactionsSettings(settings: UserSettingsStore)
     31     case SearchSettings(settings: UserSettingsStore)
     32     case DeveloperSettings(settings: UserSettingsStore)
     33     case FirstAidSettings(settings: UserSettingsStore)
     34     case Thread(thread: ThreadModel)
     35     case Reposts(reposts: EventsModel)
     36     case QuoteReposts(quotes: EventsModel)
     37     case Reactions(reactions: EventsModel)
     38     case Zaps(target: ZapTarget)
     39     case Search(search: SearchModel)
     40     case EULA
     41     case Login
     42     case CreateAccount
     43     case SaveKeys(account: CreateAccountModel)
     44     case Wallet(wallet: WalletModel)
     45     case WalletScanner(result: Binding<WalletScanResult>)
     46     case FollowersYouKnow(friendedFollowers: [Pubkey], followers: FollowersModel)
     47 
     48     @ViewBuilder
     49     func view(navigationCoordinator: NavigationCoordinator, damusState: DamusState) -> some View {
     50         switch self {
     51         case .ProfileByKey(let pubkey):
     52             ProfileView(damus_state: damusState, pubkey: pubkey)
     53         case .Profile(let profile, let followers):
     54             ProfileView(damus_state: damusState, profile: profile, followers: followers)
     55         case .Followers(let followers):
     56             FollowersView(damus_state: damusState, followers: followers)
     57         case .Relay(let relay, let showActionButtons):
     58             RelayView(state: damusState, relay: relay, showActionButtons: showActionButtons, recommended: false)
     59         case .RelayDetail(let relay, let metadata):
     60             RelayDetailView(state: damusState, relay: relay, nip11: metadata)
     61         case .Following(let following):
     62             FollowingView(damus_state: damusState, following: following)
     63         case .MuteList:
     64             MutelistView(damus_state: damusState)
     65         case .RelayConfig:
     66             RelayConfigView(state: damusState)
     67         case .Bookmarks:
     68             BookmarksView(state: damusState)
     69         case .Config:
     70             ConfigView(state: damusState)
     71         case .EditMetadata:
     72             EditMetadataView(damus_state: damusState)
     73         case .DMChat(let dms):
     74             DMChatView(damus_state: damusState, dms: dms)
     75         case .UserRelays(let relays):
     76             UserRelaysView(state: damusState, relays: relays)
     77         case .KeySettings(let keypair):
     78             KeySettingsView(keypair: keypair)
     79         case .AppearanceSettings(let settings):
     80             AppearanceSettingsView(damus_state: damusState, settings: settings)
     81         case .NotificationSettings(let settings):
     82             NotificationSettingsView(settings: settings)
     83         case .ZapSettings(let settings):
     84             ZapSettingsView(settings: settings)
     85         case .TranslationSettings(let settings):
     86             TranslationSettingsView(settings: settings, damus_state: damusState)
     87         case .ReactionsSettings(let settings):
     88             ReactionsSettingsView(settings: settings)
     89         case .SearchSettings(let settings):
     90             SearchSettingsView(settings: settings)
     91         case .DeveloperSettings(let settings):
     92             DeveloperSettingsView(settings: settings)
     93         case .FirstAidSettings(settings: let settings):
     94             FirstAidSettingsView(damus_state: damusState, settings: settings)
     95         case .Thread(let thread):
     96             ThreadView(state: damusState, thread: thread)
     97         case .Reposts(let reposts):
     98             RepostsView(damus_state: damusState, model: reposts)
     99         case .QuoteReposts(let quote_reposts):
    100             QuoteRepostsView(damus_state: damusState, model: quote_reposts)
    101         case .Reactions(let reactions):
    102             ReactionsView(damus_state: damusState, model: reactions)
    103         case .Zaps(let target):
    104             ZapsView(state: damusState, target: target)
    105         case .Search(let search):
    106             SearchView(appstate: damusState, search: search)
    107         case .EULA:
    108             EULAView(nav: navigationCoordinator)
    109         case .Login:
    110             LoginView(nav: navigationCoordinator)
    111         case .CreateAccount:
    112             CreateAccountView(nav: navigationCoordinator)
    113         case .SaveKeys(let account):
    114             SaveKeysView(account: account)
    115         case .Wallet(let walletModel):
    116             WalletView(damus_state: damusState, model: walletModel)
    117         case .WalletScanner(let walletScanResult):
    118             WalletScannerView(result: walletScanResult)
    119         case .FollowersYouKnow(let friendedFollowers, let followers):
    120             FollowersYouKnowView(damus_state: damusState, friended_followers: friendedFollowers, followers: followers)
    121         case .Script(let load_model):
    122             LoadScript(pool: damusState.pool, model: load_model)
    123         }
    124     }
    125 
    126     static func == (lhs: Route, rhs: Route) -> Bool {
    127         return lhs.hashValue == rhs.hashValue
    128     }
    129 
    130     func hash(into hasher: inout Hasher) {
    131         switch self {
    132         case .ProfileByKey(let pubkey):
    133             hasher.combine("profilebykey")
    134             hasher.combine(pubkey.id.bytes)
    135         case .Profile(let profile, _):
    136             hasher.combine("profile")
    137             hasher.combine(profile.pubkey.id.bytes)
    138         case .Followers:
    139             hasher.combine("followers")
    140         case .Relay(let relay, _):
    141             hasher.combine("relay")
    142             hasher.combine(relay)
    143         case .RelayDetail(let relay, _):
    144             hasher.combine("relayDetail")
    145             hasher.combine(relay)
    146         case .Following:
    147             hasher.combine("following")
    148         case .MuteList:
    149             hasher.combine("muteList")
    150         case .RelayConfig:
    151             hasher.combine("relayConfig")
    152         case .Bookmarks:
    153             hasher.combine("bookmarks")
    154         case .Config:
    155             hasher.combine("config")
    156         case .EditMetadata:
    157             hasher.combine("editMetadata")
    158         case .DMChat(let dms):
    159             hasher.combine("dms")
    160             hasher.combine(dms.our_pubkey)
    161         case .UserRelays(let relays):
    162             hasher.combine("userRelays")
    163             hasher.combine(relays)
    164         case .KeySettings(let keypair):
    165             hasher.combine("keySettings")
    166             hasher.combine(keypair.pubkey)
    167         case .AppearanceSettings:
    168             hasher.combine("appearanceSettings")
    169         case .NotificationSettings:
    170             hasher.combine("notificationSettings")
    171         case .ZapSettings:
    172             hasher.combine("zapSettings")
    173         case .TranslationSettings:
    174             hasher.combine("translationSettings")
    175         case .ReactionsSettings:
    176             hasher.combine("reactionsSettings")
    177         case .SearchSettings:
    178             hasher.combine("searchSettings")
    179         case .DeveloperSettings:
    180             hasher.combine("developerSettings")
    181         case .FirstAidSettings:
    182             hasher.combine("firstAidSettings")
    183         case .Thread(let threadModel):
    184             hasher.combine("thread")
    185             hasher.combine(threadModel.event.id)
    186         case .Reposts(let reposts):
    187             hasher.combine("reposts")
    188             hasher.combine(reposts.target)
    189         case .QuoteReposts(let evs_model):
    190             hasher.combine("quote_reposts")
    191             hasher.combine(evs_model.events.events.count)
    192         case .Zaps(let target):
    193             hasher.combine("zaps")
    194             hasher.combine(target.id)
    195             hasher.combine(target.pubkey)
    196         case .Reactions(let reactions):
    197             hasher.combine("reactions")
    198             hasher.combine(reactions.target)
    199         case .Search(let search):
    200             hasher.combine("search")
    201             hasher.combine(search.search)
    202         case .EULA:
    203             hasher.combine("eula")
    204         case .Login:
    205             hasher.combine("login")
    206         case .CreateAccount:
    207             hasher.combine("createAccount")
    208         case .SaveKeys(let account):
    209             hasher.combine("saveKeys")
    210             hasher.combine(account.pubkey)
    211         case .Wallet:
    212             hasher.combine("wallet")
    213         case .WalletScanner:
    214             hasher.combine("walletScanner")
    215         case .FollowersYouKnow(let friendedFollowers, let followers):
    216             hasher.combine("followersYouKnow")
    217             hasher.combine(friendedFollowers)
    218             hasher.combine(followers.sub_id)
    219         case .Script(let model):
    220             hasher.combine("script")
    221             hasher.combine(model.data.count)
    222         }
    223     }
    224 }
    225 
    226 class NavigationCoordinator: ObservableObject {
    227     @Published var path = [Route]()
    228 
    229     func push(route: Route) {
    230         guard route != path.last else {
    231             return
    232         }
    233         path.append(route)
    234     }
    235     
    236     func isAtRoot() -> Bool {
    237         return path.count == 0
    238     }
    239 
    240     func popToRoot() {
    241         path = []
    242     }
    243 }