From 438c9d2b48a38669c9f71c5d2c656f196ff84918 Mon Sep 17 00:00:00 2001 From: Levitating Pineapple Date: Sat, 10 Aug 2024 14:40:43 +0300 Subject: [PATCH] simplify navigation (wip) --- .../Views/ChatList/ChatListNavLink.swift | 57 +++++++++++++------ .../Shared/Views/ChatList/ChatListView.swift | 8 +-- .../Shared/Views/Helpers/NavLinkPlain.swift | 30 ---------- .../Shared/Views/Helpers/NavStackCompat.swift | 43 -------------- apps/ios/SimpleX.xcodeproj/project.pbxproj | 8 --- 5 files changed, 41 insertions(+), 105 deletions(-) delete mode 100644 apps/ios/Shared/Views/Helpers/NavLinkPlain.swift delete mode 100644 apps/ios/Shared/Views/Helpers/NavStackCompat.swift diff --git a/apps/ios/Shared/Views/ChatList/ChatListNavLink.swift b/apps/ios/Shared/Views/ChatList/ChatListNavLink.swift index 3de6c93101..92e15e4af0 100644 --- a/apps/ios/Shared/Views/ChatList/ChatListNavLink.swift +++ b/apps/ios/Shared/Views/ChatList/ChatListNavLink.swift @@ -113,11 +113,9 @@ struct ChatListNavLink: View { Button("Use new incognito profile") { connectContactViaAddress_(contact, true) } } } else { - NavLinkPlain( - tag: chat.chatInfo.id, - selection: $chatModel.chatId, - label: { ChatPreviewView(chat: chat, progressByTimeout: Binding.constant(false)) } - ) + ChatNavLink(chatId: chat.chatInfo.id, selection: $chatModel.chatId) { + ChatPreviewView(chat: chat, progressByTimeout: Binding.constant(false)) + } .swipeActions(edge: .leading, allowsFullSwipe: true) { markReadButton() toggleFavoriteButton() @@ -193,12 +191,10 @@ struct ChatListNavLink: View { } } default: - NavLinkPlain( - tag: chat.chatInfo.id, - selection: $chatModel.chatId, - label: { ChatPreviewView(chat: chat, progressByTimeout: Binding.constant(false)) }, - disabled: !groupInfo.ready - ) + ChatNavLink(chatId: chat.chatInfo.id, selection: $chatModel.chatId) { + ChatPreviewView(chat: chat, progressByTimeout: Binding.constant(false)) + } + .disabled(!groupInfo.ready) .frame(height: dynamicRowHeight) .swipeActions(edge: .leading, allowsFullSwipe: true) { markReadButton() @@ -220,12 +216,10 @@ struct ChatListNavLink: View { } @ViewBuilder private func noteFolderNavLink(_ noteFolder: NoteFolder) -> some View { - NavLinkPlain( - tag: chat.chatInfo.id, - selection: $chatModel.chatId, - label: { ChatPreviewView(chat: chat, progressByTimeout: Binding.constant(false)) }, - disabled: !noteFolder.ready - ) + ChatNavLink(chatId: chat.chatInfo.id, selection: $chatModel.chatId) { + ChatPreviewView(chat: chat, progressByTimeout: Binding.constant(false)) + } + .disabled(!noteFolder.ready) .frame(height: dynamicRowHeight) .swipeActions(edge: .leading, allowsFullSwipe: true) { markReadButton() @@ -481,6 +475,35 @@ struct ChatListNavLink: View { } } +struct ChatNavLink: View { + let chatId: ChatId + @Binding var selection: ChatId? + let label: () -> L + + var body: some View { + NavigationLink( + isActive: Binding( + get: { selection == chatId }, + set: { isActive in + if isActive { + selection = chatId + } else if selection == chatId { + selection = nil + } + } + ) + ) { + if let chat = ChatModel.shared.getChat(chatId) { + ChatView(chat: chat) + } + } label: { + label().background(.red) + } + } +} + + + func rejectContactRequestAlert(_ contactRequest: UserContactRequest) -> Alert { Alert( title: Text("Reject contact request"), diff --git a/apps/ios/Shared/Views/ChatList/ChatListView.swift b/apps/ios/Shared/Views/ChatList/ChatListView.swift index 8a27ac2a9c..6a33372317 100644 --- a/apps/ios/Shared/Views/ChatList/ChatListView.swift +++ b/apps/ios/Shared/Views/ChatList/ChatListView.swift @@ -37,13 +37,7 @@ struct ChatListView: View { private var viewBody: some View { ZStack(alignment: oneHandUI ? .bottomLeading : .topLeading) { - NavStackCompat( - isActive: Binding( - get: { chatModel.chatId != nil }, - set: { _ in } - ), - destination: chatView - ) { chatListView } + NavigationView { chatListView } if userPickerVisible { Rectangle().fill(.white.opacity(0.001)).onTapGesture { withAnimation { diff --git a/apps/ios/Shared/Views/Helpers/NavLinkPlain.swift b/apps/ios/Shared/Views/Helpers/NavLinkPlain.swift deleted file mode 100644 index 2d5458b9d3..0000000000 --- a/apps/ios/Shared/Views/Helpers/NavLinkPlain.swift +++ /dev/null @@ -1,30 +0,0 @@ -// -// NavLinkPlain.swift -// SimpleX -// -// Created by Evgeny Poberezkin on 11/02/2022. -// Copyright © 2022 SimpleX Chat. All rights reserved. -// - -import SwiftUI - -struct NavLinkPlain: View { - @State var tag: V - @Binding var selection: V? - @ViewBuilder var label: () -> Label - var disabled = false - - var body: some View { - ZStack { - Button("") { DispatchQueue.main.async { selection = tag } } - .disabled(disabled) - label() - } - } -} - -//struct NavLinkPlain_Previews: PreviewProvider { -// static var previews: some View { -// NavLinkPlain() -// } -//} diff --git a/apps/ios/Shared/Views/Helpers/NavStackCompat.swift b/apps/ios/Shared/Views/Helpers/NavStackCompat.swift deleted file mode 100644 index 6e3b89c9b8..0000000000 --- a/apps/ios/Shared/Views/Helpers/NavStackCompat.swift +++ /dev/null @@ -1,43 +0,0 @@ -// -// NavStackCompat.swift -// SimpleX (iOS) -// -// Created by Evgeny on 23/01/2023. -// Copyright © 2023 SimpleX Chat. All rights reserved. -// - -import SwiftUI - -struct NavStackCompat : View { - let isActive: Binding - let destination: () -> D - let content: () -> C - - var body: some View { - if #available(iOS 16, *) { - NavigationStack(path: Binding( - get: { isActive.wrappedValue ? [true] : [] }, - set: { _ in } - )) { - ZStack { - NavigationLink(value: true) { EmptyView() } - content() - } - .navigationDestination(for: Bool.self) { show in - if show { destination() } - } - } - } else { - NavigationView { - ZStack { - NavigationLink( - destination: destination(), - isActive: isActive - ) { EmptyView() } - content() - } - } - .navigationViewStyle(.stack) - } - } -} diff --git a/apps/ios/SimpleX.xcodeproj/project.pbxproj b/apps/ios/SimpleX.xcodeproj/project.pbxproj index c689da10f3..7a66c70dc9 100644 --- a/apps/ios/SimpleX.xcodeproj/project.pbxproj +++ b/apps/ios/SimpleX.xcodeproj/project.pbxproj @@ -57,7 +57,6 @@ 5C6BA667289BD954009B8ECC /* DismissSheets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C6BA666289BD954009B8ECC /* DismissSheets.swift */; }; 5C7031162953C97F00150A12 /* CIFeaturePreferenceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C7031152953C97F00150A12 /* CIFeaturePreferenceView.swift */; }; 5C7505A227B65FDB00BE3227 /* CIMetaView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C7505A127B65FDB00BE3227 /* CIMetaView.swift */; }; - 5C7505A527B679EE00BE3227 /* NavLinkPlain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C7505A427B679EE00BE3227 /* NavLinkPlain.swift */; }; 5C7505A827B6D34800BE3227 /* ChatInfoToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C7505A727B6D34800BE3227 /* ChatInfoToolbar.swift */; }; 5C764E89279CBCB3000C6508 /* ChatModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C764E88279CBCB3000C6508 /* ChatModel.swift */; }; 5C8F01CD27A6F0D8007D2C8D /* CodeScanner in Frameworks */ = {isa = PBXBuildFile; productRef = 5C8F01CC27A6F0D8007D2C8D /* CodeScanner */; }; @@ -109,7 +108,6 @@ 5CC2C0FC2809BF11000C35E3 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5CC2C0FA2809BF11000C35E3 /* Localizable.strings */; }; 5CC2C0FF2809BF11000C35E3 /* SimpleX--iOS--InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5CC2C0FD2809BF11000C35E3 /* SimpleX--iOS--InfoPlist.strings */; }; 5CC868F329EB540C0017BBFD /* CIRcvDecryptionError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CC868F229EB540C0017BBFD /* CIRcvDecryptionError.swift */; }; - 5CCB939C297EFCB100399E78 /* NavStackCompat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCB939B297EFCB100399E78 /* NavStackCompat.swift */; }; 5CD67B8F2B0E858A00C510B1 /* hs_init.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CD67B8D2B0E858A00C510B1 /* hs_init.h */; settings = {ATTRIBUTES = (Public, ); }; }; 5CD67B902B0E858A00C510B1 /* hs_init.c in Sources */ = {isa = PBXBuildFile; fileRef = 5CD67B8E2B0E858A00C510B1 /* hs_init.c */; }; 5CDCAD482818589900503DA2 /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CDCAD472818589900503DA2 /* NotificationService.swift */; }; @@ -372,7 +370,6 @@ 5C6D183329E93FBA00D430B3 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/InfoPlist.strings; sourceTree = ""; }; 5C7031152953C97F00150A12 /* CIFeaturePreferenceView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIFeaturePreferenceView.swift; sourceTree = ""; }; 5C7505A127B65FDB00BE3227 /* CIMetaView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIMetaView.swift; sourceTree = ""; }; - 5C7505A427B679EE00BE3227 /* NavLinkPlain.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavLinkPlain.swift; sourceTree = ""; }; 5C7505A727B6D34800BE3227 /* ChatInfoToolbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatInfoToolbar.swift; sourceTree = ""; }; 5C764E88279CBCB3000C6508 /* ChatModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatModel.swift; sourceTree = ""; }; 5C84FE9129A216C800D95B1A /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = ""; }; @@ -447,7 +444,6 @@ 5CC2C0FB2809BF11000C35E3 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; 5CC2C0FE2809BF11000C35E3 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = "ru.lproj/SimpleX--iOS--InfoPlist.strings"; sourceTree = ""; }; 5CC868F229EB540C0017BBFD /* CIRcvDecryptionError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIRcvDecryptionError.swift; sourceTree = ""; }; - 5CCB939B297EFCB100399E78 /* NavStackCompat.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavStackCompat.swift; sourceTree = ""; }; 5CD67B8D2B0E858A00C510B1 /* hs_init.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = hs_init.h; sourceTree = ""; }; 5CD67B8E2B0E858A00C510B1 /* hs_init.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = hs_init.c; sourceTree = ""; }; 5CDCAD452818589900503DA2 /* SimpleX NSE.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "SimpleX NSE.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -772,7 +768,6 @@ isa = PBXGroup; children = ( 5C971E2027AEBF8300C8A3CE /* ChatInfoImage.swift */, - 5C7505A427B679EE00BE3227 /* NavLinkPlain.swift */, 5CC1C99427A6CF7F000D9FF6 /* ShareSheet.swift */, 5C3A88CD27DF50170060F1C2 /* DetermineWidth.swift */, 5C5F2B6C27EBC3FE006A9D5F /* ImagePicker.swift */, @@ -782,7 +777,6 @@ 5C6BA666289BD954009B8ECC /* DismissSheets.swift */, 5CA7DFC229302AF000F7FDDE /* AppSheet.swift */, 18415A7F0F189D87DEFEABCA /* PressedButtonStyle.swift */, - 5CCB939B297EFCB100399E78 /* NavStackCompat.swift */, 18415DAAAD1ADBEDB0EDA852 /* VideoPlayerView.swift */, 64466DCB29FFE3E800E3D48D /* MailView.swift */, 64C3B0202A0D359700E19930 /* CustomTimePicker.swift */, @@ -1428,7 +1422,6 @@ 640417CD2B29B8C200CCB412 /* NewChatMenuButton.swift in Sources */, 5CFE0921282EEAF60002594B /* ZoomableScrollView.swift in Sources */, 5C3A88CE27DF50170060F1C2 /* DetermineWidth.swift in Sources */, - 5C7505A527B679EE00BE3227 /* NavLinkPlain.swift in Sources */, 5C58BCD6292BEBE600AF9E4F /* CIChatFeatureView.swift in Sources */, 5CB346E72868D76D001FD2EF /* NotificationsView.swift in Sources */, 647F090E288EA27B00644C40 /* GroupMemberInfoView.swift in Sources */, @@ -1473,7 +1466,6 @@ 5C9C2DA52894777E00CC63B1 /* GroupProfileView.swift in Sources */, 5CEACCED27DEA495000BD591 /* MsgContentView.swift in Sources */, 8C81482C2BD91CD4002CBEC3 /* AudioDevicePicker.swift in Sources */, - 5CCB939C297EFCB100399E78 /* NavStackCompat.swift in Sources */, 5C764E89279CBCB3000C6508 /* ChatModel.swift in Sources */, 5C971E1D27AEBEF600C8A3CE /* ChatInfoView.swift in Sources */, 5CBD285C29575B8E00EC2CF4 /* WhatsNewView.swift in Sources */,