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