diff --git a/formulus/src/screens/SettingsScreen.tsx b/formulus/src/screens/SettingsScreen.tsx index 23cbe402d..c4f095be4 100644 --- a/formulus/src/screens/SettingsScreen.tsx +++ b/formulus/src/screens/SettingsScreen.tsx @@ -1,4 +1,4 @@ -import React, {useState, useEffect, useCallback} from 'react'; +import React, {useState, useEffect, useCallback, useMemo} from 'react'; import { View, Text, @@ -194,20 +194,28 @@ const SettingsScreen = () => { } }; - const handleLogin = async () => { - if (!serverUrl.trim() || !username.trim() || !password.trim()) { + const handleLogin = useCallback(async () => { + const trimmedUrl = serverUrl.trim(); + const trimmedUsername = username.trim(); + const trimmedPassword = password.trim(); + + if (!trimmedUrl || !trimmedUsername || !trimmedPassword) { + return; + } + + if (isLoggingIn) { return; } - const serverReady = await handleServerSwitchIfNeeded(serverUrl); + const serverReady = await handleServerSwitchIfNeeded(trimmedUrl); if (!serverReady) { return; } setIsLoggingIn(true); try { - await Keychain.setGenericPassword(username, password); - await login(username, password); + await Keychain.setGenericPassword(trimmedUsername, trimmedPassword); + await login(trimmedUsername, trimmedPassword); ToastService.showShort('Successfully logged in!'); navigation.navigate('Home'); } catch (error: any) { @@ -218,7 +226,14 @@ const SettingsScreen = () => { } finally { setIsLoggingIn(false); } - }; + }, [ + serverUrl, + username, + password, + isLoggingIn, + handleServerSwitchIfNeeded, + navigation, + ]); const handleQRResult = async (result: any) => { setShowQRScanner(false); @@ -274,6 +289,12 @@ const SettingsScreen = () => { } }; + const isButtonDisabled = useMemo(() => { + const isFieldsEmpty = + !serverUrl.trim() || !username.trim() || !password.trim(); + return isFieldsEmpty || isLoggingIn; + }, [serverUrl, username, password, isLoggingIn]); + if (isLoading) { return ( @@ -298,7 +319,9 @@ const SettingsScreen = () => { + contentContainerStyle={styles.cardContent} + keyboardShouldPersistTaps="handled" + keyboardDismissMode="on-drag"> Please enter the server you want to connect to. @@ -350,36 +373,29 @@ const SettingsScreen = () => { /> - {(() => { - const isFieldsEmpty = - !serverUrl.trim() || !username.trim() || !password.trim(); - const isButtonDisabled = isFieldsEmpty || isLoggingIn; - - return ( - - - - {isLoggingIn ? 'Logging in...' : 'Login'} - - - ); - })()} + + + + {isLoggingIn ? 'Logging in...' : 'Login'} + +