diff --git a/apple/VniDrop/Features/Contacts/ContactsScreen.swift b/apple/VniDrop/Features/Contacts/ContactsScreen.swift index 77f9a79..c60588d 100644 --- a/apple/VniDrop/Features/Contacts/ContactsScreen.swift +++ b/apple/VniDrop/Features/Contacts/ContactsScreen.swift @@ -25,7 +25,7 @@ struct ContactsScreen: View { } else { Section(String(localized: L10n.Contacts.title)) { ForEach(model.state.contacts) { contact in - NavigationLink(value: contact.endpointId) { + NavigationLink(value: SettingsSection.contactDetail(endpointId: contact.endpointId)) { ContactRow(contact: contact) } } @@ -75,9 +75,6 @@ struct ContactsScreen: View { } .formStyle(.grouped) .navigationTitle(Text(String(localized: L10n.Contacts.title))) - .navigationDestination(for: String.self) { endpointId in - ContactDetailScreen(model: model, endpointId: endpointId) - } .task { await model.refresh() } } } diff --git a/apple/VniDrop/Features/Settings/SettingsModel.swift b/apple/VniDrop/Features/Settings/SettingsModel.swift index 8ae3a32..7053a08 100644 --- a/apple/VniDrop/Features/Settings/SettingsModel.swift +++ b/apple/VniDrop/Features/Settings/SettingsModel.swift @@ -9,6 +9,9 @@ enum SettingsSection: Hashable { case notifications case network case contacts + /// One device's detail. Part of this enum because the Settings stack has a + /// typed path: a link carrying any other value type cannot push onto it. + case contactDetail(endpointId: String) case storage case about case bugReport @@ -20,7 +23,7 @@ enum SettingsSection: Hashable { case .appearance: return L10n.Appearance.title case .notifications: return L10n.Notifications.title case .network: return L10n.Settings.networkTitle - case .contacts: return L10n.Contacts.title + case .contacts, .contactDetail: return L10n.Contacts.title case .storage: return L10n.Storage.title case .about: return L10n.About.title case .bugReport: return L10n.About.bugReport diff --git a/apple/VniDrop/Features/Settings/SettingsScreen.swift b/apple/VniDrop/Features/Settings/SettingsScreen.swift index c2e4176..6796771 100644 --- a/apple/VniDrop/Features/Settings/SettingsScreen.swift +++ b/apple/VniDrop/Features/Settings/SettingsScreen.swift @@ -15,6 +15,8 @@ struct SettingsScreen: View { switch model.state.selectedSection { case .overview: return [] case .bugReport: return [.about, .bugReport] + case .contactDetail(let endpointId): + return [.contacts, .contactDetail(endpointId: endpointId)] case let section: return [section] } }, @@ -92,7 +94,9 @@ struct SettingsScreen: View { private func sectionForm(_ section: SettingsSection) -> some View { // Contacts brings its own Form and push destination, so it is not wrapped // in the shared section chrome. - if section == .contacts { + if case .contactDetail(let endpointId) = section { + ContactDetailScreen(model: contacts, endpointId: endpointId) + } else if section == .contacts { ContactsScreen(model: contacts) { model.reportNothingWaiting() } @@ -153,7 +157,7 @@ private struct SettingsSectionContent: View { NetworkSettings(model: model) case .storage: StorageSettings(model: model) - case .contacts: + case .contacts, .contactDetail: // Rendered by SettingsScreen itself, which owns the contacts model. EmptyView() case .about: