ios: close user picker before opening other sheets

This commit is contained in:
Evgeny Poberezkin 2024-09-04 22:42:44 +01:00
parent bb8bf0c8b2
commit 19110398f8
No known key found for this signature in database
GPG key ID: 494BDDD9A28B577D
2 changed files with 50 additions and 50 deletions

View file

@ -31,7 +31,7 @@ struct ChatListView: View {
@State private var searchChatFilteredBySimplexLink: String? = nil @State private var searchChatFilteredBySimplexLink: String? = nil
@State private var scrollToSearchBar = false @State private var scrollToSearchBar = false
@State private var activeUserPickerSheet: UserPickerSheet? = nil @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(DEFAULT_SHOW_UNREAD_AND_FAVORITES) private var showUnreadAndFavorites = false
@AppStorage(GROUP_DEFAULT_ONE_HAND_UI, store: groupDefaults) private var oneHandUI = true @AppStorage(GROUP_DEFAULT_ONE_HAND_UI, store: groupDefaults) private var oneHandUI = true
@ -58,43 +58,46 @@ struct ChatListView: View {
destination: chatView destination: chatView
) { chatListView } ) { chatListView }
} }
.sheet(isPresented: $isUserPickerPresented) { .sheet(isPresented: $userPickerShown) {
UserPicker(activeSheet: $activeUserPickerSheet) UserPicker {
.sheet(item: $activeUserPickerSheet) { sheet in userPickerShown = false
if let currentUser = chatModel.currentUser { activeUserPickerSheet = $0
switch sheet { }
case .address: }
NavigationView { .sheet(item: $activeUserPickerSheet) { sheet in
UserAddressView(shareViaProfile: currentUser.addressShared) if let currentUser = chatModel.currentUser {
.navigationTitle("Public address") switch sheet {
.navigationBarTitleDisplayMode(.large) case .address:
.modifier(ThemedBackground(grouped: true)) NavigationView {
} UserAddressView(shareViaProfile: currentUser.addressShared)
case .chatProfiles: .navigationTitle("Public address")
NavigationView { .navigationBarTitleDisplayMode(.large)
UserProfilesView() .modifier(ThemedBackground(grouped: true))
}
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)
}
} }
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 { .onTapGesture {
isUserPickerPresented = true userPickerShown = true
} }
} }

View file

@ -12,8 +12,7 @@ struct UserPicker: View {
@Environment(\.dynamicTypeSize) private var userFont: DynamicTypeSize @Environment(\.dynamicTypeSize) private var userFont: DynamicTypeSize
@Environment(\.scenePhase) private var scenePhase: ScenePhase @Environment(\.scenePhase) private var scenePhase: ScenePhase
@Environment(\.colorScheme) private var colorScheme: ColorScheme @Environment(\.colorScheme) private var colorScheme: ColorScheme
@Environment(\.dismiss) private var dismiss: DismissAction let setActiveSheet: (UserPickerSheet?) -> Void
@Binding var activeSheet: UserPickerSheet?
@State private var switchingProfile = false @State private var switchingProfile = false
var body: some View { 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") { openSheetOnTap(title: m.userAddress == nil ? "Create public address" : "Your public address", icon: "qrcode") {
activeSheet = .address setActiveSheet(.address)
} }
openSheetOnTap(title: "Chat preferences", icon: "switch.2") { openSheetOnTap(title: "Chat preferences", icon: "switch.2") {
activeSheet = .chatPreferences setActiveSheet(.chatPreferences)
} }
} }
} }
@ -62,7 +61,7 @@ struct UserPicker: View {
Section { Section {
if otherUsers.isEmpty { if otherUsers.isEmpty {
openSheetOnTap(title: "Your chat profiles", icon: "person.crop.rectangle.stack") { openSheetOnTap(title: "Your chat profiles", icon: "person.crop.rectangle.stack") {
activeSheet = .chatProfiles setActiveSheet(.chatProfiles)
} }
} else { } else {
let v = userPickerRow(otherUsers, size: 44) let v = userPickerRow(otherUsers, size: 44)
@ -75,12 +74,12 @@ struct UserPicker: View {
} }
openSheetOnTap(title: "Use from desktop", icon: "desktopcomputer") { openSheetOnTap(title: "Use from desktop", icon: "desktopcomputer") {
activeSheet = .useFromDesktop setActiveSheet(.useFromDesktop)
} }
HStack { HStack {
openSheetOnTap(title: "Settings", icon: "gearshape") { openSheetOnTap(title: "Settings", icon: "gearshape") {
activeSheet = .settings setActiveSheet(.settings)
} }
Label {} icon: { Label {} icon: {
Image(systemName: colorScheme == .light ? "sun.max" : "moon.fill") Image(systemName: colorScheme == .light ? "sun.max" : "moon.fill")
@ -181,7 +180,7 @@ struct UserPicker: View {
.foregroundColor(theme.colors.secondary) .foregroundColor(theme.colors.secondary)
.padding(.trailing, 4) .padding(.trailing, 4)
.onTapGesture { .onTapGesture {
activeSheet = .chatProfiles setActiveSheet(.chatProfiles)
} }
} }
} }
@ -202,7 +201,7 @@ struct UserPicker: View {
try await changeActiveUserAsync_(u.user.userId, viewPwd: nil) try await changeActiveUserAsync_(u.user.userId, viewPwd: nil)
await MainActor.run { await MainActor.run {
switchingProfile = false switchingProfile = false
dismiss() setActiveSheet(nil)
} }
} catch { } catch {
await MainActor.run { await MainActor.run {
@ -250,12 +249,10 @@ struct UserPicker: View {
struct UserPicker_Previews: PreviewProvider { struct UserPicker_Previews: PreviewProvider {
static var previews: some View { static var previews: some View {
@State var activeSheet: UserPickerSheet?
let m = ChatModel() let m = ChatModel()
m.users = [UserInfo.sampleData, UserInfo.sampleData] m.users = [UserInfo.sampleData, UserInfo.sampleData]
return UserPicker( return UserPicker(
activeSheet: $activeSheet setActiveSheet: { _ in }
) )
.environmentObject(m) .environmentObject(m)
} }