diff --git a/yobble/Resources/Localizable.xcstrings b/yobble/Resources/Localizable.xcstrings index 728475a..f820b82 100644 --- a/yobble/Resources/Localizable.xcstrings +++ b/yobble/Resources/Localizable.xcstrings @@ -2296,6 +2296,9 @@ } } } + }, + "Режим" : { + }, "Режим мессенжера" : { diff --git a/yobble/Views/Login/LoginTopBar.swift b/yobble/Views/Login/LoginTopBar.swift index c628e39..29fbc81 100644 --- a/yobble/Views/Login/LoginTopBar.swift +++ b/yobble/Views/Login/LoginTopBar.swift @@ -2,6 +2,7 @@ import SwiftUI struct LoginTopBar: View { let openLanguageSettings: () -> Void + let onShowModePrompt: (() -> Void)? @EnvironmentObject private var themeManager: ThemeManager @Environment(\.colorScheme) private var colorScheme private let themeOptions = ThemeOption.ordered @@ -13,6 +14,13 @@ struct LoginTopBar: View { .padding(8) } Spacer() + if let onShowModePrompt { + Button(action: onShowModePrompt) { + Text(NSLocalizedString("Режим", comment: "")) + .font(.footnote.bold()) + } + Spacer() + } Menu { ForEach(themeOptions) { option in Button(action: { selectTheme(option) }) { diff --git a/yobble/Views/Login/LoginView.swift b/yobble/Views/Login/LoginView.swift index d97e34e..de289e1 100644 --- a/yobble/Views/Login/LoginView.swift +++ b/yobble/Views/Login/LoginView.swift @@ -35,10 +35,7 @@ struct LoginView: View { } } .onAppear { - pendingMessengerMode = isMessengerModeEnabled - withAnimation { - isShowingMessengerPrompt = true - } + showModePrompt() } } @@ -46,21 +43,36 @@ struct LoginView: View { ZStack { switch viewModel.loginFlowStep { case .passwordlessRequest: - PasswordlessRequestView(viewModel: viewModel, shouldAutofocus: !isShowingMessengerPrompt) + PasswordlessRequestView( + viewModel: viewModel, + shouldAutofocus: !isShowingMessengerPrompt, + onShowModePrompt: showModePrompt + ) .transition(.move(edge: .trailing).combined(with: .opacity)) case .passwordlessVerify: - PasswordlessVerifyView(viewModel: viewModel, shouldAutofocus: !isShowingMessengerPrompt) + PasswordlessVerifyView( + viewModel: viewModel, + shouldAutofocus: !isShowingMessengerPrompt, + onShowModePrompt: showModePrompt + ) .transition(.move(edge: .leading).combined(with: .opacity)) case .password: - PasswordLoginView(viewModel: viewModel) + PasswordLoginView(viewModel: viewModel, onShowModePrompt: showModePrompt) .transition(.opacity) case .registration: - RegistrationView(viewModel: viewModel) + RegistrationView(viewModel: viewModel, onShowModePrompt: showModePrompt) .transition(.move(edge: .bottom).combined(with: .opacity)) } } } + private func showModePrompt() { + pendingMessengerMode = isMessengerModeEnabled + withAnimation { + isShowingMessengerPrompt = true + } + } + private func applyMessengerModeSelection() { isMessengerModeEnabled = pendingMessengerMode dismissMessengerPrompt() @@ -75,6 +87,7 @@ struct LoginView: View { struct PasswordLoginView: View { @ObservedObject var viewModel: LoginViewModel + let onShowModePrompt: () -> Void @EnvironmentObject private var themeManager: ThemeManager @Environment(\.colorScheme) private var colorScheme private let themeOptions = ThemeOption.ordered @@ -108,7 +121,7 @@ struct PasswordLoginView: View { var body: some View { ScrollView(showsIndicators: false) { VStack(alignment: .leading, spacing: 24) { - LoginTopBar(openLanguageSettings: openLanguageSettings) + LoginTopBar(openLanguageSettings: openLanguageSettings, onShowModePrompt: onShowModePrompt) Button { focusedField = nil @@ -366,12 +379,13 @@ struct PasswordLoginView: View { private struct PasswordlessRequestView: View { @ObservedObject var viewModel: LoginViewModel let shouldAutofocus: Bool + let onShowModePrompt: () -> Void @FocusState private var isFieldFocused: Bool var body: some View { ScrollView(showsIndicators: false) { VStack(alignment: .leading, spacing: 24) { - LoginTopBar(openLanguageSettings: openLanguageSettings) + LoginTopBar(openLanguageSettings: openLanguageSettings, onShowModePrompt: onShowModePrompt) VStack(alignment: .leading, spacing: 8) { Text(NSLocalizedString("Вход", comment: "")) @@ -502,12 +516,13 @@ private struct PasswordlessRequestView: View { private struct PasswordlessVerifyView: View { @ObservedObject var viewModel: LoginViewModel let shouldAutofocus: Bool + let onShowModePrompt: () -> Void @FocusState private var isCodeFieldFocused: Bool var body: some View { ScrollView(showsIndicators: false) { VStack(alignment: .leading, spacing: 24) { - LoginTopBar(openLanguageSettings: openLanguageSettings) + LoginTopBar(openLanguageSettings: openLanguageSettings, onShowModePrompt: onShowModePrompt) VStack(alignment: .leading, spacing: 8) { Text(NSLocalizedString("Введите код", comment: "")) diff --git a/yobble/Views/Login/RegistrationView.swift b/yobble/Views/Login/RegistrationView.swift index 049b3f1..f534644 100644 --- a/yobble/Views/Login/RegistrationView.swift +++ b/yobble/Views/Login/RegistrationView.swift @@ -9,6 +9,7 @@ import SwiftUI struct RegistrationView: View { @ObservedObject var viewModel: LoginViewModel + let onShowModePrompt: (() -> Void)? @State private var username: String = "" @State private var password: String = "" @@ -46,10 +47,15 @@ struct RegistrationView: View { isUsernameValid && isPasswordValid && isConfirmPasswordValid && viewModel.hasAcceptedTerms } + init(viewModel: LoginViewModel, onShowModePrompt: (() -> Void)? = nil) { + self._viewModel = ObservedObject(initialValue: viewModel) + self.onShowModePrompt = onShowModePrompt + } + var body: some View { ScrollView(showsIndicators: false) { VStack(alignment: .leading, spacing: 24) { - LoginTopBar(openLanguageSettings: openLanguageSettings) + LoginTopBar(openLanguageSettings: openLanguageSettings, onShowModePrompt: onShowModePrompt) Button(action: goBack) { HStack(spacing: 6) { @@ -227,6 +233,6 @@ struct RegistrationView_Previews: PreviewProvider { static var previews: some View { let viewModel = LoginViewModel() viewModel.isLoading = false // чтобы убрать спиннер - return RegistrationView(viewModel: viewModel) + return RegistrationView(viewModel: viewModel, onShowModePrompt: nil) } }