diff --git a/app/src/main/java/ai/travel/app/home/HomeViewModel.kt b/app/src/main/java/ai/travel/app/home/HomeViewModel.kt index 48841e3..563ad6e 100644 --- a/app/src/main/java/ai/travel/app/home/HomeViewModel.kt +++ b/app/src/main/java/ai/travel/app/home/HomeViewModel.kt @@ -13,6 +13,7 @@ import ai.travel.app.tripDetails.TimeSlot import android.app.Application import android.icu.util.Calendar import android.util.Base64 +import android.widget.Toast import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -44,6 +45,7 @@ class HomeViewModel @Inject constructor( private val repository: ApiService, private val dbRepository: DatabaseRepo, ) : AndroidViewModel(application) { + val context = application.applicationContext private val _imageState = MutableStateFlow(ApiState.NotStarted) val imageState: StateFlow = _imageState.asStateFlow() @@ -314,6 +316,7 @@ class HomeViewModel @Inject constructor( _imageState.value = ApiState.ReceivedPhoto _geoCodesData.value = mutableListOf() } catch (e: Exception) { + _imageState.value = ApiState.Error(e) println("EException is $e") } } diff --git a/app/src/main/java/ai/travel/app/home/ui/NewHomeScreen.kt b/app/src/main/java/ai/travel/app/home/ui/NewHomeScreen.kt index cf1b7fa..77ad1d5 100644 --- a/app/src/main/java/ai/travel/app/home/ui/NewHomeScreen.kt +++ b/app/src/main/java/ai/travel/app/home/ui/NewHomeScreen.kt @@ -33,10 +33,14 @@ import androidx.compose.material3.BottomAppBar import androidx.compose.material3.BottomSheetScaffold import androidx.compose.material3.BottomSheetScaffoldState import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ModalDrawerSheet import androidx.compose.material3.Scaffold import androidx.compose.material3.SheetState import androidx.compose.material3.SheetValue +import androidx.compose.material3.Snackbar +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text import androidx.compose.material3.rememberBottomSheetScaffoldState import androidx.compose.runtime.Composable @@ -50,6 +54,7 @@ import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -63,8 +68,10 @@ import androidx.navigation.NavController import com.airbnb.lottie.compose.LottieAnimation import com.airbnb.lottie.compose.LottieCompositionSpec import com.airbnb.lottie.compose.rememberLottieComposition +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.delay import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch @OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class) @Composable @@ -182,7 +189,13 @@ fun NewHomeScreen( Column(horizontalAlignment = Alignment.CenterHorizontally) { when (state.value) { is ApiState.Error -> { - + val errorMessage = (state.value as ApiState.Error).exception.message + ErrorHandler( + errorMessage = errorMessage, + onDismiss = { + viewModel.isAnimationVisible.value = false + } + ) } is ApiState.Loaded -> { @@ -282,4 +295,32 @@ fun NewHomeScreen( } } } +} + +@Composable +fun ErrorHandler( + errorMessage: String?, + onDismiss: () -> Unit, + snackbarHostState: SnackbarHostState = remember { SnackbarHostState() }, + coroutineScope: CoroutineScope = rememberCoroutineScope() +) { + if (!errorMessage.isNullOrEmpty()) { + LaunchedEffect(errorMessage) { + coroutineScope.launch { + snackbarHostState.showSnackbar(errorMessage) + onDismiss() + } + } + } + + SnackbarHost( + hostState = snackbarHostState, + snackbar = { snackbarData -> + Snackbar( + modifier = Modifier.padding(16.dp), + content = { Text(text = snackbarData.visuals.message, color = textColor)}, + containerColor = CardBackground, + ) + } + ) } \ No newline at end of file diff --git a/app/src/main/java/ai/travel/app/home/ui/PersonalRoutes.kt b/app/src/main/java/ai/travel/app/home/ui/PersonalRoutes.kt index ef41a15..73e0e80 100644 --- a/app/src/main/java/ai/travel/app/home/ui/PersonalRoutes.kt +++ b/app/src/main/java/ai/travel/app/home/ui/PersonalRoutes.kt @@ -117,7 +117,8 @@ fun NewRouteCard( .padding(16.dp) .clickable(interactionSource = MutableInteractionSource(), indication = null, onClick = { - if (items <= 3) { + println("items is $items") + if (items <= 30) { navController.navigate(Screens.NewTrip.route) } else { navController.navigate(Screens.PremiumScreen.route) diff --git a/app/src/main/java/ai/travel/app/newTrip/NewTripScreen.kt b/app/src/main/java/ai/travel/app/newTrip/NewTripScreen.kt index ff5b566..5283793 100644 --- a/app/src/main/java/ai/travel/app/newTrip/NewTripScreen.kt +++ b/app/src/main/java/ai/travel/app/newTrip/NewTripScreen.kt @@ -615,7 +615,7 @@ fun NewTripScreen( Button( onClick = { - if (totalTrips.value.size <= 1) { + if (totalTrips.value.size <= 30) { if (homeViewModel.tripName.value.text.isNotEmpty() && homeViewModel.source.value.text.isNotEmpty() && homeViewModel.destination.value.text.isNotEmpty() && homeViewModel.tripBudget.value.text.isNotEmpty()