Compare commits

..

2 Commits

Author SHA1 Message Date
608add0714 fix keyboard 2025-12-03 08:46:00 +03:00
79461616f5 fix login 2025-12-03 08:41:57 +03:00
4 changed files with 34 additions and 7 deletions

View File

@ -12,7 +12,8 @@ class LoginViewModel: ObservableObject {
@Published var username: String = ""
@Published var userId: String = ""
@Published var password: String = ""
@Published var isLoading: Bool = true // сразу true, чтобы показать спиннер при автологине
@Published var isLoading: Bool = false
@Published var isInitialLoading: Bool = true // отдельный флаг для сплэша до завершения автологина
@Published var showError: Bool = false
@Published var errorMessage: String = ""
@Published var isLoggedIn: Bool = false
@ -127,6 +128,7 @@ class LoginViewModel: ObservableObject {
self?.socketService.disconnect()
}
self?.isLoading = false
self?.isInitialLoading = false
}
}
}
@ -135,7 +137,7 @@ class LoginViewModel: ObservableObject {
func login() {
isLoading = true
showError = false
authService.login(username: username, password: password) { [weak self] success, error in
DispatchQueue.main.async {
self?.isLoading = false

View File

@ -125,7 +125,7 @@ struct PasswordLoginView: View {
var body: some View {
ScrollView(showsIndicators: false) {
VStack(alignment: .leading, spacing: 24) {
LoginTopBar(openLanguageSettings: openLanguageSettings, onShowModePrompt: onShowModePrompt)
LoginTopBar(openLanguageSettings: openLanguageSettings, onShowModePrompt: hideKeyboardAndShowModePrompt)
Button {
focusedField = nil
@ -299,6 +299,11 @@ struct PasswordLoginView: View {
#endif
}
private func hideKeyboardAndShowModePrompt() {
focusedField = nil
onShowModePrompt()
}
private func openLanguageSettings() {
guard let url = URL(string: UIApplication.openSettingsURLString) else { return }
UIApplication.shared.open(url)
@ -389,7 +394,7 @@ private struct PasswordlessRequestView: View {
var body: some View {
ScrollView(showsIndicators: false) {
VStack(alignment: .leading, spacing: 24) {
LoginTopBar(openLanguageSettings: openLanguageSettings, onShowModePrompt: onShowModePrompt)
LoginTopBar(openLanguageSettings: openLanguageSettings, onShowModePrompt: hideKeyboardAndShowModePrompt)
VStack(alignment: .leading, spacing: 8) {
Text(NSLocalizedString("Вход", comment: ""))
@ -502,6 +507,11 @@ private struct PasswordlessRequestView: View {
.loginErrorAlert(viewModel: viewModel)
}
private func hideKeyboardAndShowModePrompt() {
isFieldFocused = false
onShowModePrompt()
}
private func openLanguageSettings() {
guard let url = URL(string: UIApplication.openSettingsURLString) else { return }
UIApplication.shared.open(url)
@ -526,7 +536,7 @@ private struct PasswordlessVerifyView: View {
var body: some View {
ScrollView(showsIndicators: false) {
VStack(alignment: .leading, spacing: 24) {
LoginTopBar(openLanguageSettings: openLanguageSettings, onShowModePrompt: onShowModePrompt)
LoginTopBar(openLanguageSettings: openLanguageSettings, onShowModePrompt: hideKeyboardAndShowModePrompt)
VStack(alignment: .leading, spacing: 8) {
Text(NSLocalizedString("Введите код", comment: ""))
@ -620,6 +630,11 @@ private struct PasswordlessVerifyView: View {
.loginErrorAlert(viewModel: viewModel)
}
private func hideKeyboardAndShowModePrompt() {
isCodeFieldFocused = false
onShowModePrompt()
}
private func openLanguageSettings() {
guard let url = URL(string: UIApplication.openSettingsURLString) else { return }
UIApplication.shared.open(url)
@ -813,6 +828,7 @@ struct LoginView_Previews: PreviewProvider {
private static func preview(step: LoginViewModel.LoginFlowStep) -> some View {
let viewModel = LoginViewModel()
viewModel.isLoading = false
viewModel.isInitialLoading = false
viewModel.loginFlowStep = step
viewModel.passwordlessLogin = "preview@yobble.app"
viewModel.verificationCode = "123456"

View File

@ -55,7 +55,7 @@ struct RegistrationView: View {
var body: some View {
ScrollView(showsIndicators: false) {
VStack(alignment: .leading, spacing: 24) {
LoginTopBar(openLanguageSettings: openLanguageSettings, onShowModePrompt: onShowModePrompt)
LoginTopBar(openLanguageSettings: openLanguageSettings, onShowModePrompt: keyboardDismissingModePrompt)
Button(action: goBack) {
HStack(spacing: 6) {
@ -222,6 +222,14 @@ struct RegistrationView: View {
}
}
private var keyboardDismissingModePrompt: (() -> Void)? {
guard let onShowModePrompt else { return nil }
return {
focusedField = nil
onShowModePrompt()
}
}
private func openLanguageSettings() {
guard let url = URL(string: UIApplication.openSettingsURLString) else { return }
UIApplication.shared.open(url)
@ -233,6 +241,7 @@ struct RegistrationView_Previews: PreviewProvider {
static var previews: some View {
let viewModel = LoginViewModel()
viewModel.isLoading = false // чтобы убрать спиннер
viewModel.isInitialLoading = false
return RegistrationView(viewModel: viewModel, onShowModePrompt: nil)
}
}

View File

@ -22,7 +22,7 @@ struct yobbleApp: App {
WindowGroup {
ZStack(alignment: .top) {
Group {
if viewModel.isLoading {
if viewModel.isInitialLoading {
SplashScreenView()
} else if viewModel.isLoggedIn {
MainView(viewModel: viewModel)