diff --git a/admin/components/instance/setup-form.tsx b/admin/components/instance/setup-form.tsx index c3dfb5dcb..f854683e9 100644 --- a/admin/components/instance/setup-form.tsx +++ b/admin/components/instance/setup-form.tsx @@ -69,6 +69,7 @@ export const InstanceSetupForm: FC = (props) => { const [formData, setFormData] = useState(defaultFromData); const [isPasswordInputFocused, setIsPasswordInputFocused] = useState(false); const [isSubmitting, setIsSubmitting] = useState(false); + const [isRetryPasswordInputFocused, setIsRetryPasswordInputFocused] = useState(false); const handleFormChange = (key: keyof TFormData, value: string | boolean) => setFormData((prev) => ({ ...prev, [key]: value })); @@ -276,6 +277,8 @@ export const InstanceSetupForm: FC = (props) => { onChange={(e) => handleFormChange("confirm_password", e.target.value)} placeholder="Confirm password" className="w-full border border-onboarding-border-100 !bg-onboarding-background-200 pr-12 placeholder:text-onboarding-text-400" + onFocus={() => setIsRetryPasswordInputFocused(true)} + onBlur={() => setIsRetryPasswordInputFocused(false)} /> {showPassword ? ( )} - {!!formData.confirm_password && formData.password !== formData.confirm_password && ( - Passwords don{"'"}t match - )} + {!!formData.confirm_password && + formData.password !== formData.confirm_password && + !isRetryPasswordInputFocused && Passwords don{"'"}t match}
diff --git a/space/components/accounts/auth-forms/password.tsx b/space/components/accounts/auth-forms/password.tsx index b9d614155..8148ee405 100644 --- a/space/components/accounts/auth-forms/password.tsx +++ b/space/components/accounts/auth-forms/password.tsx @@ -44,6 +44,7 @@ export const PasswordForm: React.FC = (props) => { const [csrfToken, setCsrfToken] = useState(undefined); const [isPasswordInputFocused, setIsPasswordInputFocused] = useState(false); const [isSubmitting, setIsSubmitting] = useState(false); + const [isRetryPasswordInputFocused, setIsRetryPasswordInputFocused] = useState(false); // hooks const { data: instance, config: instanceConfig } = useInstance(); // router @@ -170,6 +171,8 @@ export const PasswordForm: React.FC = (props) => { onChange={(e) => handleFormChange("confirm_password", e.target.value)} placeholder="Confirm password" className="h-[46px] w-full border border-onboarding-border-100 !bg-onboarding-background-200 pr-12 placeholder:text-onboarding-text-400" + onFocus={() => setIsRetryPasswordInputFocused(true)} + onBlur={() => setIsRetryPasswordInputFocused(false)} /> {showPassword ? ( = (props) => { /> )}
- {!!passwordFormData.confirm_password && passwordFormData.password !== passwordFormData.confirm_password && ( - Passwords don{"'"}t match - )} + {!!passwordFormData.confirm_password && + passwordFormData.password !== passwordFormData.confirm_password && + !isRetryPasswordInputFocused && Passwords don{"'"}t match} )}
diff --git a/web/components/account/auth-forms/password.tsx b/web/components/account/auth-forms/password.tsx index 35385ee71..354037275 100644 --- a/web/components/account/auth-forms/password.tsx +++ b/web/components/account/auth-forms/password.tsx @@ -53,6 +53,7 @@ export const AuthPasswordForm: React.FC = observer((props: Props) => { }); const [isSubmitting, setIsSubmitting] = useState(false); const [isPasswordInputFocused, setIsPasswordInputFocused] = useState(false); + const [isRetryPasswordInputFocused, setIsRetryPasswordInputFocused] = useState(false); const handleShowPassword = (key: keyof typeof showPassword) => setShowPassword((prev) => ({ ...prev, [key]: !prev[key] })); @@ -183,6 +184,8 @@ export const AuthPasswordForm: React.FC = observer((props: Props) => { onChange={(e) => handleFormChange("confirm_password", e.target.value)} placeholder="Confirm password" className="disable-autofill-style h-[46px] w-full border border-onboarding-border-100 !bg-onboarding-background-200 pr-12 placeholder:text-onboarding-text-400" + onFocus={() => setIsRetryPasswordInputFocused(true)} + onBlur={() => setIsRetryPasswordInputFocused(false)} /> {showPassword?.retypePassword ? ( = observer((props: Props) => { /> )}
- {!!passwordFormData.confirm_password && passwordFormData.password !== passwordFormData.confirm_password && ( - Passwords don{"'"}t match - )} + {!!passwordFormData.confirm_password && + passwordFormData.password !== passwordFormData.confirm_password && + !isRetryPasswordInputFocused && Passwords don{"'"}t match} )} diff --git a/web/pages/accounts/reset-password.tsx b/web/pages/accounts/reset-password.tsx index f7c9acf37..46c8a40bf 100644 --- a/web/pages/accounts/reset-password.tsx +++ b/web/pages/accounts/reset-password.tsx @@ -52,6 +52,8 @@ const ResetPasswordPage: NextPageWithLayout = () => { }); const [csrfToken, setCsrfToken] = useState(undefined); const [isPasswordInputFocused, setIsPasswordInputFocused] = useState(false); + const [isRetryPasswordInputFocused, setIsRetryPasswordInputFocused] = useState(false); + // hooks const { resolvedTheme } = useTheme(); @@ -165,6 +167,8 @@ const ResetPasswordPage: NextPageWithLayout = () => { onChange={(e) => handleFormChange("confirm_password", e.target.value)} placeholder="Confirm password" className="h-[46px] w-full border border-onboarding-border-100 !bg-onboarding-background-200 pr-12 placeholder:text-onboarding-text-400" + onFocus={() => setIsRetryPasswordInputFocused(true)} + onBlur={() => setIsRetryPasswordInputFocused(false)} /> {showPassword ? ( { /> )} - {!!resetFormData.confirm_password && resetFormData.password !== resetFormData.confirm_password && ( - Passwords don{"'"}t match - )} + {!!resetFormData.confirm_password && + resetFormData.password !== resetFormData.confirm_password && + !isRetryPasswordInputFocused && ( + Passwords don{"'"}t match + )}