From 494328541a0e1b122309bdd57acf03f00243b308 Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com> Date: Wed, 24 May 2023 15:29:27 +0200 Subject: [PATCH] ios: fix picker resetting value in iOS 15 (fixes disappearing messages and changing member role) (#2503) * ios: fix picker resetting value in iOS 15 * group link view layout --- .../Views/Chat/Group/GroupLinkView.swift | 46 +++++++------------ .../Chat/Group/GroupMemberInfoView.swift | 6 +++ .../Views/Helpers/CustomTimePicker.swift | 6 +++ 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/apps/ios/Shared/Views/Chat/Group/GroupLinkView.swift b/apps/ios/Shared/Views/Chat/Group/GroupLinkView.swift index 7a1f64828f..3731e0c4d7 100644 --- a/apps/ios/Shared/Views/Chat/Group/GroupLinkView.swift +++ b/apps/ios/Shared/Views/Chat/Group/GroupLinkView.swift @@ -29,43 +29,33 @@ struct GroupLinkView: View { } var body: some View { - ScrollView { - VStack (alignment: .leading) { - Text("You can share a link or a QR code - anybody will be able to join the group. You won't lose members of the group if you later delete it.") - .padding(.bottom) + List { + Text("You can share a link or a QR code - anybody will be able to join the group. You won't lose members of the group if you later delete it.") + .listRowBackground(Color.clear) + .listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0)) + Section { if let groupLink = groupLink { - HStack { - Text("Initial role") - Picker("Initial role", selection: $groupLinkMemberRole) { - ForEach([GroupMemberRole.member, GroupMemberRole.observer]) { role in - Text(role.text) - } + Picker("Initial role", selection: $groupLinkMemberRole) { + ForEach([GroupMemberRole.member, GroupMemberRole.observer]) { role in + Text(role.text) } - .frame(height: 36) } - .frame(maxWidth: .infinity, alignment: .leading) + .frame(height: 36) QRCode(uri: groupLink) - HStack { - Button { - showShareSheet(items: [groupLink]) - } label: { - Label("Share link", systemImage: "square.and.arrow.up") - } - .padding() - - Button(role: .destructive) { alert = .deleteLink } label: { - Label("Delete link", systemImage: "trash") - } - .padding() + Button { + showShareSheet(items: [groupLink]) + } label: { + Label("Share link", systemImage: "square.and.arrow.up") + } + + Button(role: .destructive) { alert = .deleteLink } label: { + Label("Delete link", systemImage: "trash") } - .frame(maxWidth: .infinity) } else { Button(action: createGroupLink) { Label("Create link", systemImage: "link.badge.plus") } - .frame(maxWidth: .infinity) .disabled(creatingLink) - .padding(.bottom) if creatingLink { ProgressView() .scaleEffect(2) @@ -73,8 +63,6 @@ struct GroupLinkView: View { } } } - .padding() - .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) .alert(item: $alert) { alert in switch alert { case .deleteLink: diff --git a/apps/ios/Shared/Views/Chat/Group/GroupMemberInfoView.swift b/apps/ios/Shared/Views/Chat/Group/GroupMemberInfoView.swift index 6decf50b35..1f55f56071 100644 --- a/apps/ios/Shared/Views/Chat/Group/GroupMemberInfoView.swift +++ b/apps/ios/Shared/Views/Chat/Group/GroupMemberInfoView.swift @@ -20,6 +20,7 @@ struct GroupMemberInfoView: View { @State private var newRole: GroupMemberRole = .member @State private var alert: GroupMemberInfoViewAlert? @AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false + @State private var justOpened = true enum GroupMemberInfoViewAlert: Identifiable { case removeMemberAlert(mem: GroupMember) @@ -146,6 +147,10 @@ struct GroupMemberInfoView: View { } .navigationBarHidden(true) .onAppear { + if #unavailable(iOS 16) { + // this condition prevents re-setting picker + if !justOpened { return } + } newRole = member.memberRole do { let stats = try apiGroupMemberInfo(groupInfo.apiId, member.groupMemberId) @@ -156,6 +161,7 @@ struct GroupMemberInfoView: View { } catch let error { logger.error("apiGroupMemberInfo or apiGetGroupMemberCode error: \(responseError(error))") } + justOpened = false } .onChange(of: newRole) { _ in if newRole != member.memberRole { diff --git a/apps/ios/Shared/Views/Helpers/CustomTimePicker.swift b/apps/ios/Shared/Views/Helpers/CustomTimePicker.swift index 3044c4d436..03bb9f10cb 100644 --- a/apps/ios/Shared/Views/Helpers/CustomTimePicker.swift +++ b/apps/ios/Shared/Views/Helpers/CustomTimePicker.swift @@ -147,6 +147,7 @@ struct DropdownCustomTimePicker: View { @State private var dropdownSelection: DropdownSelection = .dropdownValue(value: nil) @State private var showCustomTimePicker = false @State private var selectedCustomTime: Int? = nil + @State private var justOpened = true enum DropdownSelection: Hashable { case dropdownValue(value: Int?) @@ -167,7 +168,12 @@ struct DropdownCustomTimePicker: View { } } .onAppear { + if #unavailable(iOS 16) { + // this condition prevents re-setting picker + if !justOpened { return } + } dropdownSelection = .dropdownValue(value: selection) + justOpened = false } .onChange(of: selection) { v in logger.debug("*** .onChange(of: selection)")