@@ -6,9 +6,9 @@ import androidx.compose.foundation.layout.Column
66import androidx.compose.foundation.layout.Row
77import androidx.compose.foundation.layout.Spacer
88import androidx.compose.foundation.layout.fillMaxSize
9- import androidx.compose.foundation.layout.fillMaxWidth
109import androidx.compose.foundation.layout.height
1110import androidx.compose.foundation.layout.padding
11+ import androidx.compose.foundation.layout.width
1212import androidx.compose.foundation.rememberScrollState
1313import androidx.compose.foundation.verticalScroll
1414import androidx.compose.material3.CircularProgressIndicator
@@ -26,7 +26,7 @@ import androidx.compose.ui.graphics.vector.ImageVector
2626import androidx.compose.ui.platform.LocalContext
2727import androidx.compose.ui.res.stringResource
2828import androidx.compose.ui.res.vectorResource
29- import com.ninecraft.booket.core.common.extensions.clickableSingle
29+ import com.ninecraft.booket.core.common.util.compareVersions
3030import com.ninecraft.booket.core.designsystem.DevicePreview
3131import com.ninecraft.booket.core.designsystem.component.ReedDivider
3232import com.ninecraft.booket.core.designsystem.theme.ReedTheme
@@ -35,10 +35,12 @@ import com.ninecraft.booket.core.ui.ReedScaffold
3535import com.ninecraft.booket.core.ui.component.ReedBackTopAppBar
3636import com.ninecraft.booket.core.ui.component.ReedDialog
3737import com.ninecraft.booket.feature.screens.SettingsScreen
38+ import com.ninecraft.booket.feature.settings.component.SettingItem
3839import com.ninecraft.booket.feature.settings.component.WithdrawConfirmationBottomSheet
3940import com.slack.circuit.codegen.annotations.CircuitInject
4041import dagger.hilt.android.components.ActivityRetainedComponent
4142import kotlinx.coroutines.launch
43+ import com.ninecraft.booket.core.designsystem.R as designR
4244
4345@OptIn(ExperimentalMaterial3Api ::class )
4446@CircuitInject(SettingsScreen ::class , ActivityRetainedComponent ::class )
@@ -62,6 +64,10 @@ internal fun SettingsUi(
6264 }.getOrNull() ? : " Unknown"
6365 }
6466
67+ val isUpdateAvailable = remember(appVersion, state.latestVersion) {
68+ compareVersions(state.latestVersion, appVersion) > 0
69+ }
70+
6571 ReedScaffold (
6672 modifier = modifier
6773 .fillMaxSize()
@@ -88,7 +94,7 @@ internal fun SettingsUi(
8894 },
8995 action = {
9096 Icon (
91- imageVector = ImageVector .vectorResource(id = com.ninecraft.booket.core.designsystem. R .drawable.ic_chevron_right),
97+ imageVector = ImageVector .vectorResource(id = designR .drawable.ic_chevron_right),
9298 contentDescription = " Right Chevron Icon" ,
9399 tint = Color .Unspecified ,
94100 )
@@ -101,7 +107,7 @@ internal fun SettingsUi(
101107 },
102108 action = {
103109 Icon (
104- imageVector = ImageVector .vectorResource(id = com.ninecraft.booket.core.designsystem. R .drawable.ic_chevron_right),
110+ imageVector = ImageVector .vectorResource(id = designR .drawable.ic_chevron_right),
105111 contentDescription = " Right Chevron Icon" ,
106112 tint = Color .Unspecified ,
107113 )
@@ -114,21 +120,36 @@ internal fun SettingsUi(
114120 },
115121 action = {
116122 Icon (
117- imageVector = ImageVector .vectorResource(id = com.ninecraft.booket.core.designsystem. R .drawable.ic_chevron_right),
123+ imageVector = ImageVector .vectorResource(id = designR .drawable.ic_chevron_right),
118124 contentDescription = " Right Chevron Icon" ,
119125 tint = Color .Unspecified ,
120126 )
121127 },
122128 )
123129 SettingItem (
124130 title = stringResource(R .string.settings_app_version),
125- isClickable = false ,
131+ isClickable = isUpdateAvailable,
132+ onItemClick = {
133+ state.eventSink(SettingsUiEvent .OnVersionClick )
134+ },
126135 action = {
127- Text (
128- text = appVersion,
129- style = ReedTheme .typography.body1Medium,
130- color = ReedTheme .colors.contentBrand,
131- )
136+ Row (
137+ verticalAlignment = Alignment .CenterVertically ,
138+ ) {
139+ Text (
140+ text = appVersion,
141+ style = ReedTheme .typography.body1Medium,
142+ color = ReedTheme .colors.contentBrand,
143+ )
144+ if (isUpdateAvailable) {
145+ Spacer (modifier = Modifier .width(ReedTheme .spacing.spacing2))
146+ Icon (
147+ imageVector = ImageVector .vectorResource(id = designR.drawable.ic_chevron_right),
148+ contentDescription = " Right Chevron Icon" ,
149+ tint = Color .Unspecified ,
150+ )
151+ }
152+ }
132153 },
133154 description = {
134155 Text (
@@ -199,46 +220,19 @@ internal fun SettingsUi(
199220 },
200221 )
201222 }
202- }
203- }
204-
205- @Composable
206- private fun SettingItem (
207- title : String ,
208- modifier : Modifier = Modifier ,
209- isClickable : Boolean = true,
210- onItemClick : () -> Unit = {},
211- action : @Composable () -> Unit = {},
212- description : @Composable () -> Unit = {},
213- ) {
214- val combinedModifier = if (isClickable) {
215- modifier
216- .fillMaxWidth()
217- .clickableSingle { onItemClick() }
218- } else {
219- modifier.fillMaxWidth()
220- }
221223
222- Column {
223- Row (
224- modifier = combinedModifier
225- .padding(
226- horizontal = ReedTheme .spacing.spacing5,
227- vertical = ReedTheme .spacing.spacing4,
228- ),
229- verticalAlignment = Alignment .CenterVertically ,
230- ) {
231- Column (
232- modifier = Modifier .weight(1f ),
233- ) {
234- Text (
235- text = title,
236- style = ReedTheme .typography.body1Medium,
237- color = ReedTheme .colors.contentPrimary,
238- )
239- description()
240- }
241- action()
224+ if (state.isOptionalUpdateDialogVisible) {
225+ ReedDialog (
226+ onDismissRequest = {
227+ state.eventSink(SettingsUiEvent .OnOptionalUpdateDialogDismiss )
228+ },
229+ title = stringResource(R .string.settings_optional_update_title),
230+ description = stringResource(R .string.settings_optional_update_message),
231+ confirmButtonText = stringResource(R .string.settings_optional_update_button_text),
232+ onConfirmRequest = {
233+ state.eventSink(SettingsUiEvent .OnUpdateButtonClick )
234+ },
235+ )
242236 }
243237 }
244238}
0 commit comments