11package to.bitkit.ui.screens.contacts
22
3+ import androidx.compose.foundation.layout.Box
4+ import androidx.compose.foundation.layout.Column
5+ import androidx.compose.foundation.layout.fillMaxSize
6+ import androidx.compose.foundation.layout.padding
7+ import androidx.compose.foundation.layout.size
38import androidx.compose.runtime.Composable
49import androidx.compose.runtime.LaunchedEffect
510import androidx.compose.runtime.getValue
11+ import androidx.compose.ui.Alignment
12+ import androidx.compose.ui.Modifier
613import androidx.compose.ui.res.stringResource
714import androidx.compose.ui.tooling.preview.Preview
15+ import androidx.compose.ui.unit.dp
816import androidx.lifecycle.compose.collectAsStateWithLifecycle
917import kotlinx.collections.immutable.persistentListOf
1018import to.bitkit.R
1119import to.bitkit.ui.components.AddLinkSheet
1220import to.bitkit.ui.components.AddTagSheet
21+ import to.bitkit.ui.components.BodyM
1322import to.bitkit.ui.components.CenteredProfileHeader
23+ import to.bitkit.ui.components.GradientCircularProgressIndicator
1424import to.bitkit.ui.components.ProfileEditForm
1525import to.bitkit.ui.components.ProfileEditLink
26+ import to.bitkit.ui.components.SecondaryButton
27+ import to.bitkit.ui.components.VerticalSpacer
1628import to.bitkit.ui.scaffold.AppAlertDialog
1729import to.bitkit.ui.scaffold.AppTopBar
1830import to.bitkit.ui.scaffold.DrawerNavIcon
1931import to.bitkit.ui.scaffold.ScreenColumn
2032import to.bitkit.ui.theme.AppThemeSurface
33+ import to.bitkit.ui.theme.Colors
2134
2235@Composable
2336fun EditContactScreen (
@@ -39,6 +52,7 @@ fun EditContactScreen(
3952 Content (
4053 uiState = uiState,
4154 onBackClick = onBackClick,
55+ onRetryClick = { viewModel.retryLoadContact() },
4256 onNameChange = { viewModel.onNameChange(it) },
4357 onBioChange = { viewModel.onBioChange(it) },
4458 onRemoveLink = { viewModel.removeLink(it) },
@@ -60,6 +74,7 @@ fun EditContactScreen(
6074private fun Content (
6175 uiState : EditContactUiState ,
6276 onBackClick : () -> Unit ,
77+ onRetryClick : () -> Unit ,
6378 onNameChange : (String ) -> Unit ,
6479 onBioChange : (String ) -> Unit ,
6580 onRemoveLink : (Int ) -> Unit ,
@@ -82,32 +97,36 @@ private fun Content(
8297 actions = { DrawerNavIcon () },
8398 )
8499
85- ProfileEditForm (
86- name = uiState.name,
87- onNameChange = onNameChange,
88- publicKey = uiState.publicKey,
89- bio = uiState.bio,
90- onBioChange = onBioChange,
91- links = uiState.links,
92- onRemoveLink = onRemoveLink,
93- onAddLink = onAddLink,
94- tags = uiState.tags,
95- onRemoveTag = onRemoveTag,
96- onAddTag = onAddTag,
97- onSave = onSave,
98- onCancel = onBackClick,
99- isSaveEnabled = uiState.name.isNotBlank() && ! uiState.isSaving,
100- avatarContent = {
101- CenteredProfileHeader (
102- publicKey = uiState.publicKey,
103- name = " " ,
104- bio = " " ,
105- imageUrl = uiState.imageUrl,
106- )
107- },
108- onDelete = onDelete,
109- deleteLabel = stringResource(R .string.contacts__delete_contact),
110- )
100+ when {
101+ uiState.isLoading -> LoadingState ()
102+ uiState.isMissing -> EmptyState (onRetryClick = onRetryClick)
103+ else -> ProfileEditForm (
104+ name = uiState.name,
105+ onNameChange = onNameChange,
106+ publicKey = uiState.publicKey,
107+ bio = uiState.bio,
108+ onBioChange = onBioChange,
109+ links = uiState.links,
110+ onRemoveLink = onRemoveLink,
111+ onAddLink = onAddLink,
112+ tags = uiState.tags,
113+ onRemoveTag = onRemoveTag,
114+ onAddTag = onAddTag,
115+ onSave = onSave,
116+ onCancel = onBackClick,
117+ isSaveEnabled = uiState.name.isNotBlank() && ! uiState.isSaving,
118+ avatarContent = {
119+ CenteredProfileHeader (
120+ publicKey = uiState.publicKey,
121+ name = " " ,
122+ bio = " " ,
123+ imageUrl = uiState.imageUrl,
124+ )
125+ },
126+ onDelete = onDelete,
127+ deleteLabel = stringResource(R .string.contacts__delete_contact),
128+ )
129+ }
111130 }
112131
113132 if (uiState.showDeleteDialog) {
@@ -135,6 +154,34 @@ private fun Content(
135154 }
136155}
137156
157+ @Composable
158+ private fun LoadingState () {
159+ Box (
160+ contentAlignment = Alignment .Center ,
161+ modifier = Modifier .fillMaxSize()
162+ ) {
163+ GradientCircularProgressIndicator (modifier = Modifier .size(24 .dp))
164+ }
165+ }
166+
167+ @Composable
168+ private fun EmptyState (onRetryClick : () -> Unit ) {
169+ Column (
170+ horizontalAlignment = Alignment .CenterHorizontally ,
171+ modifier = Modifier
172+ .fillMaxSize()
173+ .padding(horizontal = 32 .dp)
174+ ) {
175+ VerticalSpacer (48 .dp)
176+ BodyM (text = stringResource(R .string.contacts__detail_empty_state), color = Colors .White64 )
177+ VerticalSpacer (16 .dp)
178+ SecondaryButton (
179+ text = stringResource(R .string.profile__retry_load),
180+ onClick = onRetryClick,
181+ )
182+ }
183+ }
184+
138185@Preview(showSystemUi = true )
139186@Composable
140187private fun Preview () {
@@ -152,6 +199,7 @@ private fun Preview() {
152199 isLoading = false ,
153200 ),
154201 onBackClick = {},
202+ onRetryClick = {},
155203 onNameChange = {},
156204 onBioChange = {},
157205 onRemoveLink = {},
0 commit comments