ios: ask for confirmation of save on group preferences sheet dismiss (#5327)

* ios: ask for confirmation of save on group preferences sheet dismiss

* fix exit without saving temporary state and also apply fix on dismiss during group creation
This commit is contained in:
Diogo
2024-12-06 10:21:58 +00:00
committed by GitHub
parent 9b82cc3303
commit 924273191e
5 changed files with 54 additions and 28 deletions
+2 -1
View File
@@ -246,7 +246,8 @@ struct ChatView: View {
chat.created = Date.now
}
),
onSearch: { focusSearch() }
onSearch: { focusSearch() },
preferences: groupInfo.fullGroupPreferences
)
}
} else if case .local = cInfo {
@@ -15,7 +15,7 @@ struct AddGroupMembersView: View {
var groupInfo: GroupInfo
var body: some View {
AddGroupMembersViewCommon(chat: chat, groupInfo: groupInfo, addedMembersCb: { _ in dismiss() })
AddGroupMembersViewCommon(chat: chat, groupInfo: groupInfo, preferences: groupInfo.fullGroupPreferences, addedMembersCb: { _ in dismiss() })
}
}
@@ -24,6 +24,7 @@ struct AddGroupMembersViewCommon: View {
@EnvironmentObject var theme: AppTheme
var chat: Chat
@State var groupInfo: GroupInfo
@State var preferences: FullGroupPreferences
var creatingGroup: Bool = false
var showFooterCounter: Bool = true
var addedMembersCb: ((Set<Int64>) -> Void)
@@ -78,7 +79,7 @@ struct AddGroupMembersViewCommon: View {
let count = selectedContacts.count
Section {
if creatingGroup {
groupPreferencesButton($groupInfo, true)
groupPreferencesButton($groupInfo, $preferences, true)
}
rolePicker()
inviteMembersButton()
@@ -19,6 +19,7 @@ struct GroupChatInfoView: View {
@Binding var groupInfo: GroupInfo
var onSearch: () -> Void
@State private var alert: GroupChatInfoViewAlert? = nil
@State var preferences: FullGroupPreferences
@State private var groupLink: String?
@State private var groupLinkMemberRole: GroupMemberRole = .member
@State private var groupLinkNavLinkActive: Bool = false
@@ -87,7 +88,7 @@ struct GroupChatInfoView: View {
if groupInfo.groupProfile.description != nil || (groupInfo.isOwner && groupInfo.businessChat == nil) {
addOrEditWelcomeMessage()
}
groupPreferencesButton($groupInfo)
groupPreferencesButton($groupInfo, $preferences)
if members.filter({ $0.wrapped.memberCurrent }).count <= SMALL_GROUPS_RCPS_MEM_LIMIT {
sendReceiptsOption()
} else {
@@ -654,18 +655,32 @@ func deleteGroupAlertMessage(_ groupInfo: GroupInfo) -> Text {
)
}
func groupPreferencesButton(_ groupInfo: Binding<GroupInfo>, _ creatingGroup: Bool = false) -> some View {
func groupPreferencesButton(_ groupInfo: Binding<GroupInfo>, _ preferences: Binding<FullGroupPreferences>, _ creatingGroup: Bool = false) -> some View {
let label: LocalizedStringKey = groupInfo.wrappedValue.businessChat == nil ? "Group preferences" : "Chat preferences"
return NavigationLink {
GroupPreferencesView(
groupInfo: groupInfo,
preferences: groupInfo.wrappedValue.fullGroupPreferences,
currentPreferences: groupInfo.wrappedValue.fullGroupPreferences,
preferences: preferences,
currentPreferences: groupInfo.fullGroupPreferences,
creatingGroup: creatingGroup
)
.navigationBarTitle(label)
.modifier(ThemedBackground(grouped: true))
.navigationBarTitleDisplayMode(.large)
.onDisappear {
let saveText = NSLocalizedString(creatingGroup ? "Save" : "Save and notify group members", comment: "alert button")
if groupInfo.fullGroupPreferences.wrappedValue != preferences.wrappedValue {
showAlert(
title: NSLocalizedString("Save preferences?", comment: "alert title"),
buttonTitle: saveText,
buttonAction: {
savePreferences(groupInfo: groupInfo, preferences: preferences, currentPreferences: groupInfo.fullGroupPreferences)
},
cancelButton: true
)
}
}
} label: {
if creatingGroup {
Text("Set group preferences")
@@ -694,7 +709,8 @@ struct GroupChatInfoView_Previews: PreviewProvider {
GroupChatInfoView(
chat: Chat(chatInfo: ChatInfo.sampleData.group, chatItems: []),
groupInfo: Binding.constant(GroupInfo.sampleData),
onSearch: {}
onSearch: {},
preferences: GroupInfo.sampleData.fullGroupPreferences
)
}
}
@@ -20,8 +20,8 @@ struct GroupPreferencesView: View {
@EnvironmentObject var chatModel: ChatModel
@EnvironmentObject var theme: AppTheme
@Binding var groupInfo: GroupInfo
@State var preferences: FullGroupPreferences
@State var currentPreferences: FullGroupPreferences
@Binding var preferences: FullGroupPreferences
@Binding var currentPreferences: FullGroupPreferences
let creatingGroup: Bool
@State private var showSaveDialogue = false
@@ -41,7 +41,7 @@ struct GroupPreferencesView: View {
if groupInfo.isOwner {
Section {
Button("Reset") { preferences = currentPreferences }
Button(saveText) { savePreferences() }
Button(saveText) { savePreferences(groupInfo: $groupInfo, preferences: $preferences, currentPreferences: $currentPreferences) }
}
.disabled(currentPreferences == preferences)
}
@@ -65,10 +65,13 @@ struct GroupPreferencesView: View {
})
.confirmationDialog("Save preferences?", isPresented: $showSaveDialogue) {
Button(saveText) {
savePreferences()
savePreferences(groupInfo: $groupInfo, preferences: $preferences, currentPreferences: $currentPreferences)
dismiss()
}
Button("Exit without saving") {
preferences = currentPreferences
dismiss()
}
Button("Exit without saving") { dismiss() }
}
}
@@ -132,21 +135,25 @@ struct GroupPreferencesView: View {
}
}
}
}
private func savePreferences() {
Task {
do {
var gp = groupInfo.groupProfile
gp.groupPreferences = toGroupPreferences(preferences)
let gInfo = try await apiUpdateGroup(groupInfo.groupId, gp)
await MainActor.run {
groupInfo = gInfo
chatModel.updateGroup(gInfo)
currentPreferences = preferences
}
} catch {
logger.error("GroupPreferencesView apiUpdateGroup error: \(responseError(error))")
func savePreferences(
groupInfo: Binding<GroupInfo>,
preferences: Binding<FullGroupPreferences>,
currentPreferences: Binding<FullGroupPreferences>
) {
Task {
do {
var gp = groupInfo.groupProfile.wrappedValue
gp.groupPreferences = toGroupPreferences(preferences.wrappedValue)
let gInfo = try await apiUpdateGroup(groupInfo.groupId.wrappedValue, gp)
await MainActor.run {
groupInfo.wrappedValue = gInfo
ChatModel.shared.updateGroup(gInfo)
currentPreferences.wrappedValue = preferences.wrappedValue
}
} catch {
logger.error("GroupPreferencesView apiUpdateGroup error: \(responseError(error))")
}
}
}
@@ -155,8 +162,8 @@ struct GroupPreferencesView_Previews: PreviewProvider {
static var previews: some View {
GroupPreferencesView(
groupInfo: Binding.constant(GroupInfo.sampleData),
preferences: FullGroupPreferences.sampleData,
currentPreferences: FullGroupPreferences.sampleData,
preferences: Binding.constant(FullGroupPreferences.sampleData),
currentPreferences: Binding.constant(FullGroupPreferences.sampleData),
creatingGroup: false
)
}
@@ -32,6 +32,7 @@ struct AddGroupView: View {
AddGroupMembersViewCommon(
chat: chat,
groupInfo: groupInfo,
preferences: groupInfo.fullGroupPreferences,
creatingGroup: true,
showFooterCounter: false
) { _ in