bottom sheet handled for loan details (#7653)
This commit is contained in:
@@ -8,7 +8,6 @@
|
||||
package com.navi.ap.common.ui
|
||||
|
||||
import androidx.activity.compose.BackHandler
|
||||
import androidx.activity.compose.LocalOnBackPressedDispatcherOwner
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.runtime.MutableState
|
||||
@@ -24,7 +23,6 @@ import com.navi.ap.common.models.ApScreenDefinitionState
|
||||
import com.navi.ap.common.models.ApScreenDefinitionStructure
|
||||
import com.navi.ap.common.models.ApScreenStructure
|
||||
import com.navi.ap.common.models.WidgetModelDefinition
|
||||
import com.navi.ap.common.ui.renderer.ScaffoldRenderer
|
||||
import com.navi.ap.common.ui.renderer.ScreenRenderer
|
||||
import com.navi.ap.common.viewmodel.LambdaVM
|
||||
import com.navi.ap.network.model.ApplicationHashRequestBody
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.navi.ap.common.ui.renderer
|
||||
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.runtime.Composable
|
||||
@@ -27,30 +28,29 @@ import androidx.recyclerview.widget.RecyclerView
|
||||
import com.navi.ap.common.models.ApScreenDefinitionStructure
|
||||
import com.navi.ap.common.ui.nativeui.ComposeViewAdapter
|
||||
import com.navi.ap.common.viewmodel.LambdaVM
|
||||
import com.navi.ap.utils.UiTronWidgetRenderer
|
||||
import com.navi.common.utils.findFirstVisibleItemPosition
|
||||
import com.navi.uitron.render.UiTronRenderer
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
|
||||
@Composable
|
||||
fun StickyHeaderAndFooterRenderer(
|
||||
screenDefinitionStructure: ApScreenDefinitionStructure,
|
||||
viewModel: LambdaVM
|
||||
viewModel: LambdaVM,
|
||||
) {
|
||||
val localDensity = LocalDensity.current
|
||||
val context = LocalView.current.context
|
||||
var headerHeight by remember { mutableFloatStateOf(0f) }
|
||||
var animatedAlpha by remember { mutableFloatStateOf(0f) }
|
||||
val coroutineScope = rememberCoroutineScope()
|
||||
|
||||
val recyclerView = remember {
|
||||
mutableStateOf(
|
||||
RecyclerView(context).apply {
|
||||
isNestedScrollingEnabled = false
|
||||
setHasFixedSize(true)
|
||||
setRecycledViewPool(null)
|
||||
layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
|
||||
}
|
||||
)
|
||||
mutableStateOf(RecyclerView(context).apply {
|
||||
isNestedScrollingEnabled = false
|
||||
setHasFixedSize(true)
|
||||
setRecycledViewPool(null)
|
||||
layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
|
||||
})
|
||||
}
|
||||
|
||||
fun calculatePosition(scrollY: Float): Float {
|
||||
@@ -84,9 +84,12 @@ fun StickyHeaderAndFooterRenderer(
|
||||
.background(Color.White)
|
||||
) {
|
||||
val (header, content, footer, stickyHeader) = createRefs()
|
||||
|
||||
Row(modifier = Modifier
|
||||
.zIndex(1f)
|
||||
.background(Color.White)
|
||||
.zIndex(1.5f)
|
||||
.graphicsLayer {
|
||||
alpha = 1 - animatedAlpha
|
||||
}
|
||||
.onGloballyPositioned {
|
||||
headerHeight = localDensity.density * it.size.height.toFloat()
|
||||
}
|
||||
@@ -95,68 +98,56 @@ fun StickyHeaderAndFooterRenderer(
|
||||
start.linkTo(parent.start)
|
||||
end.linkTo(parent.end)
|
||||
}) {
|
||||
screenDefinitionStructure.screenData?.screenStructure?.header?.let { uiTronHeader ->
|
||||
UiTronRenderer(
|
||||
uiTronHeader.widgetData?.data,
|
||||
viewModel
|
||||
).Render(composeViews = uiTronHeader.widgetData?.parentComposeView.orEmpty())
|
||||
}
|
||||
UiTronWidgetRenderer(
|
||||
screenDefinitionStructure.screenData?.screenStructure?.header, viewModel
|
||||
)
|
||||
}
|
||||
|
||||
AndroidView(
|
||||
modifier = Modifier
|
||||
.constrainAs(content) {
|
||||
top.linkTo(header.bottom)
|
||||
start.linkTo(parent.start)
|
||||
end.linkTo(parent.end)
|
||||
bottom.linkTo(parent.bottom)
|
||||
width = Dimension.fillToConstraints
|
||||
height = Dimension.fillToConstraints
|
||||
},
|
||||
factory = { context ->
|
||||
recyclerView.value
|
||||
},
|
||||
update = {
|
||||
val adapter = ComposeViewAdapter(
|
||||
viewModel = viewModel,
|
||||
widgetList = screenDefinitionStructure.screenData?.screenStructure?.content?.widgets!!
|
||||
)
|
||||
recyclerView.value.adapter = adapter
|
||||
}
|
||||
)
|
||||
AndroidView(modifier = Modifier.constrainAs(content) {
|
||||
top.linkTo(header.bottom)
|
||||
start.linkTo(parent.start)
|
||||
end.linkTo(parent.end)
|
||||
bottom.linkTo(parent.bottom)
|
||||
width = Dimension.fillToConstraints
|
||||
height = Dimension.fillToConstraints
|
||||
}, factory = { context ->
|
||||
val adapter = ComposeViewAdapter(
|
||||
viewModel = viewModel,
|
||||
widgetList = screenDefinitionStructure.screenData?.screenStructure?.content?.widgets!!
|
||||
)
|
||||
adapter.stateRestorationPolicy = RecyclerView.Adapter.StateRestorationPolicy.ALLOW
|
||||
recyclerView.value.adapter = adapter
|
||||
recyclerView.value
|
||||
})
|
||||
|
||||
Row(modifier = Modifier.constrainAs(footer) {
|
||||
bottom.linkTo(parent.bottom, margin = 0.dp)
|
||||
start.linkTo(parent.start, margin = 0.dp)
|
||||
end.linkTo(parent.end, margin = 0.dp)
|
||||
}) {
|
||||
screenDefinitionStructure.screenData?.screenStructure?.footer?.let { uiTronHeader ->
|
||||
UiTronRenderer(
|
||||
uiTronHeader.widgetData?.data,
|
||||
viewModel
|
||||
).Render(composeViews = uiTronHeader.widgetData?.parentComposeView.orEmpty())
|
||||
}
|
||||
UiTronWidgetRenderer(
|
||||
screenDefinitionStructure.screenData?.screenStructure?.footer, viewModel
|
||||
)
|
||||
}
|
||||
|
||||
Row(
|
||||
modifier = Modifier
|
||||
.zIndex(1f)
|
||||
.graphicsLayer {
|
||||
alpha = animatedAlpha
|
||||
}
|
||||
.constrainAs(stickyHeader) {
|
||||
top.linkTo(header.top)
|
||||
start.linkTo(parent.start)
|
||||
end.linkTo(parent.end)
|
||||
width = Dimension.fillToConstraints
|
||||
height = Dimension.wrapContent
|
||||
}) {
|
||||
screenDefinitionStructure.screenData?.screenStructure?.content?.stickyWidget?.let { uiTronHeader ->
|
||||
UiTronRenderer(
|
||||
uiTronHeader.widgetData?.data,
|
||||
viewModel
|
||||
).Render(composeViews = uiTronHeader.widgetData?.parentComposeView.orEmpty())
|
||||
|
||||
Box(modifier = Modifier
|
||||
.background(Color.Transparent)
|
||||
.zIndex(1f)
|
||||
.graphicsLayer {
|
||||
alpha = animatedAlpha
|
||||
}
|
||||
.constrainAs(stickyHeader) {
|
||||
top.linkTo(header.top)
|
||||
start.linkTo(parent.start)
|
||||
end.linkTo(parent.end)
|
||||
width = Dimension.fillToConstraints
|
||||
height = Dimension.wrapContent
|
||||
}) {
|
||||
UiTronWidgetRenderer(
|
||||
screenDefinitionStructure.screenData?.screenStructure?.content?.stickyWidget,
|
||||
viewModel
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -10,6 +10,7 @@ package com.navi.ap.utils
|
||||
import android.content.Context
|
||||
import android.os.Bundle
|
||||
import android.view.inputmethod.InputMethodManager
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.ExperimentalComposeUiApi
|
||||
import androidx.compose.ui.platform.SoftwareKeyboardController
|
||||
import androidx.core.content.getSystemService
|
||||
@@ -20,6 +21,7 @@ import com.google.gson.Gson
|
||||
import com.google.gson.GsonBuilder
|
||||
import com.navi.ap.common.deserializer.CustomUiTronDataDeserializer
|
||||
import com.navi.ap.common.models.ApScreenDefinitionStructure
|
||||
import com.navi.ap.common.models.WidgetModelDefinition
|
||||
import com.navi.ap.common.viewmodel.LambdaVM
|
||||
import com.navi.ap.network.di.APNetworkModule.providesDeserializer
|
||||
import com.navi.ap.screens.genericscreen.vm.ApGenericScreenVM
|
||||
@@ -41,6 +43,7 @@ import com.navi.uitron.model.data.UiTronAction
|
||||
import com.navi.uitron.model.data.UiTronData
|
||||
import com.navi.uitron.model.ui.BaseProperty
|
||||
import com.navi.uitron.model.visualtransformation.VisualTransformationData
|
||||
import com.navi.uitron.render.UiTronRenderer
|
||||
import com.navi.uitron.serializer.ComposePropertySerializer
|
||||
import com.navi.uitron.serializer.UiTronDataSerializer
|
||||
import com.navi.uitron.serializer.UiTronValidationSerializer
|
||||
@@ -146,8 +149,8 @@ suspend fun cacheImages(uiTronResponse: UiTronResponse?) = withContext(Dispatche
|
||||
}
|
||||
|
||||
/**
|
||||
* Use this to extract value of field and result will be map<sourceProperty , value>
|
||||
**/
|
||||
* Use this to extract value of field and result will be map<sourceProperty , value>
|
||||
**/
|
||||
|
||||
fun getResolvedFieldValue(
|
||||
fields: List<FillApiData>?,
|
||||
@@ -174,4 +177,10 @@ fun getResolvedFieldValue(
|
||||
}
|
||||
}
|
||||
return map
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun UiTronWidgetRenderer(widget: WidgetModelDefinition<UiTronResponse>?, viewModel: LambdaVM) {
|
||||
UiTronRenderer(widget?.widgetData?.data, viewModel)
|
||||
.Render(composeViews = widget?.widgetData?.parentComposeView.orEmpty())
|
||||
}
|
||||
Reference in New Issue
Block a user