diff --git a/yobble/Views/Tab/Settings/ChangePasswordView.swift b/yobble/Views/Tab/Settings/ChangePasswordView.swift index 936000a..600fbbf 100644 --- a/yobble/Views/Tab/Settings/ChangePasswordView.swift +++ b/yobble/Views/Tab/Settings/ChangePasswordView.swift @@ -6,6 +6,9 @@ struct ChangePasswordView: View { @State private var oldPassword = "" @State private var newPassword = "" @State private var confirmPassword = "" + @State private var isOldPasswordVisible = false + @State private var isNewPasswordVisible = false + @State private var isConfirmPasswordVisible = false private var isOldPasswordValid: Bool { return oldPassword.count >= 8 && oldPassword.count <= 128 @@ -28,8 +31,28 @@ struct ChangePasswordView: View { Section { HStack { - SecureField(NSLocalizedString("Старый пароль", comment: "Старый пароль"), text: $oldPassword) - .autocapitalization(.none) + if isOldPasswordVisible { + TextField(NSLocalizedString("Старый пароль", comment: "Старый пароль"), text: $oldPassword) + .autocapitalization(.none) + .disableAutocorrection(true) + .textContentType(.password) + .frame(maxWidth: .infinity, alignment: .leading) + } else { + SecureField(NSLocalizedString("Старый пароль", comment: "Старый пароль"), text: $oldPassword) + .autocapitalization(.none) + .disableAutocorrection(true) + .textContentType(.password) + .frame(maxWidth: .infinity, alignment: .leading) + } + + Button(action: { + isOldPasswordVisible.toggle() + }) { + Image(systemName: isOldPasswordVisible ? "eye.slash" : "eye") + .foregroundColor(.gray) + } + .buttonStyle(PlainButtonStyle()) + .padding(.horizontal, 4) if !oldPassword.isEmpty { Image(systemName: isOldPasswordValid ? "checkmark.circle" : "xmark.circle") @@ -38,9 +61,29 @@ struct ChangePasswordView: View { } HStack { - SecureField(NSLocalizedString("Новый пароль", comment: "Новый пароль"), text: $newPassword) - .autocapitalization(.none) + if isNewPasswordVisible { + TextField(NSLocalizedString("Новый пароль", comment: "Новый пароль"), text: $newPassword) + .autocapitalization(.none) + .disableAutocorrection(true) + .textContentType(.newPassword) + .frame(maxWidth: .infinity, alignment: .leading) + } else { + SecureField(NSLocalizedString("Новый пароль", comment: "Новый пароль"), text: $newPassword) + .autocapitalization(.none) + .disableAutocorrection(true) + .textContentType(.newPassword) + .frame(maxWidth: .infinity, alignment: .leading) + } + Button(action: { + isNewPasswordVisible.toggle() + }) { + Image(systemName: isNewPasswordVisible ? "eye.slash" : "eye") + .foregroundColor(.gray) + } + .buttonStyle(PlainButtonStyle()) + .padding(.horizontal, 4) + if !newPassword.isEmpty { let isAllValid = isNewPasswordValid && !isOldPasswordSame @@ -50,9 +93,29 @@ struct ChangePasswordView: View { } HStack { - SecureField(NSLocalizedString("Подтверждение пароля", comment: "Подтверждение пароля"), text: $confirmPassword) - .autocapitalization(.none) + if isConfirmPasswordVisible { + TextField(NSLocalizedString("Подтверждение пароля", comment: "Подтверждение пароля"), text: $confirmPassword) + .autocapitalization(.none) + .disableAutocorrection(true) + .textContentType(.password) + .frame(maxWidth: .infinity, alignment: .leading) + } else { + SecureField(NSLocalizedString("Подтверждение пароля", comment: "Подтверждение пароля"), text: $confirmPassword) + .autocapitalization(.none) + .disableAutocorrection(true) + .textContentType(.password) + .frame(maxWidth: .infinity, alignment: .leading) + } + Button(action: { + isConfirmPasswordVisible.toggle() + }) { + Image(systemName: isConfirmPasswordVisible ? "eye.slash" : "eye") + .foregroundColor(.gray) + } + .buttonStyle(PlainButtonStyle()) + .padding(.horizontal, 4) + if !confirmPassword.isEmpty { Image(systemName: isPasswordConfirmValid ? "checkmark.circle" : "xmark.circle") .foregroundColor(isPasswordConfirmValid ? .green : .red)