bottom sheet handled for loan details (#7653)

This commit is contained in:
Kishan Kumar
2023-08-29 13:58:15 +05:30
committed by GitHub
parent a791d28bfb
commit 71a6bc90ca
3 changed files with 65 additions and 67 deletions

View File

@@ -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

View File

@@ -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
)
}
}
}

View File

@@ -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())
}