From ef97a20c23673ca4a6c1da7e08a172044d07b31e Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Mon, 17 Nov 2025 16:27:00 +0200 Subject: [PATCH] Fix password autofill on iOS (#9397) * fix password autofill on iOS * update autocomplete props, rm textContentType --- src/screens/Login/LoginForm.tsx | 21 +++++++++++++++---- src/screens/Login/SetNewPasswordForm.tsx | 4 ++-- .../components/ChangePasswordDialog.tsx | 1 + 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/screens/Login/LoginForm.tsx b/src/screens/Login/LoginForm.tsx index b6a528e42b..212059986e 100644 --- a/src/screens/Login/LoginForm.tsx +++ b/src/screens/Login/LoginForm.tsx @@ -18,10 +18,11 @@ import {isNetworkError} from '#/lib/strings/errors' import {cleanError} from '#/lib/strings/errors' import {createFullHandle} from '#/lib/strings/handles' import {logger} from '#/logger' +import {isIOS} from '#/platform/detection' import {useSetHasCheckedForStarterPack} from '#/state/preferences/used-starter-packs' import {useSessionApi} from '#/state/session' import {useLoggedOutViewControls} from '#/state/shell/logged-out' -import {atoms as a, useTheme} from '#/alf' +import {atoms as a, ios, useTheme} from '#/alf' import {Button, ButtonIcon, ButtonText} from '#/components/Button' import {FormError} from '#/components/forms/FormError' import {HostingProvider} from '#/components/forms/HostingProvider' @@ -69,7 +70,9 @@ export const LoginForm = ({ const identifierValueRef = useRef(initialHandle || '') const passwordValueRef = useRef('') const authFactorTokenValueRef = useRef('') + const identifierRef = useRef(null) const passwordRef = useRef(null) + const hasFocusedOnce = useRef(false) const {_} = useLingui() const {login} = useSessionApi() const requestNotificationsPermission = useRequestNotificationsPermission() @@ -198,9 +201,10 @@ export const LoginForm = ({ { passwordValueRef.current = v @@ -241,6 +244,16 @@ export const LoginForm = ({ blurOnSubmit={false} // HACK: https://github.com/facebook/react-native/issues/21911#issuecomment-558343069 Keyboard blur behavior is now handled in onSubmitEditing editable={!isProcessing} accessibilityHint={_(msg`Enter your password`)} + onLayout={ios(() => { + if (hasFocusedOnce.current) return + hasFocusedOnce.current = true + // kinda dumb, but if we use `autoFocus` to focus + // the username input, it happens before the password + // input gets rendered. this breaks the password autofill + // on iOS (it only does the username part). delaying + // it until both inputs are rendered fixes the autofill -sfn + identifierRef.current?.focus() + })} />