1+ package com.firebase.ui.auth.compose
2+
3+ import androidx.compose.foundation.Image
4+ import androidx.compose.foundation.background
5+ import androidx.compose.foundation.layout.Arrangement
6+ import androidx.compose.foundation.layout.Box
7+ import androidx.compose.foundation.layout.Column
8+ import androidx.compose.foundation.layout.PaddingValues
9+ import androidx.compose.foundation.layout.Spacer
10+ import androidx.compose.foundation.layout.fillMaxHeight
11+ import androidx.compose.foundation.layout.fillMaxSize
12+ import androidx.compose.foundation.layout.height
13+ import androidx.compose.foundation.layout.padding
14+ import androidx.compose.foundation.layout.safeContentPadding
15+ import androidx.compose.foundation.layout.safeDrawingPadding
16+ import androidx.compose.foundation.layout.widthIn
17+ import androidx.compose.foundation.lazy.LazyColumn
18+ import androidx.compose.material.icons.Icons
19+ import androidx.compose.material.icons.filled.Favorite
20+ import androidx.compose.material.icons.filled.Star
21+ import androidx.compose.material3.Icon
22+ import androidx.compose.material3.Scaffold
23+ import androidx.compose.material3.Text
24+ import androidx.compose.runtime.Composable
25+ import androidx.compose.ui.Alignment
26+ import androidx.compose.ui.Modifier
27+ import androidx.compose.ui.graphics.Color
28+ import androidx.compose.ui.platform.LocalContext
29+ import androidx.compose.ui.text.style.TextAlign
30+ import androidx.compose.ui.tooling.preview.Preview
31+ import androidx.compose.ui.unit.dp
32+ import com.firebase.ui.auth.R
33+ import com.firebase.ui.auth.compose.AuthProviderButton
34+ import com.firebase.ui.auth.compose.configuration.AuthProvider
35+ import com.firebase.ui.auth.compose.configuration.stringprovider.DefaultAuthUIStringProvider
36+ import com.firebase.ui.auth.compose.configuration.theme.AuthUIAsset
37+
38+ // AuthMethodPicker(
39+ // providers = listOf(GoogleAuthProvider(), EmailAuthProvider()),
40+ // onProviderSelected = { provider -> /* ... */ }
41+ // )
42+
43+ /* *
44+ * Renders the provider selection screen.
45+ *
46+ * **Example usage:**
47+ * ```kotlin
48+ * AuthMethodPicker(
49+ * providers = listOf(
50+ * AuthProvider.Google(),
51+ * AuthProvider.Email(),
52+ * ),
53+ * onProviderSelected = { provider -> /* ... */ }
54+ * )
55+ * ```
56+ *
57+ * @param modifier A modifier for the screen layout.
58+ * @param providers The list of providers to display.
59+ * @param logo An optional logo to display.
60+ * @param onProviderSelected A callback when a provider is selected.
61+ * @param customLayout An optional custom layout composable for the provider buttons.
62+ *
63+ * @since 10.0.0
64+ */
65+ @Composable
66+ fun AuthMethodPicker (
67+ modifier : Modifier = Modifier ,
68+ providers : List <AuthProvider >,
69+ logo : AuthUIAsset ? = null,
70+ onProviderSelected : (AuthProvider ) -> Unit ,
71+ customLayout : @Composable ((List <AuthProvider >, (AuthProvider ) -> Unit ) -> Unit )? = null,
72+ ) {
73+ val context = LocalContext .current
74+
75+ Column (
76+ modifier = modifier
77+ .fillMaxSize()
78+ .safeDrawingPadding(),
79+ horizontalAlignment = Alignment .CenterHorizontally
80+ ) {
81+ logo?.let {
82+ Image (
83+ modifier = Modifier
84+ .weight(0.4f ),
85+ painter = it.painter,
86+ contentDescription = " AuthMethodPicker logo" ,
87+ )
88+ }
89+ if (customLayout != null ) {
90+ customLayout(providers, onProviderSelected)
91+ } else {
92+ LazyColumn (
93+ modifier = Modifier
94+ .fillMaxSize()
95+ .weight(1f ),
96+ horizontalAlignment = Alignment .CenterHorizontally ,
97+ contentPadding = PaddingValues (bottom = 64 .dp) // Space for text
98+ ) {
99+ items(providers.size) { index ->
100+ val provider = providers[index]
101+ Box (
102+ modifier = Modifier
103+ .padding(bottom = 16 .dp)
104+ ) {
105+ AuthProviderButton (
106+ onClick = {
107+ onProviderSelected(provider)
108+ },
109+ provider = provider,
110+ stringProvider = DefaultAuthUIStringProvider (context)
111+ )
112+ }
113+ }
114+ }
115+ Text (
116+ " By continuing, you are indicating that you accept our " +
117+ " Terms of Service and Privacy Policy." ,
118+ textAlign = TextAlign .Center ,
119+ modifier = Modifier
120+ .padding(horizontal = 16 .dp, vertical = 16 .dp)
121+ )
122+ }
123+ }
124+ }
125+
126+ @Preview(showBackground = true )
127+ @Composable
128+ fun PreviewAuthMethodPicker () {
129+ AuthMethodPicker (
130+ providers = listOf (
131+ AuthProvider .Email (
132+ actionCodeSettings = null ,
133+ passwordValidationRules = emptyList()
134+ ),
135+ AuthProvider .Phone (
136+ defaultNumber = null ,
137+ defaultCountryCode = null ,
138+ allowedCountries = null ,
139+ ),
140+ AuthProvider .Google (
141+ scopes = emptyList(),
142+ serverClientId = null
143+ ),
144+ AuthProvider .Facebook (),
145+ AuthProvider .Twitter (
146+ customParameters = emptyMap()
147+ ),
148+ AuthProvider .Github (
149+ customParameters = emptyMap()
150+ ),
151+ AuthProvider .Microsoft (
152+ tenant = null ,
153+ customParameters = emptyMap()
154+ ),
155+ AuthProvider .Yahoo (
156+ customParameters = emptyMap()
157+ ),
158+ AuthProvider .Apple (
159+ locale = null ,
160+ customParameters = emptyMap()
161+ ),
162+ AuthProvider .Anonymous ,
163+ AuthProvider .GenericOAuth (
164+ providerId = " google.com" ,
165+ scopes = emptyList(),
166+ customParameters = emptyMap(),
167+ buttonLabel = " Generic Provider" ,
168+ buttonIcon = AuthUIAsset .Vector (Icons .Default .Star ),
169+ buttonColor = Color .Gray ,
170+ contentColor = Color .White
171+ )
172+ ),
173+ logo = AuthUIAsset .Resource (R .drawable.fui_ic_check_circle_black_128dp),
174+ onProviderSelected = { provider ->
175+
176+ },
177+ )
178+ }
0 commit comments