diff --git a/android/app/src/main/java/com/naviapp/home/compose/activity/HomePageActivityMainScreen.kt b/android/app/src/main/java/com/naviapp/home/compose/activity/HomePageActivityMainScreen.kt index fe4f093dd1..24147d8487 100644 --- a/android/app/src/main/java/com/naviapp/home/compose/activity/HomePageActivityMainScreen.kt +++ b/android/app/src/main/java/com/naviapp/home/compose/activity/HomePageActivityMainScreen.kt @@ -40,6 +40,7 @@ import com.naviapp.dashboard.viewmodels.DashboardSharedVM import com.naviapp.home.common.handler.InitActionsHandler import com.naviapp.home.compose.components.BottomBarWithFabButton import com.naviapp.home.compose.components.HomePageNavHost +import com.naviapp.home.compose.components.HomeScreenBottomSheet import com.naviapp.home.compose.homescreen.onTabClick import com.naviapp.home.compose.model.InitiatePaymentFromComposeData import com.naviapp.home.compose.profile.ProfileScreen @@ -155,6 +156,8 @@ private fun InitHomeActivityScreen( } } + HomeScreenBottomSheet(viewModel = sharedVM) + NaviModalNavigationDrawer( drawerState = { drawerState }, modifier = Modifier.fillMaxSize(), diff --git a/android/app/src/main/java/com/naviapp/home/compose/components/HomeScreenBottomSheet.kt b/android/app/src/main/java/com/naviapp/home/compose/components/HomeScreenBottomSheet.kt new file mode 100644 index 0000000000..45d3a9bd77 --- /dev/null +++ b/android/app/src/main/java/com/naviapp/home/compose/components/HomeScreenBottomSheet.kt @@ -0,0 +1,129 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.naviapp.home.compose.components + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.navigationBarsPadding +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.BottomSheetDefaults +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ModalBottomSheet +import androidx.compose.material3.ModalBottomSheetProperties +import androidx.compose.material3.rememberModalBottomSheetState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.platform.LocalView +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.SecureFlagPolicy +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.navi.alfred.AlfredManager +import com.navi.ap.utils.constants.BOTTOM_SHEET_VISIBILITY +import com.navi.base.utils.orTrue +import com.navi.common.utils.Constants.HIDE +import com.navi.common.utils.getStatusBarHeight +import com.navi.uitron.render.UiTronRenderer +import com.navi.uitron.utils.hexToComposeColor +import com.naviapp.home.model.HpBottomSheetContent +import com.naviapp.home.model.HpBottomSheetRenderType +import com.naviapp.home.model.HpBottomSheetState +import com.naviapp.home.viewmodel.SharedVM + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun HomeScreenBottomSheet(viewModel: SharedVM) { + + val bottomSheetStateHolder by viewModel.bottomSheetStateHolder.collectAsStateWithLifecycle() + + val modalBottomSheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) + + // Hide bottom sheet using UiTronAction UpdateStateHandleActionV2 + LaunchedEffect(Unit) { + viewModel.handle.getStateFlow(BOTTOM_SHEET_VISIBILITY, null).collect { + if (it == HIDE) { + modalBottomSheetState.hide() + viewModel.updateBottomSheetState(state = HpBottomSheetState.Hidden) + viewModel.handle[BOTTOM_SHEET_VISIBILITY] = null + } + } + } + + LaunchedEffect(key1 = bottomSheetStateHolder.state) { + when (bottomSheetStateHolder.state) { + HpBottomSheetState.Visible -> { + modalBottomSheetState.show() + } + HpBottomSheetState.Hidden -> { + if (modalBottomSheetState.isVisible) { + modalBottomSheetState.hide() + } + } + } + } + + if (bottomSheetStateHolder.state != HpBottomSheetState.Hidden) { + bottomSheetStateHolder.let { + val statusBarHeight = with(LocalDensity.current) { getStatusBarHeight().toDp() } + ModalBottomSheet( + onDismissRequest = { + it.config?.onDismiss + viewModel.updateBottomSheetState(state = HpBottomSheetState.Hidden) + }, + dragHandle = null, + sheetState = modalBottomSheetState, + containerColor = it.config?.contentColor?.hexToComposeColor ?: Color.White, + shape = RoundedCornerShape(topStart = 8.dp, topEnd = 8.dp), + scrimColor = + it.config?.scrimColor?.hexToComposeColor ?: BottomSheetDefaults.ScrimColor, + modifier = Modifier.padding(top = statusBarHeight), + properties = + ModalBottomSheetProperties( + shouldDismissOnBackPress = it.config?.isCancellable.orTrue(), + isFocusable = true, + securePolicy = SecureFlagPolicy.Inherit + ), + windowInsets = WindowInsets(0, 0, 0, 0) + ) { + AlfredManager.setBottomSheetView(LocalView.current.rootView) + Column( + modifier = Modifier.navigationBarsPadding().padding(bottom = statusBarHeight) + ) { + BottomSheetContentRenderer(it.content, viewModel) + } + } + } + } +} + +@Composable +private fun BottomSheetContentRenderer(content: HpBottomSheetContent?, viewModel: SharedVM) { + when (content?.renderType) { + HpBottomSheetRenderType.NATIVE -> { + // Native bottom sheet content + when (content.composableType) { + // Handle different composable types here using HpBottomSheetComposableType enum + else -> Unit + } + } + HpBottomSheetRenderType.UI_TRON -> { + content.uiTronContent?.forEach { + UiTronRenderer( + dataMap = it.widgetData?.data, + viewModel, + ) + .Render(composeViews = it.widgetData?.parentComposeView ?: listOf()) + } + } + else -> Unit + } +} diff --git a/android/app/src/main/java/com/naviapp/home/model/HpBottomSheetStateHolder.kt b/android/app/src/main/java/com/naviapp/home/model/HpBottomSheetStateHolder.kt new file mode 100644 index 0000000000..863b9afb90 --- /dev/null +++ b/android/app/src/main/java/com/naviapp/home/model/HpBottomSheetStateHolder.kt @@ -0,0 +1,48 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.naviapp.home.model + +import androidx.compose.runtime.Stable +import com.navi.uitron.model.UiTronResponse +import com.naviapp.forge.model.WidgetModelDefinition + +@Stable +data class HpBottomSheetStateHolder( + val state: HpBottomSheetState, + val config: HpBottomSheetConfig? = null, + val content: HpBottomSheetContent? = null, +) + +@Stable +data class HpBottomSheetContent( + val composableType: HpBottomSheetComposableType? = null, + val renderType: HpBottomSheetRenderType? = null, + val uiTronContent: List>? = null, +) + +@Stable +data class HpBottomSheetConfig( + val isCancellable: Boolean? = true, + val contentColor: String? = null, + val scrimColor: String? = null, + val onDismiss: () -> Unit = {}, +) + +enum class HpBottomSheetState { + Visible, + Hidden, +} + +enum class HpBottomSheetRenderType { + UI_TRON, + NATIVE, +} + +enum class HpBottomSheetComposableType { + // Add different composable types here according to your use case +} diff --git a/android/app/src/main/java/com/naviapp/home/viewmodel/SharedVM.kt b/android/app/src/main/java/com/naviapp/home/viewmodel/SharedVM.kt index 81f82502fc..60945689cc 100644 --- a/android/app/src/main/java/com/naviapp/home/viewmodel/SharedVM.kt +++ b/android/app/src/main/java/com/naviapp/home/viewmodel/SharedVM.kt @@ -7,7 +7,6 @@ package com.naviapp.home.viewmodel -import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope import com.navi.common.viewmodel.BaseVM import com.naviapp.common.model.UiTronActionHandler @@ -15,7 +14,10 @@ import com.naviapp.home.compose.components.getNavigationItemsList import com.naviapp.home.model.BottomBarTabType import com.naviapp.home.model.BottomNavBarItemData import com.naviapp.home.model.BottomNavBarStateHolder -import com.naviapp.utils.Constants +import com.naviapp.home.model.HpBottomSheetConfig +import com.naviapp.home.model.HpBottomSheetContent +import com.naviapp.home.model.HpBottomSheetState +import com.naviapp.home.model.HpBottomSheetStateHolder import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject import kotlinx.coroutines.flow.MutableStateFlow @@ -26,12 +28,10 @@ import kotlinx.coroutines.launch @HiltViewModel class SharedVM @Inject constructor() : BaseVM() { - val homeStatusColor = MutableLiveData(Constants.HOME_STATUS_BAR_COLOR) - private val _uiTronActionHandler = MutableStateFlow(null) val uiTronActionHandler = _uiTronActionHandler.asStateFlow() - private val _insuranceTabFetchFlag = MutableStateFlow(false) + private val _insuranceTabFetchFlag = MutableStateFlow(false) val insuranceTabFetchFlag = _insuranceTabFetchFlag.asStateFlow() private val _selectedTabId = MutableStateFlow(BottomBarTabType.HOME.name) @@ -48,6 +48,15 @@ class SharedVM @Inject constructor() : BaseVM() { ) val bottomNavBarStateHolder = _bottomNavBarStateHolder.asStateFlow() + private val _bottomSheetStateHolder = + MutableStateFlow( + HpBottomSheetStateHolder( + state = HpBottomSheetState.Hidden, + ) + ) + + val bottomSheetStateHolder = _bottomSheetStateHolder.asStateFlow() + fun updateUiTronAction(uiTronActionHandler: UiTronActionHandler?) { _uiTronActionHandler.update { uiTronActionHandler } } @@ -83,4 +92,12 @@ class SharedVM @Inject constructor() : BaseVM() { } _bottomNavBarStateHolder.update { BottomNavBarStateHolder(currentState) } } + + fun updateBottomSheetState( + state: HpBottomSheetState, + config: HpBottomSheetConfig? = null, + content: HpBottomSheetContent? = null + ) { + _bottomSheetStateHolder.update { HpBottomSheetStateHolder(state, config, content) } + } }