Compare commits
2 Commits
f6ca117b8e
...
0dd8241958
| Author | SHA1 | Date | |
|---|---|---|---|
| 0dd8241958 | |||
| e6a9948495 |
@ -134,17 +134,20 @@
|
|||||||
"localizations" : {
|
"localizations" : {
|
||||||
"en" : {
|
"en" : {
|
||||||
"stringUnit" : {
|
"stringUnit" : {
|
||||||
"state" : "translated",
|
"state" : "needs_review",
|
||||||
"value" : "Yobble"
|
"value" : "Yobble"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ru" : {
|
"ru" : {
|
||||||
"stringUnit" : {
|
"stringUnit" : {
|
||||||
"state" : "translated",
|
"state" : "translated",
|
||||||
"value" : "Йоббле"
|
"value" : "Йоббл"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"Автоудаление аккаунта" : {
|
||||||
|
|
||||||
},
|
},
|
||||||
"Активные сессии" : {
|
"Активные сессии" : {
|
||||||
"localizations" : {
|
"localizations" : {
|
||||||
@ -164,6 +167,15 @@
|
|||||||
},
|
},
|
||||||
"Ваше предложение" : {
|
"Ваше предложение" : {
|
||||||
|
|
||||||
|
},
|
||||||
|
"Видимость и контент" : {
|
||||||
|
|
||||||
|
},
|
||||||
|
"Видимость статуса 'был в сети'" : {
|
||||||
|
|
||||||
|
},
|
||||||
|
"Включить автоудаление аккаунта" : {
|
||||||
|
|
||||||
},
|
},
|
||||||
"Вложение" : {
|
"Вложение" : {
|
||||||
|
|
||||||
@ -344,17 +356,6 @@
|
|||||||
"Здесь появится информация о собеседнике и существующих чатах." : {
|
"Здесь появится информация о собеседнике и существующих чатах." : {
|
||||||
"comment" : "Search placeholder description"
|
"comment" : "Search placeholder description"
|
||||||
},
|
},
|
||||||
"Идеи" : {
|
|
||||||
"extractionState" : "stale",
|
|
||||||
"localizations" : {
|
|
||||||
"en" : {
|
|
||||||
"stringUnit" : {
|
|
||||||
"state" : "translated",
|
|
||||||
"value" : "Ideas"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Избранные сообщения" : {
|
"Избранные сообщения" : {
|
||||||
|
|
||||||
},
|
},
|
||||||
@ -415,6 +416,16 @@
|
|||||||
"Кликер в разработке" : {
|
"Кликер в разработке" : {
|
||||||
"comment" : "Concept tab placeholder title"
|
"comment" : "Concept tab placeholder title"
|
||||||
},
|
},
|
||||||
|
"Конфиденциальность" : {
|
||||||
|
"localizations" : {
|
||||||
|
"en" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "Privacy"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"Концепт" : {
|
"Концепт" : {
|
||||||
"comment" : "Tab bar: concept clicker"
|
"comment" : "Tab bar: concept clicker"
|
||||||
},
|
},
|
||||||
@ -439,6 +450,15 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"Кто может звонить" : {
|
||||||
|
|
||||||
|
},
|
||||||
|
"Кто может приглашать в беседы" : {
|
||||||
|
|
||||||
|
},
|
||||||
|
"Кто может приглашать в паблики" : {
|
||||||
|
|
||||||
},
|
},
|
||||||
"Лента" : {
|
"Лента" : {
|
||||||
"localizations" : {
|
"localizations" : {
|
||||||
@ -547,6 +567,9 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"Настройки приватности" : {
|
||||||
|
|
||||||
},
|
},
|
||||||
"Не удалось выполнить поиск." : {
|
"Не удалось выполнить поиск." : {
|
||||||
"comment" : "Search error fallback\nSearch service decoding error"
|
"comment" : "Search error fallback\nSearch service decoding error"
|
||||||
@ -995,6 +1018,15 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"Показывать био не-контактам" : {
|
||||||
|
|
||||||
|
},
|
||||||
|
"Показывать сторисы не-контактам" : {
|
||||||
|
|
||||||
|
},
|
||||||
|
"Показывать фото не-контактам" : {
|
||||||
|
|
||||||
},
|
},
|
||||||
"Пользователь Системы 1" : {
|
"Пользователь Системы 1" : {
|
||||||
"comment" : "Тестовая подмена офф аккаунта",
|
"comment" : "Тестовая подмена офф аккаунта",
|
||||||
@ -1051,6 +1083,9 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"Приглашения и звонки" : {
|
||||||
|
|
||||||
},
|
},
|
||||||
"Приложение" : {
|
"Приложение" : {
|
||||||
|
|
||||||
@ -1064,6 +1099,12 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"Принимать сообщения от незнакомцев" : {
|
||||||
|
|
||||||
|
},
|
||||||
|
"Принудительное автоудаление в ЛС (Приватный)" : {
|
||||||
|
|
||||||
},
|
},
|
||||||
"Проверьте данные и повторите попытку." : {
|
"Проверьте данные и повторите попытку." : {
|
||||||
"localizations" : {
|
"localizations" : {
|
||||||
@ -1088,11 +1129,33 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"Профиль" : {
|
||||||
|
"localizations" : {
|
||||||
|
"en" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "Profile"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"Профиль в разработке" : {
|
"Профиль в разработке" : {
|
||||||
"comment" : "Search placeholder title"
|
"comment" : "Search placeholder title"
|
||||||
|
},
|
||||||
|
"Профиль и поиск" : {
|
||||||
|
|
||||||
},
|
},
|
||||||
"Публичная информация" : {
|
"Публичная информация" : {
|
||||||
|
|
||||||
|
},
|
||||||
|
"Разрешить пересылку сообщений" : {
|
||||||
|
|
||||||
|
},
|
||||||
|
"Разрешить поиск профиля" : {
|
||||||
|
|
||||||
|
},
|
||||||
|
"Разрешить хранить чаты на сервере (Обычный)" : {
|
||||||
|
|
||||||
},
|
},
|
||||||
"Регистрация" : {
|
"Регистрация" : {
|
||||||
"comment" : "Регистрация",
|
"comment" : "Регистрация",
|
||||||
@ -1154,6 +1217,9 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"Сбросить по умолчанию" : {
|
||||||
|
|
||||||
},
|
},
|
||||||
"Светлая" : {
|
"Светлая" : {
|
||||||
"localizations" : {
|
"localizations" : {
|
||||||
@ -1257,6 +1323,9 @@
|
|||||||
},
|
},
|
||||||
"Сообщение" : {
|
"Сообщение" : {
|
||||||
|
|
||||||
|
},
|
||||||
|
"Сохранить изменения" : {
|
||||||
|
|
||||||
},
|
},
|
||||||
"Спасибо!" : {
|
"Спасибо!" : {
|
||||||
|
|
||||||
@ -1281,6 +1350,9 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"Таймер автоудаления: %@" : {
|
||||||
|
|
||||||
},
|
},
|
||||||
"Тёмная" : {
|
"Тёмная" : {
|
||||||
"localizations" : {
|
"localizations" : {
|
||||||
@ -1341,6 +1413,9 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"Удалять аккаунт через %lld дн." : {
|
||||||
|
|
||||||
},
|
},
|
||||||
"Ура!" : {
|
"Ура!" : {
|
||||||
"localizations" : {
|
"localizations" : {
|
||||||
@ -1393,6 +1468,9 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"Чаты и хранение" : {
|
||||||
|
|
||||||
},
|
},
|
||||||
"Черновики" : {
|
"Черновики" : {
|
||||||
"comment" : "Drafts",
|
"comment" : "Drafts",
|
||||||
|
|||||||
171
yobble/Views/Tab/Settings/EditPrivacyView.swift
Normal file
171
yobble/Views/Tab/Settings/EditPrivacyView.swift
Normal file
@ -0,0 +1,171 @@
|
|||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct EditPrivacyView: View {
|
||||||
|
@State private var profilePermissions = ProfilePermissionsResponse()
|
||||||
|
|
||||||
|
private var privacyScopeOptions: [PrivacyScope] { PrivacyScope.allCases }
|
||||||
|
|
||||||
|
private var forceAutoDeleteBinding: Binding<Int> {
|
||||||
|
Binding(
|
||||||
|
get: { profilePermissions.maxMessageAutoDeleteSeconds ?? 30 },
|
||||||
|
set: { profilePermissions.maxMessageAutoDeleteSeconds = $0 }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private var autoDeleteAccountEnabled: Binding<Bool> {
|
||||||
|
Binding(
|
||||||
|
get: { profilePermissions.autoDeleteAfterDays != nil },
|
||||||
|
set: { newValue in
|
||||||
|
profilePermissions.autoDeleteAfterDays = newValue ? (profilePermissions.autoDeleteAfterDays ?? 30) : nil
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private var autoDeleteAccountBinding: Binding<Int> {
|
||||||
|
Binding(
|
||||||
|
get: { profilePermissions.autoDeleteAfterDays ?? 30 },
|
||||||
|
set: { profilePermissions.autoDeleteAfterDays = min(max($0, 1), 365) }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
Form {
|
||||||
|
Section(header: Text("Профиль и поиск")) {
|
||||||
|
Toggle("Разрешить поиск профиля", isOn: $profilePermissions.isSearchable)
|
||||||
|
Toggle("Разрешить пересылку сообщений", isOn: $profilePermissions.allowMessageForwarding)
|
||||||
|
Toggle("Принимать сообщения от незнакомцев", isOn: $profilePermissions.allowMessagesFromNonContacts)
|
||||||
|
}
|
||||||
|
|
||||||
|
Section(header: Text("Видимость и контент")) {
|
||||||
|
Toggle("Показывать фото не-контактам", isOn: $profilePermissions.showProfilePhotoToNonContacts)
|
||||||
|
Toggle("Показывать био не-контактам", isOn: $profilePermissions.showBioToNonContacts)
|
||||||
|
Toggle("Показывать сторисы не-контактам", isOn: $profilePermissions.showStoriesToNonContacts)
|
||||||
|
|
||||||
|
Picker("Видимость статуса 'был в сети'", selection: $profilePermissions.lastSeenVisibility) {
|
||||||
|
ForEach(privacyScopeOptions) { scope in
|
||||||
|
Text(scope.title).tag(scope.rawValue)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.pickerStyle(.segmented)
|
||||||
|
}
|
||||||
|
|
||||||
|
Section(header: Text("Приглашения и звонки")) {
|
||||||
|
Picker("Кто может приглашать в паблики", selection: $profilePermissions.publicInvitePermission) {
|
||||||
|
ForEach(privacyScopeOptions) { scope in
|
||||||
|
Text(scope.title).tag(scope.rawValue)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.pickerStyle(.segmented)
|
||||||
|
|
||||||
|
Picker("Кто может приглашать в беседы", selection: $profilePermissions.groupInvitePermission) {
|
||||||
|
ForEach(privacyScopeOptions) { scope in
|
||||||
|
Text(scope.title).tag(scope.rawValue)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.pickerStyle(.segmented)
|
||||||
|
|
||||||
|
Picker("Кто может звонить", selection: $profilePermissions.callPermission) {
|
||||||
|
ForEach(privacyScopeOptions) { scope in
|
||||||
|
Text(scope.title).tag(scope.rawValue)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.pickerStyle(.segmented)
|
||||||
|
}
|
||||||
|
|
||||||
|
Section(header: Text("Чаты и хранение")) {
|
||||||
|
Toggle("Разрешить хранить чаты на сервере (Обычный)", isOn: $profilePermissions.allowServerChats)
|
||||||
|
Toggle("Принудительное автоудаление в ЛС (Приватный)", isOn: $profilePermissions.forceAutoDeleteMessagesInPrivate)
|
||||||
|
|
||||||
|
if profilePermissions.forceAutoDeleteMessagesInPrivate {
|
||||||
|
Stepper(value: forceAutoDeleteBinding, in: 5...86400, step: 5) {
|
||||||
|
Text("Таймер автоудаления: \(formattedAutoDeleteSeconds(forceAutoDeleteBinding.wrappedValue))")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Section(header: Text("Автоудаление аккаунта")) {
|
||||||
|
Toggle("Включить автоудаление аккаунта", isOn: autoDeleteAccountEnabled)
|
||||||
|
|
||||||
|
if autoDeleteAccountEnabled.wrappedValue {
|
||||||
|
Stepper(value: autoDeleteAccountBinding, in: 1...365) {
|
||||||
|
Text("Удалять аккаунт через \(autoDeleteAccountBinding.wrappedValue) дн.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Section {
|
||||||
|
Button("Сохранить изменения") {
|
||||||
|
print("Параметры приватности: \(profilePermissions)")
|
||||||
|
}
|
||||||
|
.frame(maxWidth: .infinity, alignment: .center)
|
||||||
|
}
|
||||||
|
|
||||||
|
Section {
|
||||||
|
Button(role: .destructive) {
|
||||||
|
profilePermissions = ProfilePermissionsResponse()
|
||||||
|
print("Настройки приватности сброшены к значениям по умолчанию")
|
||||||
|
} label: {
|
||||||
|
Text("Сбросить по умолчанию")
|
||||||
|
.frame(maxWidth: .infinity, alignment: .center)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.navigationTitle("Настройки приватности")
|
||||||
|
.onChange(of: profilePermissions.forceAutoDeleteMessagesInPrivate) { newValue in
|
||||||
|
if newValue {
|
||||||
|
profilePermissions.maxMessageAutoDeleteSeconds = profilePermissions.maxMessageAutoDeleteSeconds ?? 30
|
||||||
|
} else {
|
||||||
|
profilePermissions.maxMessageAutoDeleteSeconds = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func formattedAutoDeleteSeconds(_ value: Int) -> String {
|
||||||
|
switch value {
|
||||||
|
case ..<60:
|
||||||
|
return "\(value) сек."
|
||||||
|
case 60..<3600:
|
||||||
|
let minutes = value / 60
|
||||||
|
return "\(minutes) мин."
|
||||||
|
default:
|
||||||
|
let hours = Double(value) / 3600.0
|
||||||
|
return String(format: "%.1f ч.", hours)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private enum PrivacyScope: Int, CaseIterable, Identifiable {
|
||||||
|
case everyone = 0
|
||||||
|
case contacts = 1
|
||||||
|
case nobody = 2
|
||||||
|
|
||||||
|
var id: Int { rawValue }
|
||||||
|
|
||||||
|
var title: String {
|
||||||
|
switch self {
|
||||||
|
case .everyone:
|
||||||
|
return "Все"
|
||||||
|
case .contacts:
|
||||||
|
return "Контакты"
|
||||||
|
case .nobody:
|
||||||
|
return "Никто"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ProfilePermissionsResponse: Codable {
|
||||||
|
var isSearchable: Bool = true
|
||||||
|
var allowMessageForwarding: Bool = true
|
||||||
|
var allowMessagesFromNonContacts: Bool = true
|
||||||
|
var showProfilePhotoToNonContacts: Bool = true
|
||||||
|
var lastSeenVisibility: Int = PrivacyScope.everyone.rawValue
|
||||||
|
var showBioToNonContacts: Bool = true
|
||||||
|
var showStoriesToNonContacts: Bool = true
|
||||||
|
var allowServerChats: Bool = true
|
||||||
|
var publicInvitePermission: Int = PrivacyScope.everyone.rawValue
|
||||||
|
var groupInvitePermission: Int = PrivacyScope.everyone.rawValue
|
||||||
|
var callPermission: Int = PrivacyScope.everyone.rawValue
|
||||||
|
var forceAutoDeleteMessagesInPrivate: Bool = false
|
||||||
|
var maxMessageAutoDeleteSeconds: Int? = nil
|
||||||
|
var autoDeleteAfterDays: Int? = nil
|
||||||
|
}
|
||||||
@ -13,12 +13,16 @@ struct SettingsView: View {
|
|||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
Form {
|
Form {
|
||||||
// // MARK: - Профиль
|
// MARK: - Профиль
|
||||||
// Section(header: Text("Профиль")) {
|
Section(header: Text(NSLocalizedString("Профиль", comment: ""))) {
|
||||||
// NavigationLink(destination: EditProfileView()) {
|
// NavigationLink(destination: EditProfileView()) {
|
||||||
// Label("Мой профиль", systemImage: "person.crop.circle")
|
// Label("Мой профиль", systemImage: "person.crop.circle")
|
||||||
// }
|
// }
|
||||||
// }
|
|
||||||
|
NavigationLink(destination: EditPrivacyView()) {
|
||||||
|
Label(NSLocalizedString("Конфиденциальность", comment: ""), systemImage: "lock.fill")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: - Безопасность
|
// MARK: - Безопасность
|
||||||
Section(header: Text(NSLocalizedString("Безопасность", comment: ""))) {
|
Section(header: Text(NSLocalizedString("Безопасность", comment: ""))) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user