update tob bar

This commit is contained in:
cheykrym 2025-12-03 08:00:29 +03:00
parent a9aa891f19
commit c09858dfbd
4 changed files with 45 additions and 13 deletions

View File

@ -2296,6 +2296,9 @@
} }
} }
} }
},
"Режим" : {
}, },
"Режим мессенжера" : { "Режим мессенжера" : {

View File

@ -2,6 +2,7 @@ import SwiftUI
struct LoginTopBar: View { struct LoginTopBar: View {
let openLanguageSettings: () -> Void let openLanguageSettings: () -> Void
let onShowModePrompt: (() -> Void)?
@EnvironmentObject private var themeManager: ThemeManager @EnvironmentObject private var themeManager: ThemeManager
@Environment(\.colorScheme) private var colorScheme @Environment(\.colorScheme) private var colorScheme
private let themeOptions = ThemeOption.ordered private let themeOptions = ThemeOption.ordered
@ -13,6 +14,13 @@ struct LoginTopBar: View {
.padding(8) .padding(8)
} }
Spacer() Spacer()
if let onShowModePrompt {
Button(action: onShowModePrompt) {
Text(NSLocalizedString("Режим", comment: ""))
.font(.footnote.bold())
}
Spacer()
}
Menu { Menu {
ForEach(themeOptions) { option in ForEach(themeOptions) { option in
Button(action: { selectTheme(option) }) { Button(action: { selectTheme(option) }) {

View File

@ -35,10 +35,7 @@ struct LoginView: View {
} }
} }
.onAppear { .onAppear {
pendingMessengerMode = isMessengerModeEnabled showModePrompt()
withAnimation {
isShowingMessengerPrompt = true
}
} }
} }
@ -46,21 +43,36 @@ struct LoginView: View {
ZStack { ZStack {
switch viewModel.loginFlowStep { switch viewModel.loginFlowStep {
case .passwordlessRequest: case .passwordlessRequest:
PasswordlessRequestView(viewModel: viewModel, shouldAutofocus: !isShowingMessengerPrompt) PasswordlessRequestView(
viewModel: viewModel,
shouldAutofocus: !isShowingMessengerPrompt,
onShowModePrompt: showModePrompt
)
.transition(.move(edge: .trailing).combined(with: .opacity)) .transition(.move(edge: .trailing).combined(with: .opacity))
case .passwordlessVerify: case .passwordlessVerify:
PasswordlessVerifyView(viewModel: viewModel, shouldAutofocus: !isShowingMessengerPrompt) PasswordlessVerifyView(
viewModel: viewModel,
shouldAutofocus: !isShowingMessengerPrompt,
onShowModePrompt: showModePrompt
)
.transition(.move(edge: .leading).combined(with: .opacity)) .transition(.move(edge: .leading).combined(with: .opacity))
case .password: case .password:
PasswordLoginView(viewModel: viewModel) PasswordLoginView(viewModel: viewModel, onShowModePrompt: showModePrompt)
.transition(.opacity) .transition(.opacity)
case .registration: case .registration:
RegistrationView(viewModel: viewModel) RegistrationView(viewModel: viewModel, onShowModePrompt: showModePrompt)
.transition(.move(edge: .bottom).combined(with: .opacity)) .transition(.move(edge: .bottom).combined(with: .opacity))
} }
} }
} }
private func showModePrompt() {
pendingMessengerMode = isMessengerModeEnabled
withAnimation {
isShowingMessengerPrompt = true
}
}
private func applyMessengerModeSelection() { private func applyMessengerModeSelection() {
isMessengerModeEnabled = pendingMessengerMode isMessengerModeEnabled = pendingMessengerMode
dismissMessengerPrompt() dismissMessengerPrompt()
@ -75,6 +87,7 @@ struct LoginView: View {
struct PasswordLoginView: View { struct PasswordLoginView: View {
@ObservedObject var viewModel: LoginViewModel @ObservedObject var viewModel: LoginViewModel
let onShowModePrompt: () -> Void
@EnvironmentObject private var themeManager: ThemeManager @EnvironmentObject private var themeManager: ThemeManager
@Environment(\.colorScheme) private var colorScheme @Environment(\.colorScheme) private var colorScheme
private let themeOptions = ThemeOption.ordered private let themeOptions = ThemeOption.ordered
@ -108,7 +121,7 @@ struct PasswordLoginView: View {
var body: some View { var body: some View {
ScrollView(showsIndicators: false) { ScrollView(showsIndicators: false) {
VStack(alignment: .leading, spacing: 24) { VStack(alignment: .leading, spacing: 24) {
LoginTopBar(openLanguageSettings: openLanguageSettings) LoginTopBar(openLanguageSettings: openLanguageSettings, onShowModePrompt: onShowModePrompt)
Button { Button {
focusedField = nil focusedField = nil
@ -366,12 +379,13 @@ struct PasswordLoginView: View {
private struct PasswordlessRequestView: View { private struct PasswordlessRequestView: View {
@ObservedObject var viewModel: LoginViewModel @ObservedObject var viewModel: LoginViewModel
let shouldAutofocus: Bool let shouldAutofocus: Bool
let onShowModePrompt: () -> Void
@FocusState private var isFieldFocused: Bool @FocusState private var isFieldFocused: Bool
var body: some View { var body: some View {
ScrollView(showsIndicators: false) { ScrollView(showsIndicators: false) {
VStack(alignment: .leading, spacing: 24) { VStack(alignment: .leading, spacing: 24) {
LoginTopBar(openLanguageSettings: openLanguageSettings) LoginTopBar(openLanguageSettings: openLanguageSettings, onShowModePrompt: onShowModePrompt)
VStack(alignment: .leading, spacing: 8) { VStack(alignment: .leading, spacing: 8) {
Text(NSLocalizedString("Вход", comment: "")) Text(NSLocalizedString("Вход", comment: ""))
@ -502,12 +516,13 @@ private struct PasswordlessRequestView: View {
private struct PasswordlessVerifyView: View { private struct PasswordlessVerifyView: View {
@ObservedObject var viewModel: LoginViewModel @ObservedObject var viewModel: LoginViewModel
let shouldAutofocus: Bool let shouldAutofocus: Bool
let onShowModePrompt: () -> Void
@FocusState private var isCodeFieldFocused: Bool @FocusState private var isCodeFieldFocused: Bool
var body: some View { var body: some View {
ScrollView(showsIndicators: false) { ScrollView(showsIndicators: false) {
VStack(alignment: .leading, spacing: 24) { VStack(alignment: .leading, spacing: 24) {
LoginTopBar(openLanguageSettings: openLanguageSettings) LoginTopBar(openLanguageSettings: openLanguageSettings, onShowModePrompt: onShowModePrompt)
VStack(alignment: .leading, spacing: 8) { VStack(alignment: .leading, spacing: 8) {
Text(NSLocalizedString("Введите код", comment: "")) Text(NSLocalizedString("Введите код", comment: ""))

View File

@ -9,6 +9,7 @@ import SwiftUI
struct RegistrationView: View { struct RegistrationView: View {
@ObservedObject var viewModel: LoginViewModel @ObservedObject var viewModel: LoginViewModel
let onShowModePrompt: (() -> Void)?
@State private var username: String = "" @State private var username: String = ""
@State private var password: String = "" @State private var password: String = ""
@ -46,10 +47,15 @@ struct RegistrationView: View {
isUsernameValid && isPasswordValid && isConfirmPasswordValid && viewModel.hasAcceptedTerms isUsernameValid && isPasswordValid && isConfirmPasswordValid && viewModel.hasAcceptedTerms
} }
init(viewModel: LoginViewModel, onShowModePrompt: (() -> Void)? = nil) {
self._viewModel = ObservedObject(initialValue: viewModel)
self.onShowModePrompt = onShowModePrompt
}
var body: some View { var body: some View {
ScrollView(showsIndicators: false) { ScrollView(showsIndicators: false) {
VStack(alignment: .leading, spacing: 24) { VStack(alignment: .leading, spacing: 24) {
LoginTopBar(openLanguageSettings: openLanguageSettings) LoginTopBar(openLanguageSettings: openLanguageSettings, onShowModePrompt: onShowModePrompt)
Button(action: goBack) { Button(action: goBack) {
HStack(spacing: 6) { HStack(spacing: 6) {
@ -227,6 +233,6 @@ struct RegistrationView_Previews: PreviewProvider {
static var previews: some View { static var previews: some View {
let viewModel = LoginViewModel() let viewModel = LoginViewModel()
viewModel.isLoading = false // чтобы убрать спиннер viewModel.isLoading = false // чтобы убрать спиннер
return RegistrationView(viewModel: viewModel) return RegistrationView(viewModel: viewModel, onShowModePrompt: nil)
} }
} }