diff --git a/app/src/main/java/org/tasks/billing/PurchaseActivity.kt b/app/src/main/java/org/tasks/billing/PurchaseActivity.kt index def647a8d..a47a85fc4 100644 --- a/app/src/main/java/org/tasks/billing/PurchaseActivity.kt +++ b/app/src/main/java/org/tasks/billing/PurchaseActivity.kt @@ -4,10 +4,15 @@ import android.os.Bundle import androidx.activity.compose.BackHandler import androidx.activity.compose.setContent import androidx.appcompat.app.AppCompatActivity +import androidx.compose.material3.SnackbarDuration +import androidx.compose.material3.SnackbarHostState +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel import dagger.hilt.android.AndroidEntryPoint +import org.tasks.R import org.tasks.compose.PurchaseText.SubscriptionScreen import org.tasks.extensions.Context.findActivity import org.tasks.themes.TasksTheme @@ -31,6 +36,7 @@ class PurchaseActivity : AppCompatActivity(), OnPurchasesUpdated { val viewModel: PurchaseActivityViewModel = viewModel() val state = viewModel.viewState.collectAsStateWithLifecycle().value val context = LocalContext.current + val snackbarHostState = remember { SnackbarHostState() } SubscriptionScreen( nameYourPrice = state.nameYourPrice, sliderPosition = state.price, @@ -41,7 +47,18 @@ class PurchaseActivity : AppCompatActivity(), OnPurchasesUpdated { setPrice = { viewModel.setPrice(it) }, setNameYourPrice = { viewModel.setNameYourPrice(it) }, onBack = { finish() }, + snackbarHostState = snackbarHostState, ) + LaunchedEffect(state.error) { + if (state.error?.isNotBlank() == true) { + snackbarHostState.showSnackbar( + message = state.error, + actionLabel = context.getString(R.string.dismiss), + duration = SnackbarDuration.Long, + ) + viewModel.dismissError() + } + } } } } diff --git a/app/src/main/java/org/tasks/billing/PurchaseActivityViewModel.kt b/app/src/main/java/org/tasks/billing/PurchaseActivityViewModel.kt index 417bb789c..3d32c30c6 100644 --- a/app/src/main/java/org/tasks/billing/PurchaseActivityViewModel.kt +++ b/app/src/main/java/org/tasks/billing/PurchaseActivityViewModel.kt @@ -102,6 +102,10 @@ class PurchaseActivityViewModel @Inject constructor( _viewState.update { it.copy(nameYourPrice = nameYourPrice) } } + fun dismissError() { + _viewState.update { it.copy(error = null) } + } + companion object { const val EXTRA_GITHUB = "extra_github" const val EXTRA_NAME_YOUR_PRICE = "extra_name_your_price" diff --git a/app/src/main/java/org/tasks/compose/Subscription.kt b/app/src/main/java/org/tasks/compose/Subscription.kt index e6313acaf..e69e1a39d 100644 --- a/app/src/main/java/org/tasks/compose/Subscription.kt +++ b/app/src/main/java/org/tasks/compose/Subscription.kt @@ -35,10 +35,13 @@ import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Scaffold import androidx.compose.material3.Slider import androidx.compose.material3.SliderDefaults +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -138,6 +141,7 @@ object PurchaseText { nameYourPrice: Boolean, sliderPosition: Float, github: Boolean = false, + snackbarHostState: SnackbarHostState = remember { SnackbarHostState() }, setPrice: (Float) -> Unit, setNameYourPrice: (Boolean) -> Unit, subscribe: (Int, Boolean) -> Unit, @@ -166,6 +170,7 @@ object PurchaseText { ) ) }, + snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, ) { paddingValues -> Column( modifier = Modifier