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