diff --git a/android/app/src/main/java/com/naviapp/lending_permission/ui/LendingPermissionActivity.kt b/android/app/src/main/java/com/naviapp/lending_permission/ui/LendingPermissionActivity.kt index b23a1809f6..47a64d67ad 100644 --- a/android/app/src/main/java/com/naviapp/lending_permission/ui/LendingPermissionActivity.kt +++ b/android/app/src/main/java/com/naviapp/lending_permission/ui/LendingPermissionActivity.kt @@ -12,13 +12,19 @@ import android.os.Bundle import androidx.activity.compose.setContent import androidx.activity.viewModels import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll +import androidx.compose.material.ExperimentalMaterialApi +import androidx.compose.material.ModalBottomSheetLayout +import androidx.compose.material.ModalBottomSheetValue +import androidx.compose.material.rememberModalBottomSheetState import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -29,6 +35,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.navi.ap.utils.constants.BOTTOM_SHEET_TOP_CORNER_RADIUS import com.navi.ap.utils.constants.PL import com.navi.base.model.CtaData import com.navi.base.sharedpref.PreferenceManager @@ -50,12 +58,14 @@ import com.naviapp.common.navigator.NaviDeepLinkNavigator import com.naviapp.lending_permission.model.LendingPermissionScreenResponse import com.naviapp.lending_permission.model.PermissionNotGrantedCardWidget import com.naviapp.lending_permission.model.PermissionWidget +import com.naviapp.lending_permission.model.ScreenContent import com.naviapp.lending_permission.viewmodel.LendingPermissionViewModel import com.naviapp.manager.usecase.UserDataUploadWorkerUseCase import com.naviapp.personalloanrevamp.manageLoan.NetworkResponseState import com.naviapp.personalloanrevamp.manageLoan.composables.ContentShimmer import com.naviapp.personalloanrevamp.models.LoanDetailsV2WidgetType import com.naviapp.utils.Constants +import com.naviapp.utils.Constants.DISMISS_BOTTOMSHEET import com.naviapp.utils.Constants.LENDING_PERMISSION_PAGE_LANDS import com.naviapp.utils.Constants.LENDING_PERMISSION_SCREEN import com.naviapp.utils.Constants.ON_SYSTEM_BACK_PRESSED @@ -77,7 +87,6 @@ class LendingPermissionActivity : BaseActivity() { setContent { LendingPermissionScreen(viewModel, this) } } - @SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") @Composable fun LendingPermissionScreen( viewModel: LendingPermissionViewModel, @@ -100,11 +109,21 @@ class LendingPermissionActivity : BaseActivity() { } is CtaAction -> { val ctaData = uiTronAction.ctaData ?: CtaData() - NaviDeepLinkNavigator.navigate( - activity, - ctaData = ctaData, - finish = ctaData.finish - ) + when (ctaData.type) { + LoanDetailsV2WidgetType.LENDING_PERMISSION_KNOW_MORE_WIDGET.value -> { + viewModel.setBottomsheetType(ctaData.type) + } + DISMISS_BOTTOMSHEET -> { + viewModel.setBottomSheetState(false) + } + else -> { + NaviDeepLinkNavigator.navigate( + activity, + ctaData = ctaData, + finish = ctaData.finish + ) + } + } } } } @@ -126,12 +145,7 @@ class LendingPermissionActivity : BaseActivity() { eventName = LENDING_PERMISSION_PAGE_LANDS, verticalType = intent.getStringExtra(VERTICAL_TYPE) ) - Scaffold( - modifier = Modifier.fillMaxSize(), - topBar = { SetHeaderWidget(lendingPermissionScreenDataState, viewModel) }, - bottomBar = { SetFooterWidget(lendingPermissionScreenDataState, viewModel) }, - content = { SetContentWidgets(lendingPermissionScreenDataState, viewModel) } - ) + RenderScaffold(lendingPermissionScreenDataState, viewModel) } is NetworkResponseState.Error -> {} } @@ -207,6 +221,66 @@ class LendingPermissionActivity : BaseActivity() { } } + @OptIn(ExperimentalMaterialApi::class) + @SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") + @Composable + private fun RenderScaffold( + lendingPermissionScreenDataState: NetworkResponseState, + viewModel: LendingPermissionViewModel + ) { + + val bottomSheetState = + rememberModalBottomSheetState( + initialValue = ModalBottomSheetValue.Hidden, + skipHalfExpanded = true + ) + val showBottomSheet = viewModel.showBottomSheet.collectAsStateWithLifecycle().value + + LaunchedEffect(bottomSheetState.isVisible) { + if (!bottomSheetState.isVisible) { + viewModel.setBottomSheetState(false) + } + } + + LaunchedEffect(showBottomSheet) { + when (showBottomSheet) { + true -> { + bottomSheetState.show() + } + false -> { + bottomSheetState.hide() + } + } + } + + ModalBottomSheetLayout( + sheetContent = { + val bottomsheetType = viewModel.bottomsheetType.collectAsState().value + val contentState = + viewModel.lendingPermissionScreenData.collectAsStateWithLifecycle().value + if (contentState is NetworkResponseState.Success) { + val bottomSheetData = contentState.data?.screenStructure?.content + bottomSheetData?.let { RenderUiTronBottomsheet(it, bottomsheetType, viewModel) } + } + }, + sheetState = bottomSheetState, + sheetShape = + RoundedCornerShape( + topStart = BOTTOM_SHEET_TOP_CORNER_RADIUS, + topEnd = BOTTOM_SHEET_TOP_CORNER_RADIUS + ) + ) { + Box(modifier = Modifier.fillMaxSize()) { + Scaffold( + modifier = Modifier.fillMaxSize(), + topBar = { SetHeaderWidget(lendingPermissionScreenDataState, viewModel) }, + bottomBar = { SetFooterWidget(lendingPermissionScreenDataState, viewModel) }, + content = { SetContentWidgets(lendingPermissionScreenDataState, viewModel) } + ) + } + } + } + @Composable private fun SetFooterWidget( lendingPermissionScreenDataState: NetworkResponseState, @@ -234,6 +308,22 @@ class LendingPermissionActivity : BaseActivity() { .Render(composeViews = uiTronResponse?.parentComposeView.orEmpty()) } + @Composable + fun RenderUiTronBottomsheet( + content: ScreenContent, + bottomsheetType: String?, + viewModel: LendingPermissionViewModel + ) { + content.widgets?.forEach { + if (it?.widgetType == bottomsheetType) { + val widgetData = (it as PermissionNotGrantedCardWidget).uiTronWidget + UiTronRenderer(widgetData?.data, viewModel) + .Render(composeViews = widgetData?.parentComposeView.orEmpty()) + return + } + } + } + override fun onBackPressed() { super.onBackPressed() analyticsTracker.lendingPermissionEvent( diff --git a/android/app/src/main/java/com/naviapp/lending_permission/viewmodel/LendingPermissionViewModel.kt b/android/app/src/main/java/com/naviapp/lending_permission/viewmodel/LendingPermissionViewModel.kt index 820f149e76..fa619a4ec7 100644 --- a/android/app/src/main/java/com/naviapp/lending_permission/viewmodel/LendingPermissionViewModel.kt +++ b/android/app/src/main/java/com/naviapp/lending_permission/viewmodel/LendingPermissionViewModel.kt @@ -26,6 +26,7 @@ import javax.inject.Inject import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch @HiltViewModel class LendingPermissionViewModel @@ -51,6 +52,12 @@ constructor( ) val submitPermission = _submitPermission.asStateFlow() + private val _showBottomSheet = MutableStateFlow(false) + val showBottomSheet = _showBottomSheet.asStateFlow() + + private val _bottomsheetType = MutableStateFlow(null) + val bottomsheetType = _bottomsheetType.asStateFlow() + fun fetchLendingPermissionScreenResponse(screenId: String, verticalType: String) { viewModelScope.safeLaunch(Dispatchers.IO) { _lendingPermissionScreenData.emit(NetworkResponseState.Loading()) @@ -75,6 +82,21 @@ constructor( } } + fun setBottomsheetType(type: String?) { + viewModelScope.launch { + _bottomsheetType.emit(type) + setBottomSheetState(true) + } + } + + fun setBottomSheetState(show: Boolean) { + viewModelScope.launch { _showBottomSheet.emit(show) } + } + + fun getBottomSheetState(): Boolean { + return _showBottomSheet.value + } + fun uploadUserData(screenName: String) { val isReadSmsPermissionGranted = isReadSmsPermissionGranted(context) if (isReadSmsPermissionGranted) { diff --git a/android/app/src/main/java/com/naviapp/personalloanrevamp/models/LoanDetailsV2WidgetType.kt b/android/app/src/main/java/com/naviapp/personalloanrevamp/models/LoanDetailsV2WidgetType.kt index c0a604cc2a..ca9ff0c5c4 100644 --- a/android/app/src/main/java/com/naviapp/personalloanrevamp/models/LoanDetailsV2WidgetType.kt +++ b/android/app/src/main/java/com/naviapp/personalloanrevamp/models/LoanDetailsV2WidgetType.kt @@ -1,6 +1,6 @@ /* * - * * Copyright © 2022-2023 by Navi Technologies Limited + * * Copyright © 2022-2024 by Navi Technologies Limited * * All rights reserved. Strictly confidential * */ @@ -48,5 +48,6 @@ enum class LoanDetailsV2WidgetType(val value: String) { LOAN_WITH_EMI_TENURE("LOAN_WITH_EMI_TENURE"), RADIO_BUTTON_WITH_NOTE_WIDGET("RADIO_BUTTON_WITH_NOTE_WIDGET"), LENDING_PERMISSION_WIDGET("LENDING_PERMISSION_WIDGET"), - LENDING_PERMISSION_NOT_GRANTED_CARD_WIDGET("LENDING_PERMISSION_NOT_GRANTED_CARD_WIDGET") + LENDING_PERMISSION_NOT_GRANTED_CARD_WIDGET("LENDING_PERMISSION_NOT_GRANTED_CARD_WIDGET"), + LENDING_PERMISSION_KNOW_MORE_WIDGET("LENDING_PERMISSION_KNOW_MORE_WIDGET") } diff --git a/android/app/src/main/java/com/naviapp/utils/CustomJsonDeserializers.kt b/android/app/src/main/java/com/naviapp/utils/CustomJsonDeserializers.kt index cd33079f73..4cfd3be9d1 100644 --- a/android/app/src/main/java/com/naviapp/utils/CustomJsonDeserializers.kt +++ b/android/app/src/main/java/com/naviapp/utils/CustomJsonDeserializers.kt @@ -177,7 +177,8 @@ class WidgetConfigDeserializer : JsonDeserializer { LoanDetailsV2WidgetType.LENDING_PERMISSION_WIDGET.value -> { context?.deserialize(jsonObject, PermissionWidget::class.java) } - LoanDetailsV2WidgetType.LENDING_PERMISSION_NOT_GRANTED_CARD_WIDGET.value -> { + LoanDetailsV2WidgetType.LENDING_PERMISSION_NOT_GRANTED_CARD_WIDGET.value, + LoanDetailsV2WidgetType.LENDING_PERMISSION_KNOW_MORE_WIDGET.value -> { context?.deserialize(jsonObject, PermissionNotGrantedCardWidget::class.java) } else -> {