Skip to content

Commit 2865398

Browse files
committed
use isNewAccountsAllowed for email auth which disables signup
1 parent 095391e commit 2865398

File tree

5 files changed

+68
-31
lines changed

5 files changed

+68
-31
lines changed

auth/src/main/java/com/firebase/ui/auth/configuration/string_provider/AuthUIStringProvider.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -509,4 +509,7 @@ interface AuthUIStringProvider {
509509

510510
/** ToS and Privacy Policy combined message with placeholders for links */
511511
fun tosAndPrivacyPolicy(termsOfServiceLabel: String, privacyPolicyLabel: String): String
512+
513+
/** Tooltip message shown when new account sign-up is disabled */
514+
val newAccountsDisabledTooltip: String
512515
}

auth/src/main/java/com/firebase/ui/auth/configuration/string_provider/DefaultAuthUIStringProvider.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,4 +466,7 @@ class DefaultAuthUIStringProvider(
466466

467467
override fun tosAndPrivacyPolicy(termsOfServiceLabel: String, privacyPolicyLabel: String): String =
468468
localizedContext.getString(R.string.fui_tos_and_pp, termsOfServiceLabel, privacyPolicyLabel)
469+
470+
override val newAccountsDisabledTooltip: String
471+
get() = localizedContext.getString(R.string.fui_new_accounts_disabled_tooltip)
469472
}

auth/src/main/java/com/firebase/ui/auth/ui/components/ErrorRecoveryDialog.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,9 +189,9 @@ private fun getRecoveryActionText(
189189
is AuthException.EmailLinkCrossDeviceLinkingException -> stringProvider.continueText
190190
is AuthException.EmailLinkWrongDeviceException -> stringProvider.continueText
191191
is AuthException.EmailLinkDifferentAnonymousUserException -> stringProvider.dismissAction
192+
is AuthException.UserNotFoundException -> stringProvider.signupPageTitle // Navigate to sign-up when user not found
192193
is AuthException.NetworkException,
193194
is AuthException.InvalidCredentialsException,
194-
is AuthException.UserNotFoundException,
195195
is AuthException.WeakPasswordException,
196196
is AuthException.TooManyRequestsException,
197197
is AuthException.UnknownException -> stringProvider.retryAction

auth/src/main/java/com/firebase/ui/auth/ui/screens/email/EmailAuthScreen.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,16 @@ fun EmailAuthScreen(
179179
exception = exception,
180180
onRetry = { ex ->
181181
when (ex) {
182+
is AuthException.UserNotFoundException -> {
183+
val provider = configuration.providers
184+
.filterIsInstance<AuthProvider.Email>()
185+
.first()
186+
if (provider.isNewAccountsAllowed) {
187+
// User not found, but new accounts are allowed, switch to sign-up
188+
mode.value = EmailAuthMode.SignUp
189+
}
190+
}
191+
182192
is AuthException.InvalidCredentialsException -> {
183193
// User can retry sign in with corrected credentials
184194
}

auth/src/main/java/com/firebase/ui/auth/ui/screens/email/SignInUI.kt

Lines changed: 51 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -28,26 +28,29 @@ import androidx.compose.foundation.rememberScrollState
2828
import androidx.compose.foundation.verticalScroll
2929
import androidx.compose.material.icons.Icons
3030
import androidx.compose.material.icons.automirrored.filled.ArrowBack
31-
import androidx.compose.material3.AlertDialog
3231
import androidx.compose.material3.Button
3332
import androidx.compose.material3.CircularProgressIndicator
3433
import androidx.compose.material3.ExperimentalMaterial3Api
3534
import androidx.compose.material3.HorizontalDivider
3635
import androidx.compose.material3.Icon
3736
import androidx.compose.material3.IconButton
3837
import androidx.compose.material3.MaterialTheme
38+
import androidx.compose.material3.PlainTooltip
3939
import androidx.compose.material3.Scaffold
4040
import androidx.compose.material3.Text
4141
import androidx.compose.material3.TextButton
42+
import androidx.compose.material3.TooltipAnchorPosition
43+
import androidx.compose.material3.TooltipBox
44+
import androidx.compose.material3.TooltipDefaults
4245
import androidx.compose.material3.TopAppBar
46+
import androidx.compose.material3.rememberTooltipState
4347
import androidx.compose.runtime.Composable
48+
import androidx.compose.runtime.CompositionLocalProvider
4449
import androidx.compose.runtime.derivedStateOf
45-
import androidx.compose.runtime.mutableStateOf
4650
import androidx.compose.runtime.remember
4751
import androidx.compose.ui.Alignment
4852
import androidx.compose.ui.Modifier
4953
import androidx.compose.ui.platform.LocalContext
50-
import androidx.compose.ui.platform.LocalLayoutDirection
5154
import androidx.compose.ui.semantics.heading
5255
import androidx.compose.ui.semantics.semantics
5356
import androidx.compose.ui.text.style.TextAlign
@@ -57,11 +60,13 @@ import androidx.compose.ui.unit.dp
5760
import com.firebase.ui.auth.configuration.AuthUIConfiguration
5861
import com.firebase.ui.auth.configuration.authUIConfiguration
5962
import com.firebase.ui.auth.configuration.auth_provider.AuthProvider
63+
import com.firebase.ui.auth.configuration.string_provider.DefaultAuthUIStringProvider
6064
import com.firebase.ui.auth.configuration.string_provider.LocalAuthUIStringProvider
6165
import com.firebase.ui.auth.configuration.theme.AuthUITheme
6266
import com.firebase.ui.auth.configuration.validators.EmailValidator
6367
import com.firebase.ui.auth.configuration.validators.PasswordValidator
6468
import com.firebase.ui.auth.ui.components.AuthTextField
69+
import com.firebase.ui.auth.ui.components.LocalTopLevelDialogController
6570
import com.firebase.ui.auth.ui.components.TermsAndPrivacyForm
6671

6772
@OptIn(ExperimentalMaterial3Api::class)
@@ -175,20 +180,31 @@ fun SignInUI(
175180
modifier = Modifier
176181
.align(Alignment.End),
177182
) {
178-
Button(
179-
onClick = {
180-
onGoToSignUp()
183+
TooltipBox(
184+
positionProvider = TooltipDefaults.rememberTooltipPositionProvider(
185+
TooltipAnchorPosition.Above
186+
),
187+
tooltip = {
188+
PlainTooltip {
189+
Text(stringProvider.newAccountsDisabledTooltip)
190+
}
181191
},
182-
enabled = !isLoading,
192+
state = rememberTooltipState(
193+
initialIsVisible = !provider.isNewAccountsAllowed
194+
)
183195
) {
184-
Text(stringProvider.signupPageTitle.uppercase())
196+
Button(
197+
onClick = {
198+
onGoToSignUp()
199+
},
200+
enabled = provider.isNewAccountsAllowed && !isLoading,
201+
) {
202+
Text(stringProvider.signupPageTitle.uppercase())
203+
}
185204
}
186205
Spacer(modifier = Modifier.width(16.dp))
187206
Button(
188207
onClick = {
189-
// TODO(demolaf): When signIn is fired if Exception is UserNotFound
190-
// then we check if provider.isNewAccountsAllowed then we show signUp
191-
// else we show an error dialog stating signup is not allowed
192208
onSignInClick()
193209
},
194210
enabled = !isLoading && isFormValid.value,
@@ -250,29 +266,34 @@ fun PreviewSignInUI() {
250266
isEmailLinkSignInEnabled = false,
251267
isEmailLinkForceSameDeviceEnabled = true,
252268
emailLinkActionCodeSettings = null,
253-
isNewAccountsAllowed = true,
269+
isNewAccountsAllowed = false,
254270
minimumPasswordLength = 8,
255271
passwordValidationRules = listOf()
256272
)
273+
val stringProvider = DefaultAuthUIStringProvider(applicationContext)
257274

258275
AuthUITheme {
259-
SignInUI(
260-
configuration = authUIConfiguration {
261-
context = applicationContext
262-
providers { provider(provider) }
263-
tosUrl = ""
264-
privacyPolicyUrl = ""
265-
},
266-
email = "",
267-
password = "",
268-
isLoading = false,
269-
emailSignInLinkSent = false,
270-
onEmailChange = { email -> },
271-
onPasswordChange = { password -> },
272-
onSignInClick = {},
273-
onGoToSignUp = {},
274-
onGoToResetPassword = {},
275-
onGoToEmailLinkSignIn = {},
276-
)
276+
CompositionLocalProvider(
277+
LocalAuthUIStringProvider provides stringProvider
278+
) {
279+
SignInUI(
280+
configuration = authUIConfiguration {
281+
context = applicationContext
282+
providers { provider(provider) }
283+
tosUrl = ""
284+
privacyPolicyUrl = ""
285+
},
286+
email = "",
287+
password = "",
288+
isLoading = false,
289+
emailSignInLinkSent = false,
290+
onEmailChange = { email -> },
291+
onPasswordChange = { password -> },
292+
onSignInClick = {},
293+
onGoToSignUp = {},
294+
onGoToResetPassword = {},
295+
onGoToEmailLinkSignIn = {},
296+
)
297+
}
277298
}
278299
}

0 commit comments

Comments
 (0)