From 19110398f8b566d3e925b91074c3c19d97b35f17 Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin Date: Wed, 4 Sep 2024 22:42:44 +0100 Subject: [PATCH] ios: close user picker before opening other sheets --- .../Shared/Views/ChatList/ChatListView.swift | 77 ++++++++++--------- .../Shared/Views/ChatList/UserPicker.swift | 23 +++--- 2 files changed, 50 insertions(+), 50 deletions(-) diff --git a/apps/ios/Shared/Views/ChatList/ChatListView.swift b/apps/ios/Shared/Views/ChatList/ChatListView.swift index da41fda635..fdf50b64a3 100644 --- a/apps/ios/Shared/Views/ChatList/ChatListView.swift +++ b/apps/ios/Shared/Views/ChatList/ChatListView.swift @@ -31,7 +31,7 @@ struct ChatListView: View { @State private var searchChatFilteredBySimplexLink: String? = nil @State private var scrollToSearchBar = false @State private var activeUserPickerSheet: UserPickerSheet? = nil - @State private var isUserPickerPresented: Bool = false + @State private var userPickerShown: Bool = false @AppStorage(DEFAULT_SHOW_UNREAD_AND_FAVORITES) private var showUnreadAndFavorites = false @AppStorage(GROUP_DEFAULT_ONE_HAND_UI, store: groupDefaults) private var oneHandUI = true @@ -58,43 +58,46 @@ struct ChatListView: View { destination: chatView ) { chatListView } } - .sheet(isPresented: $isUserPickerPresented) { - UserPicker(activeSheet: $activeUserPickerSheet) - .sheet(item: $activeUserPickerSheet) { sheet in - if let currentUser = chatModel.currentUser { - switch sheet { - case .address: - NavigationView { - UserAddressView(shareViaProfile: currentUser.addressShared) - .navigationTitle("Public address") - .navigationBarTitleDisplayMode(.large) - .modifier(ThemedBackground(grouped: true)) - } - case .chatProfiles: - NavigationView { - UserProfilesView() - } - case .currentProfile: - NavigationView { - UserProfile() - .navigationTitle("Your current profile") - .modifier(ThemedBackground()) - } - case .chatPreferences: - NavigationView { - PreferencesView(profile: currentUser.profile, preferences: currentUser.fullPreferences, currentPreferences: currentUser.fullPreferences) - .navigationTitle("Your preferences") - .navigationBarTitleDisplayMode(.large) - .modifier(ThemedBackground(grouped: true)) - } - case .useFromDesktop: - ConnectDesktopView(viaSettings: false) - case .settings: - SettingsView(showSettings: $showSettings) - .navigationBarTitleDisplayMode(.large) - } + .sheet(isPresented: $userPickerShown) { + UserPicker { + userPickerShown = false + activeUserPickerSheet = $0 + } + } + .sheet(item: $activeUserPickerSheet) { sheet in + if let currentUser = chatModel.currentUser { + switch sheet { + case .address: + NavigationView { + UserAddressView(shareViaProfile: currentUser.addressShared) + .navigationTitle("Public address") + .navigationBarTitleDisplayMode(.large) + .modifier(ThemedBackground(grouped: true)) } + case .chatProfiles: + NavigationView { + UserProfilesView() + } + case .currentProfile: + NavigationView { + UserProfile() + .navigationTitle("Your current profile") + .modifier(ThemedBackground()) + } + case .chatPreferences: + NavigationView { + PreferencesView(profile: currentUser.profile, preferences: currentUser.fullPreferences, currentPreferences: currentUser.fullPreferences) + .navigationTitle("Your preferences") + .navigationBarTitleDisplayMode(.large) + .modifier(ThemedBackground(grouped: true)) + } + case .useFromDesktop: + ConnectDesktopView(viaSettings: false) + case .settings: + SettingsView(showSettings: $showSettings) + .navigationBarTitleDisplayMode(.large) } + } } } @@ -207,7 +210,7 @@ struct ChatListView: View { } } .onTapGesture { - isUserPickerPresented = true + userPickerShown = true } } diff --git a/apps/ios/Shared/Views/ChatList/UserPicker.swift b/apps/ios/Shared/Views/ChatList/UserPicker.swift index 0d5f0249fa..25cb0e7932 100644 --- a/apps/ios/Shared/Views/ChatList/UserPicker.swift +++ b/apps/ios/Shared/Views/ChatList/UserPicker.swift @@ -12,8 +12,7 @@ struct UserPicker: View { @Environment(\.dynamicTypeSize) private var userFont: DynamicTypeSize @Environment(\.scenePhase) private var scenePhase: ScenePhase @Environment(\.colorScheme) private var colorScheme: ColorScheme - @Environment(\.dismiss) private var dismiss: DismissAction - @Binding var activeSheet: UserPickerSheet? + let setActiveSheet: (UserPickerSheet?) -> Void @State private var switchingProfile = false var body: some View { @@ -46,15 +45,15 @@ struct UserPicker: View { } } }) { - activeSheet = .currentProfile + setActiveSheet(.currentProfile) } openSheetOnTap(title: m.userAddress == nil ? "Create public address" : "Your public address", icon: "qrcode") { - activeSheet = .address + setActiveSheet(.address) } openSheetOnTap(title: "Chat preferences", icon: "switch.2") { - activeSheet = .chatPreferences + setActiveSheet(.chatPreferences) } } } @@ -62,7 +61,7 @@ struct UserPicker: View { Section { if otherUsers.isEmpty { openSheetOnTap(title: "Your chat profiles", icon: "person.crop.rectangle.stack") { - activeSheet = .chatProfiles + setActiveSheet(.chatProfiles) } } else { let v = userPickerRow(otherUsers, size: 44) @@ -75,12 +74,12 @@ struct UserPicker: View { } openSheetOnTap(title: "Use from desktop", icon: "desktopcomputer") { - activeSheet = .useFromDesktop + setActiveSheet(.useFromDesktop) } HStack { openSheetOnTap(title: "Settings", icon: "gearshape") { - activeSheet = .settings + setActiveSheet(.settings) } Label {} icon: { Image(systemName: colorScheme == .light ? "sun.max" : "moon.fill") @@ -181,7 +180,7 @@ struct UserPicker: View { .foregroundColor(theme.colors.secondary) .padding(.trailing, 4) .onTapGesture { - activeSheet = .chatProfiles + setActiveSheet(.chatProfiles) } } } @@ -202,7 +201,7 @@ struct UserPicker: View { try await changeActiveUserAsync_(u.user.userId, viewPwd: nil) await MainActor.run { switchingProfile = false - dismiss() + setActiveSheet(nil) } } catch { await MainActor.run { @@ -250,12 +249,10 @@ struct UserPicker: View { struct UserPicker_Previews: PreviewProvider { static var previews: some View { - @State var activeSheet: UserPickerSheet? - let m = ChatModel() m.users = [UserInfo.sampleData, UserInfo.sampleData] return UserPicker( - activeSheet: $activeSheet + setActiveSheet: { _ in } ) .environmentObject(m) }