add secureview
This commit is contained in:
parent
6eed966fc9
commit
e3cf374893
@ -89,6 +89,12 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"Email" : {
|
||||||
|
"comment" : "Заголовок экрана настроек email\nРаздел настроек безопасности для email"
|
||||||
|
},
|
||||||
|
"Email не подтверждён. Подтвердите, чтобы активировать дополнительные проверки." : {
|
||||||
|
"comment" : "Описание необходимости подтверждения email"
|
||||||
|
},
|
||||||
"Fun Fest" : {
|
"Fun Fest" : {
|
||||||
"comment" : "Fun Fest",
|
"comment" : "Fun Fest",
|
||||||
"localizations" : {
|
"localizations" : {
|
||||||
@ -220,10 +226,14 @@
|
|||||||
"Аудио" : {
|
"Аудио" : {
|
||||||
"comment" : "Audio message placeholder"
|
"comment" : "Audio message placeholder"
|
||||||
},
|
},
|
||||||
|
"Аутентификация" : {
|
||||||
|
"comment" : "Раздел настроек безопасности для аутентификации"
|
||||||
|
},
|
||||||
"Без звука (скоро)" : {
|
"Без звука (скоро)" : {
|
||||||
|
|
||||||
},
|
},
|
||||||
"Безопасность" : {
|
"Безопасность" : {
|
||||||
|
"comment" : "Заголовок экрана настроек безопасности",
|
||||||
"localizations" : {
|
"localizations" : {
|
||||||
"en" : {
|
"en" : {
|
||||||
"stringUnit" : {
|
"stringUnit" : {
|
||||||
@ -427,7 +437,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Двухфакторная аутентификация" : {
|
"Двухфакторная аутентификация" : {
|
||||||
"comment" : "Заголовок экрана 2FA",
|
"comment" : "Заголовок экрана 2FA\nПереход к настройкам двухфакторной аутентификации",
|
||||||
"localizations" : {
|
"localizations" : {
|
||||||
"en" : {
|
"en" : {
|
||||||
"stringUnit" : {
|
"stringUnit" : {
|
||||||
@ -598,6 +608,9 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"Защита входа" : {
|
||||||
|
"comment" : "Раздел защиты входа через email"
|
||||||
|
},
|
||||||
"Здесь не будут чаты" : {
|
"Здесь не будут чаты" : {
|
||||||
"localizations" : {
|
"localizations" : {
|
||||||
"en" : {
|
"en" : {
|
||||||
@ -907,6 +920,12 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"Мы отправим код подтверждения на привязанный email каждый раз при входе." : {
|
||||||
|
"comment" : "Описание работы кодов при входе"
|
||||||
|
},
|
||||||
|
"Мы отправим письмо, как только функция будет готова." : {
|
||||||
|
"comment" : "Сообщение при недоступной отправке письма"
|
||||||
|
},
|
||||||
"Мы постараемся всё исправить. Напишите, что смутило." : {
|
"Мы постараемся всё исправить. Напишите, что смутило." : {
|
||||||
"comment" : "feedback: rating description 2",
|
"comment" : "feedback: rating description 2",
|
||||||
"localizations" : {
|
"localizations" : {
|
||||||
@ -1012,6 +1031,9 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"Настройки email" : {
|
||||||
|
"comment" : "Переход к настройкам безопасности email"
|
||||||
|
},
|
||||||
"Настройки приватности" : {
|
"Настройки приватности" : {
|
||||||
"localizations" : {
|
"localizations" : {
|
||||||
"en" : {
|
"en" : {
|
||||||
@ -1436,6 +1458,9 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"Отправить письмо подтверждения" : {
|
||||||
|
"comment" : "Кнопка отправки письма подтверждения"
|
||||||
|
},
|
||||||
"Отправляем..." : {
|
"Отправляем..." : {
|
||||||
"comment" : "feedback: sending state",
|
"comment" : "feedback: sending state",
|
||||||
"localizations" : {
|
"localizations" : {
|
||||||
@ -1686,6 +1711,9 @@
|
|||||||
"Подтвердить" : {
|
"Подтвердить" : {
|
||||||
"comment" : "Кнопка подтверждения кода 2FA"
|
"comment" : "Кнопка подтверждения кода 2FA"
|
||||||
},
|
},
|
||||||
|
"Подтверждение email" : {
|
||||||
|
"comment" : "Раздел подтверждения email"
|
||||||
|
},
|
||||||
"Подтверждение пароля" : {
|
"Подтверждение пароля" : {
|
||||||
"comment" : "Подтверждение пароля",
|
"comment" : "Подтверждение пароля",
|
||||||
"localizations" : {
|
"localizations" : {
|
||||||
@ -1757,6 +1785,9 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"Получать коды на email при входе" : {
|
||||||
|
"comment" : "Переключатель отправки кодов при входе"
|
||||||
|
},
|
||||||
"Получить ответ от команды" : {
|
"Получить ответ от команды" : {
|
||||||
"comment" : "feedback: contact toggle",
|
"comment" : "feedback: contact toggle",
|
||||||
"localizations" : {
|
"localizations" : {
|
||||||
@ -2217,7 +2248,7 @@
|
|||||||
"comment" : "Кнопка копирования кода восстановления"
|
"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"
|
"comment" : "Concept tab placeholder description"
|
||||||
@ -2445,6 +2476,9 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"Функция пока недоступна." : {
|
||||||
|
"comment" : "Сообщение заглушки"
|
||||||
|
},
|
||||||
"Центр авторов" : {
|
"Центр авторов" : {
|
||||||
"comment" : "Creator Center",
|
"comment" : "Creator Center",
|
||||||
"localizations" : {
|
"localizations" : {
|
||||||
|
|||||||
65
yobble/Views/Tab/Settings/EmailSecuritySettingsView.swift
Normal file
65
yobble/Views/Tab/Settings/EmailSecuritySettingsView.swift
Normal 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
|
||||||
50
yobble/Views/Tab/Settings/SecuritySettingsView.swift
Normal file
50
yobble/Views/Tab/Settings/SecuritySettingsView.swift
Normal 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
|
||||||
@ -4,7 +4,7 @@ struct SettingsView: View {
|
|||||||
@ObservedObject var viewModel: LoginViewModel
|
@ObservedObject var viewModel: LoginViewModel
|
||||||
@EnvironmentObject private var themeManager: ThemeManager
|
@EnvironmentObject private var themeManager: ThemeManager
|
||||||
@State private var isThemeExpanded = false
|
@State private var isThemeExpanded = false
|
||||||
@State private var isTwoFactorActive = false
|
@State private var isSecurityActive = false
|
||||||
private let themeOptions = ThemeOption.ordered
|
private let themeOptions = ThemeOption.ordered
|
||||||
|
|
||||||
private var selectedThemeOption: ThemeOption {
|
private var selectedThemeOption: ThemeOption {
|
||||||
@ -33,10 +33,10 @@ struct SettingsView: View {
|
|||||||
NavigationLink(destination: ChangePasswordView()) {
|
NavigationLink(destination: ChangePasswordView()) {
|
||||||
Label(NSLocalizedString("Сменить пароль", comment: ""), systemImage: "key")
|
Label(NSLocalizedString("Сменить пароль", comment: ""), systemImage: "key")
|
||||||
}
|
}
|
||||||
NavigationLink(isActive: $isTwoFactorActive) {
|
NavigationLink(isActive: $isSecurityActive) {
|
||||||
TwoFactorAuthView()
|
SecuritySettingsView(viewModel: viewModel)
|
||||||
} label: {
|
} label: {
|
||||||
Label(NSLocalizedString("Двухфакторная аутентификация", comment: ""), systemImage: "lock.shield")
|
Label(NSLocalizedString("Безопасность", comment: ""), systemImage: "lock.shield")
|
||||||
}
|
}
|
||||||
NavigationLink(destination: ActiveSessionsView()) {
|
NavigationLink(destination: ActiveSessionsView()) {
|
||||||
Label(NSLocalizedString("Активные сессии", comment: ""), systemImage: "iphone")
|
Label(NSLocalizedString("Активные сессии", comment: ""), systemImage: "iphone")
|
||||||
@ -178,7 +178,6 @@ struct SettingsView: View {
|
|||||||
private extension SettingsView {
|
private extension SettingsView {
|
||||||
func handleTwoFactorOnboardingIfNeeded() {
|
func handleTwoFactorOnboardingIfNeeded() {
|
||||||
guard viewModel.onboardingDestination == .twoFactor else { return }
|
guard viewModel.onboardingDestination == .twoFactor else { return }
|
||||||
isTwoFactorActive = true
|
isSecurityActive = true
|
||||||
viewModel.onboardingDestination = nil
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user