2022-11-16 20:26:43 +04:00
|
|
|
//
|
|
|
|
// GroupPreferencesView.swift
|
|
|
|
// SimpleX (iOS)
|
|
|
|
//
|
|
|
|
// Created by JRoberts on 16.11.2022.
|
|
|
|
// Copyright © 2022 SimpleX Chat. All rights reserved.
|
|
|
|
//
|
|
|
|
|
|
|
|
import SwiftUI
|
|
|
|
import SimpleXChat
|
|
|
|
|
2024-04-12 11:29:58 +01:00
|
|
|
private let featureRoles: [(role: GroupMemberRole?, text: LocalizedStringKey)] = [
|
|
|
|
(nil, "all members"),
|
|
|
|
(.admin, "admins"),
|
|
|
|
(.owner, "owners")
|
|
|
|
]
|
|
|
|
|
2022-11-16 20:26:43 +04:00
|
|
|
struct GroupPreferencesView: View {
|
2022-12-04 11:30:51 +00:00
|
|
|
@Environment(\.dismiss) var dismiss: DismissAction
|
2022-11-16 20:26:43 +04:00
|
|
|
@EnvironmentObject var chatModel: ChatModel
|
2024-07-03 22:42:13 +01:00
|
|
|
@EnvironmentObject var theme: AppTheme
|
2022-11-16 20:26:43 +04:00
|
|
|
@Binding var groupInfo: GroupInfo
|
2024-12-06 10:21:58 +00:00
|
|
|
@Binding var preferences: FullGroupPreferences
|
2024-12-06 15:55:15 +00:00
|
|
|
var currentPreferences: FullGroupPreferences
|
2022-12-04 11:30:51 +00:00
|
|
|
let creatingGroup: Bool
|
2024-12-06 15:55:15 +00:00
|
|
|
let savePreferences: () -> Void
|
2022-12-04 11:30:51 +00:00
|
|
|
@State private var showSaveDialogue = false
|
2022-11-16 20:26:43 +04:00
|
|
|
|
|
|
|
var body: some View {
|
2022-12-04 11:30:51 +00:00
|
|
|
let saveText: LocalizedStringKey = creatingGroup ? "Save" : "Save and notify group members"
|
2022-11-16 20:26:43 +04:00
|
|
|
VStack {
|
|
|
|
List {
|
2022-12-21 12:59:45 +00:00
|
|
|
featureSection(.timedMessages, $preferences.timedMessages.enable)
|
2022-12-03 15:40:31 +04:00
|
|
|
featureSection(.fullDelete, $preferences.fullDelete.enable)
|
2024-04-12 11:29:58 +01:00
|
|
|
featureSection(.directMessages, $preferences.directMessages.enable, $preferences.directMessages.role)
|
2023-06-19 22:47:49 +01:00
|
|
|
featureSection(.reactions, $preferences.reactions.enable)
|
2024-04-12 11:29:58 +01:00
|
|
|
featureSection(.voice, $preferences.voice.enable, $preferences.voice.role)
|
|
|
|
featureSection(.files, $preferences.files.enable, $preferences.files.role)
|
2024-05-25 19:54:05 +01:00
|
|
|
featureSection(.simplexLinks, $preferences.simplexLinks.enable, $preferences.simplexLinks.role)
|
2025-02-10 09:06:16 +00:00
|
|
|
featureSection(.reports, $preferences.reports.enable)
|
2023-12-29 21:46:28 +04:00
|
|
|
featureSection(.history, $preferences.history.enable)
|
2022-11-16 20:26:43 +04:00
|
|
|
|
2024-12-02 21:40:22 +04:00
|
|
|
if groupInfo.isOwner {
|
2022-11-16 20:26:43 +04:00
|
|
|
Section {
|
2022-11-17 12:59:13 +04:00
|
|
|
Button("Reset") { preferences = currentPreferences }
|
2024-12-06 15:55:15 +00:00
|
|
|
Button(saveText) { savePreferences() }
|
2022-11-16 20:26:43 +04:00
|
|
|
}
|
|
|
|
.disabled(currentPreferences == preferences)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-12-21 12:59:45 +00:00
|
|
|
.onChange(of: preferences.timedMessages.enable) { enable in
|
|
|
|
if enable == .on {
|
|
|
|
if preferences.timedMessages.ttl == nil {
|
|
|
|
preferences.timedMessages.ttl = 86400
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
preferences.timedMessages.ttl = currentPreferences.timedMessages.ttl
|
|
|
|
}
|
|
|
|
}
|
2024-03-11 21:17:28 +07:00
|
|
|
.modifier(BackButton(disabled: Binding.constant(false)) {
|
2022-12-04 11:30:51 +00:00
|
|
|
if currentPreferences == preferences {
|
|
|
|
dismiss()
|
|
|
|
} else {
|
|
|
|
showSaveDialogue = true
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.confirmationDialog("Save preferences?", isPresented: $showSaveDialogue) {
|
|
|
|
Button(saveText) {
|
2024-12-06 15:55:15 +00:00
|
|
|
savePreferences()
|
2024-12-06 10:21:58 +00:00
|
|
|
dismiss()
|
|
|
|
}
|
|
|
|
Button("Exit without saving") {
|
|
|
|
preferences = currentPreferences
|
2022-12-04 11:30:51 +00:00
|
|
|
dismiss()
|
|
|
|
}
|
|
|
|
}
|
2022-11-16 20:26:43 +04:00
|
|
|
}
|
|
|
|
|
2024-04-12 11:29:58 +01:00
|
|
|
private func featureSection(_ feature: GroupFeature, _ enableFeature: Binding<GroupFeatureEnabled>, _ enableForRole: Binding<GroupMemberRole?>? = nil) -> some View {
|
2022-11-16 20:26:43 +04:00
|
|
|
Section {
|
2024-07-03 22:42:13 +01:00
|
|
|
let color: Color = enableFeature.wrappedValue == .on ? .green : theme.colors.secondary
|
2022-12-04 11:30:51 +00:00
|
|
|
let icon = enableFeature.wrappedValue == .on ? feature.iconFilled : feature.icon
|
2022-12-21 12:59:45 +00:00
|
|
|
let timedOn = feature == .timedMessages && enableFeature.wrappedValue == .on
|
2024-12-02 21:40:22 +04:00
|
|
|
if groupInfo.isOwner {
|
2022-12-21 12:59:45 +00:00
|
|
|
let enable = Binding(
|
|
|
|
get: { enableFeature.wrappedValue == .on },
|
|
|
|
set: { on, _ in enableFeature.wrappedValue = on ? .on : .off }
|
|
|
|
)
|
2022-12-04 11:30:51 +00:00
|
|
|
settingsRow(icon, color: color) {
|
2022-12-21 12:59:45 +00:00
|
|
|
Toggle(feature.text, isOn: enable)
|
2022-11-16 20:26:43 +04:00
|
|
|
}
|
2025-02-10 09:06:16 +00:00
|
|
|
.disabled(feature == .reports) // remove in 6.4
|
2022-12-21 12:59:45 +00:00
|
|
|
if timedOn {
|
2023-05-15 16:07:55 +04:00
|
|
|
DropdownCustomTimePicker(
|
|
|
|
selection: $preferences.timedMessages.ttl,
|
|
|
|
label: "Delete after",
|
2023-06-20 10:13:16 +04:00
|
|
|
dropdownValues: TimedMessagesPreference.ttlValues,
|
2023-05-15 16:07:55 +04:00
|
|
|
customPickerConfirmButtonText: "Select",
|
|
|
|
customPickerDescription: "Delete after"
|
|
|
|
)
|
|
|
|
.frame(height: 36)
|
2022-12-21 12:59:45 +00:00
|
|
|
}
|
2024-04-12 11:29:58 +01:00
|
|
|
if enableFeature.wrappedValue == .on, let enableForRole {
|
|
|
|
Picker("Enabled for", selection: enableForRole) {
|
|
|
|
ForEach(featureRoles, id: \.role) { fr in
|
|
|
|
Text(fr.text)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
.frame(height: 36)
|
|
|
|
}
|
2022-12-21 12:59:45 +00:00
|
|
|
} else {
|
2022-12-04 11:30:51 +00:00
|
|
|
settingsRow(icon, color: color) {
|
2022-12-23 19:55:45 +00:00
|
|
|
infoRow(Text(feature.text), enableFeature.wrappedValue.text)
|
2022-11-16 20:26:43 +04:00
|
|
|
}
|
2022-12-21 12:59:45 +00:00
|
|
|
if timedOn {
|
2023-05-15 16:07:55 +04:00
|
|
|
infoRow("Delete after", timeText(preferences.timedMessages.ttl))
|
2022-12-21 12:59:45 +00:00
|
|
|
}
|
2024-04-12 11:29:58 +01:00
|
|
|
if enableFeature.wrappedValue == .on, let enableForRole {
|
|
|
|
HStack {
|
2024-07-03 22:42:13 +01:00
|
|
|
Text("Enabled for").foregroundColor(theme.colors.secondary)
|
2024-04-12 11:29:58 +01:00
|
|
|
Spacer()
|
|
|
|
Text(
|
|
|
|
featureRoles.first(where: { fr in fr.role == enableForRole.wrappedValue })?.text
|
|
|
|
?? "all members"
|
|
|
|
)
|
2024-07-03 22:42:13 +01:00
|
|
|
.foregroundColor(theme.colors.secondary)
|
2024-04-12 11:29:58 +01:00
|
|
|
}
|
|
|
|
}
|
2022-11-16 20:26:43 +04:00
|
|
|
}
|
|
|
|
} footer: {
|
2024-12-02 21:40:22 +04:00
|
|
|
Text(feature.enableDescription(enableFeature.wrappedValue, groupInfo.isOwner))
|
2024-07-03 22:42:13 +01:00
|
|
|
.foregroundColor(theme.colors.secondary)
|
2022-11-16 20:26:43 +04:00
|
|
|
}
|
2024-04-12 11:29:58 +01:00
|
|
|
.onChange(of: enableFeature.wrappedValue) { enabled in
|
|
|
|
if case .off = enabled {
|
|
|
|
enableForRole?.wrappedValue = nil
|
|
|
|
}
|
|
|
|
}
|
2022-11-16 20:26:43 +04:00
|
|
|
}
|
2024-12-06 10:21:58 +00:00
|
|
|
}
|
2022-11-16 20:26:43 +04:00
|
|
|
|
|
|
|
struct GroupPreferencesView_Previews: PreviewProvider {
|
|
|
|
static var previews: some View {
|
|
|
|
GroupPreferencesView(
|
|
|
|
groupInfo: Binding.constant(GroupInfo.sampleData),
|
2024-12-06 10:21:58 +00:00
|
|
|
preferences: Binding.constant(FullGroupPreferences.sampleData),
|
2024-12-06 15:55:15 +00:00
|
|
|
currentPreferences: FullGroupPreferences.sampleData,
|
|
|
|
creatingGroup: false,
|
|
|
|
savePreferences: {}
|
2022-11-16 20:26:43 +04:00
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|