add secureview

This commit is contained in:
cheykrym 2025-10-24 11:13:47 +03:00
parent 6eed966fc9
commit e3cf374893
4 changed files with 156 additions and 8 deletions

View File

@ -89,6 +89,12 @@
}
}
},
"Email" : {
"comment" : "Заголовок экрана настроек email\nРаздел настроек безопасности для email"
},
"Email не подтверждён. Подтвердите, чтобы активировать дополнительные проверки." : {
"comment" : "Описание необходимости подтверждения email"
},
"Fun Fest" : {
"comment" : "Fun Fest",
"localizations" : {
@ -220,10 +226,14 @@
"Аудио" : {
"comment" : "Audio message placeholder"
},
"Аутентификация" : {
"comment" : "Раздел настроек безопасности для аутентификации"
},
"Без звука (скоро)" : {
},
"Безопасность" : {
"comment" : "Заголовок экрана настроек безопасности",
"localizations" : {
"en" : {
"stringUnit" : {
@ -427,7 +437,7 @@
}
},
"Двухфакторная аутентификация" : {
"comment" : "Заголовок экрана 2FA",
"comment" : "Заголовок экрана 2FA\nПереход к настройкам двухфакторной аутентификации",
"localizations" : {
"en" : {
"stringUnit" : {
@ -598,6 +608,9 @@
}
}
},
"Защита входа" : {
"comment" : "Раздел защиты входа через email"
},
"Здесь не будут чаты" : {
"localizations" : {
"en" : {
@ -907,6 +920,12 @@
}
}
},
"Мы отправим код подтверждения на привязанный email каждый раз при входе." : {
"comment" : "Описание работы кодов при входе"
},
"Мы отправим письмо, как только функция будет готова." : {
"comment" : "Сообщение при недоступной отправке письма"
},
"Мы постараемся всё исправить. Напишите, что смутило." : {
"comment" : "feedback: rating description 2",
"localizations" : {
@ -1012,6 +1031,9 @@
}
}
},
"Настройки email" : {
"comment" : "Переход к настройкам безопасности email"
},
"Настройки приватности" : {
"localizations" : {
"en" : {
@ -1436,6 +1458,9 @@
}
}
},
"Отправить письмо подтверждения" : {
"comment" : "Кнопка отправки письма подтверждения"
},
"Отправляем..." : {
"comment" : "feedback: sending state",
"localizations" : {
@ -1686,6 +1711,9 @@
"Подтвердить" : {
"comment" : "Кнопка подтверждения кода 2FA"
},
"Подтверждение email" : {
"comment" : "Раздел подтверждения email"
},
"Подтверждение пароля" : {
"comment" : "Подтверждение пароля",
"localizations" : {
@ -1757,6 +1785,9 @@
}
}
},
"Получать коды на email при входе" : {
"comment" : "Переключатель отправки кодов при входе"
},
"Получить ответ от команды" : {
"comment" : "feedback: contact toggle",
"localizations" : {
@ -2217,7 +2248,7 @@
"comment" : "Кнопка копирования кода восстановления"
},
"Скоро" : {
"comment" : "Add blocked user placeholder title\nContacts placeholder title"
"comment" : "Add blocked user placeholder title\nContacts placeholder title\nЗаголовок заглушки"
},
"Скоро появится мини-игра, где можно заработать очки для кастомизации профиля. Следите за обновлениями!" : {
"comment" : "Concept tab placeholder description"
@ -2445,6 +2476,9 @@
}
}
},
"Функция пока недоступна." : {
"comment" : "Сообщение заглушки"
},
"Центр авторов" : {
"comment" : "Creator Center",
"localizations" : {

View File

@ -0,0 +1,65 @@
import SwiftUI
struct EmailSecuritySettingsView: View {
@State private var isLoginCodesEnabled = false
@State private var activeAlert: EmailSecurityAlert?
var body: some View {
Form {
Section(header: Text(NSLocalizedString("Защита входа", comment: "Раздел защиты входа через email"))) {
Toggle(NSLocalizedString("Получать коды на email при входе", comment: "Переключатель отправки кодов при входе"), isOn: Binding(
get: { isLoginCodesEnabled },
set: { _ in
activeAlert = EmailSecurityAlert(
title: NSLocalizedString("Скоро", comment: "Заголовок заглушки"),
message: NSLocalizedString("Функция пока недоступна.", comment: "Сообщение заглушки")
)
isLoginCodesEnabled = false
}
))
Text(NSLocalizedString("Мы отправим код подтверждения на привязанный email каждый раз при входе.", comment: "Описание работы кодов при входе"))
.font(.footnote)
.foregroundColor(.secondary)
}
Section(header: Text(NSLocalizedString("Подтверждение email", comment: "Раздел подтверждения email"))) {
Text(NSLocalizedString("Email не подтверждён. Подтвердите, чтобы активировать дополнительные проверки.", comment: "Описание необходимости подтверждения email"))
.font(.callout)
.foregroundColor(.secondary)
Button(NSLocalizedString("Отправить письмо подтверждения", comment: "Кнопка отправки письма подтверждения")) {
activeAlert = EmailSecurityAlert(
title: NSLocalizedString("Скоро", comment: "Заголовок заглушки"),
message: NSLocalizedString("Мы отправим письмо, как только функция будет готова.", comment: "Сообщение при недоступной отправке письма")
)
}
}
}
.navigationTitle(NSLocalizedString("Email", comment: "Заголовок экрана настроек email"))
.navigationBarTitleDisplayMode(.inline)
.alert(item: $activeAlert) { alert in
Alert(
title: Text(alert.title),
message: Text(alert.message),
dismissButton: .default(Text(NSLocalizedString("OK", comment: "Общий текст кнопки OK")))
)
}
}
}
private struct EmailSecurityAlert: Identifiable {
let id = UUID()
let title: String
let message: String
}
#if DEBUG
struct EmailSecuritySettingsView_Previews: PreviewProvider {
static var previews: some View {
NavigationView {
EmailSecuritySettingsView()
}
}
}
#endif

View File

@ -0,0 +1,50 @@
import SwiftUI
struct SecuritySettingsView: View {
@ObservedObject var viewModel: LoginViewModel
@State private var isTwoFactorActive = false
@State private var isEmailSettingsActive = false
var body: some View {
List {
Section(header: Text(NSLocalizedString("Аутентификация", comment: "Раздел настроек безопасности для аутентификации"))) {
NavigationLink(isActive: $isTwoFactorActive) {
TwoFactorAuthView()
} label: {
Label(NSLocalizedString("Двухфакторная аутентификация", comment: "Переход к настройкам двухфакторной аутентификации"), systemImage: "lock.shield")
}
}
Section(header: Text(NSLocalizedString("Email", comment: "Раздел настроек безопасности для email"))) {
NavigationLink(isActive: $isEmailSettingsActive) {
EmailSecuritySettingsView()
} label: {
Label(NSLocalizedString("Настройки email", comment: "Переход к настройкам безопасности email"), systemImage: "envelope")
}
}
}
.listStyle(.insetGrouped)
.navigationTitle(NSLocalizedString("Безопасность", comment: "Заголовок экрана настроек безопасности"))
.navigationBarTitleDisplayMode(.inline)
.onAppear { handleTwoFactorOnboardingIfNeeded() }
.onChange(of: viewModel.onboardingDestination) { _ in
handleTwoFactorOnboardingIfNeeded()
}
}
private func handleTwoFactorOnboardingIfNeeded() {
guard viewModel.onboardingDestination == .twoFactor else { return }
isTwoFactorActive = true
viewModel.onboardingDestination = nil
}
}
#if DEBUG
struct SecuritySettingsView_Previews: PreviewProvider {
static var previews: some View {
NavigationView {
SecuritySettingsView(viewModel: LoginViewModel())
}
}
}
#endif

View File

@ -4,7 +4,7 @@ struct SettingsView: View {
@ObservedObject var viewModel: LoginViewModel
@EnvironmentObject private var themeManager: ThemeManager
@State private var isThemeExpanded = false
@State private var isTwoFactorActive = false
@State private var isSecurityActive = false
private let themeOptions = ThemeOption.ordered
private var selectedThemeOption: ThemeOption {
@ -33,10 +33,10 @@ struct SettingsView: View {
NavigationLink(destination: ChangePasswordView()) {
Label(NSLocalizedString("Сменить пароль", comment: ""), systemImage: "key")
}
NavigationLink(isActive: $isTwoFactorActive) {
TwoFactorAuthView()
NavigationLink(isActive: $isSecurityActive) {
SecuritySettingsView(viewModel: viewModel)
} label: {
Label(NSLocalizedString("Двухфакторная аутентификация", comment: ""), systemImage: "lock.shield")
Label(NSLocalizedString("Безопасность", comment: ""), systemImage: "lock.shield")
}
NavigationLink(destination: ActiveSessionsView()) {
Label(NSLocalizedString("Активные сессии", comment: ""), systemImage: "iphone")
@ -178,7 +178,6 @@ struct SettingsView: View {
private extension SettingsView {
func handleTwoFactorOnboardingIfNeeded() {
guard viewModel.onboardingDestination == .twoFactor else { return }
isTwoFactorActive = true
viewModel.onboardingDestination = nil
isSecurityActive = true
}
}