@@ -21,7 +21,6 @@ import androidx.compose.material3.Surface
2121import androidx.compose.material3.Tab
2222import androidx.compose.material3.TabRow
2323import androidx.compose.material3.Text
24- import androidx.compose.material3.TextField
2524import androidx.compose.runtime.Composable
2625import androidx.compose.runtime.getValue
2726import androidx.compose.runtime.mutableStateOf
@@ -47,6 +46,7 @@ import com.gravatar.GravatarApi
4746import com.gravatar.ImageRating
4847import com.gravatar.R
4948import com.gravatar.demoapp.theme.GravatarDemoAppTheme
49+ import com.gravatar.demoapp.ui.components.GravatarEmailInput
5050import com.gravatar.demoapp.ui.components.ProfileCard
5151import com.gravatar.demoapp.ui.model.SettingsState
5252import com.gravatar.emailAddressToGravatarUrl
@@ -66,13 +66,12 @@ fun DemoGravatarApp() {
6666 snackbarHost = { SnackbarHost (hostState = snackbarHostState) },
6767 ) { innerPadding ->
6868 val defaultErrorMessage = stringResource(R .string.snackbar_unknown_error_message)
69-
7069 GravatarTabs (
7170 modifier = Modifier .padding(innerPadding),
7271 gravatarUrl,
7372 { gravatarUrl = it },
74- ) { errorMessage , exception ->
75- onError (scope, snackbarHostState, errorMessage , exception, defaultErrorMessage)
73+ ) { message , exception ->
74+ showSnackBar (scope, snackbarHostState, message , exception, defaultErrorMessage)
7675 }
7776 }
7877 }
@@ -94,17 +93,17 @@ val defaultAvatarImages by lazy {
9493 )
9594}
9695
97- private fun onError (
96+ private fun showSnackBar (
9897 scope : CoroutineScope ,
9998 snackbarHostState : SnackbarHostState ,
100- errorMessage : String? ,
99+ message : String? ,
101100 throwable : Throwable ? ,
102- defaultErrorMessage : String ,
101+ defaultMessage : String ,
103102) {
104- Log .e(" DemoGravatarApp" , " ${errorMessage .orEmpty()} \n ${throwable?.stackTraceToString().orEmpty()} " )
103+ Log .e(" DemoGravatarApp" , " ${message .orEmpty()} \n ${throwable?.stackTraceToString().orEmpty()} " )
105104 scope.launch {
106105 snackbarHostState.showSnackbar(
107- message = errorMessage ? : throwable?.message ? : defaultErrorMessage ,
106+ message = message ? : throwable?.message ? : defaultMessage ,
108107 duration = SnackbarDuration .Short ,
109108 )
110109 }
@@ -115,11 +114,15 @@ private fun GravatarTabs(
115114 modifier : Modifier = Modifier ,
116115 gravatarUrl : String ,
117116 onGravatarUrlChanged : (String ) -> Unit ,
118- onError : (String? , Throwable ? ) -> Unit ,
117+ showSnackBar : (String? , Throwable ? ) -> Unit ,
119118) {
120119 var tabIndex by remember { mutableStateOf(0 ) }
121120
122- val tabs = listOf (stringResource(R .string.tab_label_avatar), stringResource(R .string.tab_label_profile))
121+ val tabs = listOf (
122+ stringResource(R .string.tab_label_avatar),
123+ stringResource(R .string.tab_label_profile),
124+ stringResource(R .string.tab_label_avatar_update),
125+ )
123126
124127 Column (modifier = Modifier .fillMaxSize()) {
125128 TabRow (selectedTabIndex = tabIndex) {
@@ -132,8 +135,9 @@ private fun GravatarTabs(
132135 }
133136 }
134137 when (tabIndex) {
135- 0 -> AvatarTab (modifier, gravatarUrl, onGravatarUrlChanged, onError)
136- 1 -> ProfileTab (modifier, onError)
138+ 0 -> AvatarTab (modifier, gravatarUrl, onGravatarUrlChanged, showSnackBar)
139+ 1 -> ProfileTab (modifier, showSnackBar)
140+ 2 -> AvatarUpdateTab (showSnackBar, modifier)
137141 }
138142 }
139143}
@@ -194,9 +198,13 @@ private fun ProfileTab(modifier: Modifier = Modifier, onError: (String?, Throwab
194198 if (! loading && error.isEmpty() && profiles.entry.size > 0 ) {
195199 ProfileCard (
196200 profiles.entry.first(),
197- Modifier .clip(
198- RoundedCornerShape (8 .dp),
199- ).background(MaterialTheme .colorScheme.surfaceContainer).fillMaxWidth().padding(16 .dp),
201+ Modifier
202+ .clip(
203+ RoundedCornerShape (8 .dp),
204+ )
205+ .background(MaterialTheme .colorScheme.surfaceContainer)
206+ .fillMaxWidth()
207+ .padding(16 .dp),
200208 )
201209 } else {
202210 if (error.isNotEmpty()) {
@@ -327,14 +335,3 @@ fun GravatarImage(gravatarUrl: String, onError: (String?, Throwable?) -> Unit) {
327335 contentDescription = " " ,
328336 )
329337}
330-
331- @Composable
332- fun GravatarEmailInput (email : String , onValueChange : (String ) -> Unit , modifier : Modifier = Modifier ) {
333- TextField (
334- value = email,
335- onValueChange = onValueChange,
336- label = { Text (stringResource(R .string.gravatar_email_input_label)) },
337- maxLines = 1 ,
338- modifier = modifier,
339- )
340- }
0 commit comments