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