Skip to content

Commit

Permalink
[#102] Update the method of showing global dialog with actions
Browse files Browse the repository at this point in the history
  • Loading branch information
kaungkhantsoe committed Aug 25, 2023
1 parent e38967c commit d68a173
Show file tree
Hide file tree
Showing 6 changed files with 75 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,22 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties
import co.nimblehq.compose.crypto.ui.theme.*

@Composable
fun AppDialogPopUp(
onDismiss: () -> Unit,
onClick: () -> Unit,
title: String,
message: String,
actionText: String,
actions: List<DialogActionModel>,
onClickAction: () -> Unit
) {
Dialog(
onDismissRequest = onDismiss
onDismissRequest = onDismiss,
properties = DialogProperties(
dismissOnClickOutside = false
)
) {
Surface {
Column(
Expand All @@ -36,34 +40,50 @@ fun AppDialogPopUp(
color = AppTheme.colors.text,
modifier = Modifier.padding(Dp16)
)
TextButton(
onClick = onClick,
Row(
modifier = Modifier
.align(Alignment.End)
.padding(bottom = Dp16, end = Dp8)
) {
Text(
text = actionText,
style = AppTheme.styles.semiBold16,
color = AppTheme.colors.dialogText,
)
actions.forEach {
TextButton(
onClick = {
it.onClickAction()
onClickAction()
},
) {
Text(
text = it.actionText,
style = AppTheme.styles.semiBold16,
color = AppTheme.colors.dialogText,
)
}
}
}
}
}
}
}

data class DialogActionModel(
val actionText: String,
val onClickAction: () -> Unit
)

@Composable
@Preview(showSystemUi = true)
fun AppDialogPopUpPreview() {
ComposeTheme {
Box {
AppDialogPopUp(
onDismiss = { /*TODO*/ },
onClick = { /*TODO*/ },
onDismiss = {},
message = "No internet connection was found. Please check your internet connection and try again.",
actionText = "OK",
title = "Oops!"
title = "Oops!",
actions = listOf(DialogActionModel(
actionText = "OK",
onClickAction = {}
)),
onClickAction = {}
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,47 +6,50 @@ import androidx.navigation.*
import androidx.navigation.compose.*
import co.nimblehq.compose.crypto.R
import co.nimblehq.compose.crypto.ui.common.AppDialogPopUp
import co.nimblehq.compose.crypto.ui.common.DialogActionModel
import co.nimblehq.compose.crypto.ui.screens.detail.DetailScreen
import co.nimblehq.compose.crypto.ui.screens.home.HomeScreen

@Composable
fun AppNavigation(
navController: NavHostController,
startDestination: String = AppDestination.Home.destination,
onCallBackChange: (() -> Unit) -> Unit,
globalDialogCallback: () -> Unit
) {

var dialogActions: List<DialogActionModel> = emptyList()

NavHost(
navController = navController,
startDestination = startDestination
) {
composable(AppDestination.Home) {
HomeScreen(
navigator = { destination -> navController.navigate(destination) }
navigator = { destination -> navController.navigate(destination) },
onShowGlobalDialog = { actions ->
dialogActions = actions
}
)
}

composable(AppDestination.CoinDetail) {
DetailScreen(
navigator = { destination -> navController.navigate(destination) },
coinId = it.arguments?.getString(KEY_COIN_ID).orEmpty(),
onNetworkReconnected = { callback ->
onCallBackChange(callback)
onShowGlobalDialog = { actions ->
dialogActions = actions
}
)
}

dialog(AppDestination.NoNetwork.route) {
AppDialogPopUp(
onDismiss = { navController.popBackStack() },
onClick = {
onClickAction = {
navController.popBackStack()
globalDialogCallback()
},
message = stringResource(id = R.string.no_internet_message),
actionText = stringResource(id = android.R.string.ok),
title = stringResource(id = R.string.no_internet_title)
title = stringResource(id = R.string.no_internet_title),
actions = dialogActions
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ fun ComposeCryptoApp(
navController: NavHostController = rememberNavController(),
cryptoAppState: CryptoAppState
) {
var globalDialogCallback: () -> Unit = {}
val context = LocalContext.current

cryptoAppState.isNetworkConnected.collectAsEffect { isNetworkConnected ->
Expand All @@ -34,12 +33,6 @@ fun ComposeCryptoApp(
}

AppNavigation(
navController = navController,
onCallBackChange = {
globalDialogCallback = it
},
globalDialogCallback = {
globalDialogCallback.invoke()
},
navController = navController
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import co.nimblehq.compose.crypto.data.extension.orZero
import co.nimblehq.compose.crypto.domain.model.CoinPrice
import co.nimblehq.compose.crypto.extension.toFormattedString
import co.nimblehq.compose.crypto.lib.IsLoading
import co.nimblehq.compose.crypto.ui.common.DialogActionModel
import co.nimblehq.compose.crypto.ui.common.price.PriceChangeButton
import co.nimblehq.compose.crypto.ui.components.chartintervals.ChartIntervalsButtonGroup
import co.nimblehq.compose.crypto.ui.components.chartintervals.TimeIntervals
Expand Down Expand Up @@ -54,7 +55,7 @@ fun DetailScreen(
viewModel: DetailViewModel = hiltViewModel(),
navigator: (destination: AppDestination) -> Unit,
coinId: String,
onNetworkReconnected: (() -> Unit) -> Unit
onShowGlobalDialog: (dialogActions: List<DialogActionModel>) -> Unit
) {
val context = LocalContext.current
LaunchedEffect(Unit) {
Expand Down Expand Up @@ -85,9 +86,20 @@ fun DetailScreen(
viewModel.input.getCoinId(coinId = coinId)
}

onNetworkReconnected {
viewModel.input.getCoinId(coinId = coinId)
}
onShowGlobalDialog(
listOf(
DialogActionModel(
actionText = stringResource(id = android.R.string.ok),
onClickAction = {}
),
DialogActionModel(
actionText = stringResource(id = R.string.detail_dialog_action_retry),
onClickAction = {
viewModel.input.getCoinId(coinId = coinId)
}
)
)
)
}

@Suppress("LongMethod", "LongParameterList")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import co.nimblehq.compose.crypto.R
import co.nimblehq.compose.crypto.extension.boxShadow
import co.nimblehq.compose.crypto.lib.IsLoading
import co.nimblehq.compose.crypto.ui.base.LoadingState
import co.nimblehq.compose.crypto.ui.common.DialogActionModel
import co.nimblehq.compose.crypto.ui.navigation.AppDestination
import co.nimblehq.compose.crypto.ui.preview.HomeScreenParams
import co.nimblehq.compose.crypto.ui.preview.HomeScreenPreviewParameterProvider
Expand All @@ -41,6 +42,7 @@ const val TestTagCoinsLoader = "CoinsLoader"
fun HomeScreen(
viewModel: HomeViewModel = hiltViewModel(),
navigator: (destination: AppDestination) -> Unit,
onShowGlobalDialog: (dialogActions: List<DialogActionModel>) -> Unit
) {

val context = LocalContext.current
Expand Down Expand Up @@ -87,6 +89,15 @@ fun HomeScreen(
onRefresh = { viewModel.input.loadData(isRefreshing = true) },
onTrendingCoinsLoadMore = { viewModel.input.getTrendingCoins(loadMore = true) }
)

onShowGlobalDialog(
listOf(
DialogActionModel(
actionText = stringResource(id = android.R.string.ok),
onClickAction = {}
)
)
)
}

@OptIn(ExperimentalMaterialApi::class)
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
<string name="detail_market_cap_title">Market Cap</string>
<string name="detail_all_time_high_title">All Time High</string>
<string name="detail_all_time_low_title">All Time Low</string>
<string name="detail_dialog_action_retry">Retry</string>

<string name="portfolio_card_total_coin_label">Total Coins</string>
<string name="portfolio_card_today_profit_label">Today\'s Profit</string>
Expand Down

0 comments on commit d68a173

Please sign in to comment.