TP-40414 | Feature | Post purchase flow - KYC T&C Bottomsheet (#7792)
Co-authored-by: Himanshu Tanwar <himanshu.tanwar@navi.com>
This commit is contained in:
committed by
GitHub
parent
54005e6cb4
commit
0b3dc238fc
@@ -18,6 +18,8 @@ import android.view.View
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.appcompat.content.res.AppCompatResources
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.core.view.marginLeft
|
||||
import androidx.core.view.marginTop
|
||||
import androidx.core.widget.doOnTextChanged
|
||||
import androidx.databinding.DataBindingUtil
|
||||
import androidx.databinding.ViewDataBinding
|
||||
@@ -82,14 +84,27 @@ class PanDetailsInputWidgetLayout @JvmOverloads constructor(
|
||||
callback: ((cta: CtaData) -> Unit)?
|
||||
) {
|
||||
setTextInputFields(naviWidgetData.textInputFields, binding, callback)
|
||||
naviWidgetData.checkboxInputField?.let { checkboxInputField ->
|
||||
setCheckboxField(checkboxInputField, binding, callback)
|
||||
}
|
||||
naviWidgetData.dobInputField?.let { dobInputField ->
|
||||
setDobInputField(dobInputField, binding, callback)
|
||||
if(dobInputField.disabled == true) {
|
||||
binding.dateInputContainer.isVisible = false
|
||||
} else {
|
||||
setDobInputField(dobInputField, binding, callback)
|
||||
}
|
||||
}
|
||||
naviWidgetData.genderInputField?.let { genderInputField ->
|
||||
setGenderInputField(genderInputField, binding, callback)
|
||||
if(genderInputField.disabled == true) {
|
||||
binding.genderInputContainer.isVisible = false
|
||||
} else {
|
||||
setGenderInputField(genderInputField, binding, callback)
|
||||
}
|
||||
}
|
||||
naviWidgetData.checkboxInputField?.let { checkboxInputField ->
|
||||
if(!binding.dateInputContainer.isVisible && !binding.genderInputContainer.isVisible){
|
||||
val layoutParams = binding.confirmationCheckbox.layoutParams
|
||||
(layoutParams as? MarginLayoutParams)?.setMargins(binding.confirmationCheckbox.marginLeft, 0, 0, 0)
|
||||
binding.confirmationCheckbox.layoutParams = layoutParams
|
||||
}
|
||||
setCheckboxField(checkboxInputField, binding, callback)
|
||||
}
|
||||
//open nudge bottom sheet if cta not null
|
||||
naviWidgetData.bottomSheetNudgeCta?.let { ctaData ->
|
||||
@@ -182,7 +197,6 @@ class PanDetailsInputWidgetLayout @JvmOverloads constructor(
|
||||
binding.genderInputContainer.isClickable = false
|
||||
binding.genderInputContainer.isFocusable = false
|
||||
binding.genderFieldTv.isEnabled = false
|
||||
disableView(binding.genderFieldTv)
|
||||
}
|
||||
validateForm()
|
||||
}
|
||||
@@ -213,7 +227,6 @@ class PanDetailsInputWidgetLayout @JvmOverloads constructor(
|
||||
binding.dateInputContainer.isClickable = false
|
||||
binding.dateInputContainer.isFocusable = false
|
||||
binding.dobFieldTv.isEnabled = false
|
||||
disableView(binding.dobFieldTv)
|
||||
}
|
||||
validateForm()
|
||||
}
|
||||
|
||||
@@ -1,6 +1,22 @@
|
||||
package com.navi.insurance.common.fragment
|
||||
|
||||
import android.graphics.Color
|
||||
import android.view.ViewStub
|
||||
import androidx.compose.foundation.Image
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.size
|
||||
import androidx.compose.foundation.layout.width
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.res.painterResource
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.databinding.DataBindingUtil
|
||||
import com.google.gson.Gson
|
||||
@@ -11,10 +27,12 @@ import com.navi.insurance.common.models.GenericInfoBottomSheetData
|
||||
import com.navi.insurance.databinding.GenericInfoBottomSheetBinding
|
||||
import com.navi.insurance.navigator.NaviInsuranceDeeplinkNavigator
|
||||
import com.navi.insurance.util.CONTENT_DATA_JSON_STRING
|
||||
import com.navi.naviwidgets.extensions.NaviText
|
||||
import com.navi.naviwidgets.extensions.addOnMultipleClicksHandler
|
||||
import com.navi.naviwidgets.extensions.setImageFieldData
|
||||
import com.navi.naviwidgets.extensions.setTextFieldData
|
||||
import com.navi.naviwidgets.models.response.ImageFieldData
|
||||
import com.navi.naviwidgets.utils.NaviWidgetIconUtils
|
||||
|
||||
class GenericInfoBottomSheet : BaseBottomSheet() {
|
||||
|
||||
@@ -52,6 +70,10 @@ class GenericInfoBottomSheet : BaseBottomSheet() {
|
||||
}
|
||||
binding.title.setTextFieldData(bottomSheetData?.title)
|
||||
binding.subtitle.setTextFieldData(bottomSheetData?.subtitle)
|
||||
binding.composeLayout.isVisible = bottomSheetData?.bulletedList?.isNotEmpty() == true
|
||||
binding.composeLayout.setContent {
|
||||
BullettedList(bottomSheetData?.bulletedList.orEmpty())
|
||||
}
|
||||
bottomSheetData?.buttonCta?.let { buttonCtaData ->
|
||||
binding.actionButton.text = buttonCtaData.title.orEmpty()
|
||||
binding.actionButton.addOnMultipleClicksHandler {
|
||||
@@ -70,4 +92,33 @@ class GenericInfoBottomSheet : BaseBottomSheet() {
|
||||
override val screenName: String
|
||||
get() = TAG
|
||||
|
||||
@Composable
|
||||
fun BullettedList(termList: List<GenericInfoBottomSheetData.BulletItem>){
|
||||
Column(
|
||||
) {
|
||||
for (item in termList) {
|
||||
Row(
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
modifier = Modifier.padding(vertical = 8.dp)
|
||||
) {
|
||||
val imageResId = NaviWidgetIconUtils.getImageFromIconCode(item.iconCode)
|
||||
if (imageResId == -1){
|
||||
//Do nothing
|
||||
} else{
|
||||
Image(
|
||||
painter = painterResource(id = imageResId), // Load the outlined bullet vector drawable
|
||||
contentDescription = "bullet", // Optional content description
|
||||
modifier = Modifier.align(Alignment.Top)
|
||||
|
||||
)
|
||||
}
|
||||
Spacer(modifier = Modifier.width(8.dp))
|
||||
NaviText(
|
||||
textFieldData = item.text,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -37,14 +37,15 @@ data class FooterButtonItem(
|
||||
data class FooterOfferTag(
|
||||
@SerializedName("selectedState") val selectedState: FooterOfferTagState? = null,
|
||||
@SerializedName("unselectedState") val unselectedState: FooterOfferTagState? = null,
|
||||
var minItemsSelected: Boolean = false
|
||||
@SerializedName("minItemsSelected") var minItemsSelected: Boolean = false
|
||||
)
|
||||
|
||||
data class FooterOfferTagState(
|
||||
@SerializedName("offerText") val offerText: TextFieldData? = null,
|
||||
@SerializedName("backgroundColor") val backgroundColor: String? = null,
|
||||
@SerializedName("dividerColor") val dividerColor: String? = null,
|
||||
)
|
||||
@SerializedName("showDivider") var showDivider: Boolean? = false,
|
||||
)
|
||||
|
||||
data class FooterProgress(
|
||||
@SerializedName("value") val value: Int? = null,
|
||||
|
||||
@@ -8,5 +8,11 @@ data class GenericInfoBottomSheetData(
|
||||
@SerializedName("title") val title: TextFieldData? = null,
|
||||
@SerializedName("subtitle") val subtitle: TextFieldData? = null,
|
||||
@SerializedName("iconCode") val iconCode: String? = null,
|
||||
@SerializedName("buttonCta") val buttonCta: CtaData? = null
|
||||
)
|
||||
@SerializedName("buttonCta") val buttonCta: CtaData? = null,
|
||||
@SerializedName("bulletedList") val bulletedList: List<BulletItem>? = null
|
||||
) {
|
||||
data class BulletItem(
|
||||
@SerializedName("itemText") val text: TextFieldData? = null,
|
||||
@SerializedName("iconCode") val iconCode: String? = null
|
||||
)
|
||||
}
|
||||
|
||||
@@ -99,9 +99,9 @@ constructor(context: Context, attrs: AttributeSet? = null) : BaseNaviWidgetView(
|
||||
viewData?.offerTagData?.let {
|
||||
this.binding?.offerLl?.visibility = View.VISIBLE
|
||||
if (it.minItemsSelected) {
|
||||
setOfferData(it.selectedState, viewData.progress.isNull(), ctaDataCallback)
|
||||
setOfferData(it.selectedState, viewData.progress.isNull() || (viewData.offerTagData.selectedState?.showDivider == true), ctaDataCallback)
|
||||
} else {
|
||||
setOfferData(it.unselectedState, viewData.progress.isNull(), ctaDataCallback)
|
||||
setOfferData(it.unselectedState, viewData.progress.isNull() || (viewData.offerTagData.unselectedState?.showDivider == true), ctaDataCallback)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -27,6 +27,7 @@ import com.navi.base.utils.isNull
|
||||
import com.navi.base.utils.orFalse
|
||||
import com.navi.common.network.models.ErrorMessage
|
||||
import com.navi.common.utils.Constants
|
||||
import com.navi.design.utils.isValidHexColor
|
||||
import com.navi.insurance.R
|
||||
import com.navi.insurance.analytics.InsuranceAnalyticsConstants
|
||||
import com.navi.insurance.common.GiBaseFragment
|
||||
@@ -57,6 +58,7 @@ import com.navi.naviwidgets.models.response.TextFieldData
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
import kotlinx.coroutines.launch
|
||||
import javax.inject.Inject
|
||||
import android.graphics.Color
|
||||
|
||||
|
||||
@AndroidEntryPoint
|
||||
@@ -261,6 +263,13 @@ class PostPurchaseFormBasedFragment : GiBaseFragment(), ActionHandler.ActionOwne
|
||||
formPageViewState.data?.metaData?.analyticsInitEventName,
|
||||
applicationType = formPageViewState.data?.metaData?.applicationType
|
||||
)
|
||||
formPageViewState.data?.pageLayoutParams.let { pageLayoutParams ->
|
||||
if (isValidHexColor(pageLayoutParams?.pageBackgroundColor)) {
|
||||
binding.root.setBackgroundColor(
|
||||
Color.parseColor(pageLayoutParams?.pageBackgroundColor)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
is FormPageResponseState.Loading -> {
|
||||
binding.progressBar.isVisible = true
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
*/
|
||||
|
||||
package com.navi.insurance.formbase.pre_purchase.repo
|
||||
|
||||
import com.navi.common.network.models.RepoResult
|
||||
import com.navi.insurance.models.request.FormNextPageRequest
|
||||
import com.navi.insurance.models.request.FormPreviousPageRequest
|
||||
|
||||
@@ -78,6 +78,8 @@
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="@dimen/dp_8"
|
||||
android:paddingHorizontal="@dimen/dp_20"
|
||||
android:textAlignment="center"
|
||||
android:fontFamily="@font/tt_medium"
|
||||
android:textSize="@dimen/sp_12"
|
||||
tools:text="Yay! 25% off will now be applicable" />
|
||||
@@ -113,6 +115,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/dp_3"
|
||||
android:layout_marginHorizontal="@dimen/dp_16"
|
||||
android:paddingHorizontal="@dimen/dp_20"
|
||||
android:background="@drawable/dash_line_grey_horizontal"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintBottom_toTopOf="@+id/button_ll"
|
||||
|
||||
@@ -47,6 +47,11 @@
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent" />
|
||||
|
||||
<View
|
||||
android:id="@+id/blank_space_below_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/dp_16"
|
||||
app:layout_constraintTop_toBottomOf="@+id/title"/>
|
||||
|
||||
<TextView
|
||||
android:letterSpacing="0.02"
|
||||
@@ -54,13 +59,21 @@
|
||||
style="@style/NaviSubMediumTextStyle"
|
||||
android:layout_width="@dimen/dp_0"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/dp_16"
|
||||
tools:ignore="RtlSymmetry"
|
||||
app:layout_constraintTop_toBottomOf="@+id/title"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintTop_toBottomOf="@+id/blank_space_below_title"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
tools:text="As the nominee is younger than 18 years, please add an appointee older than 18 years" />
|
||||
|
||||
<androidx.compose.ui.platform.ComposeView
|
||||
android:id="@+id/compose_layout"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintTop_toBottomOf="@+id/subtitle"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintEnd_toEndOf="parent"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/action_button"
|
||||
@@ -69,10 +82,20 @@
|
||||
android:layout_height="@dimen/dp_48"
|
||||
android:fontFamily="@font/tt_semi_bold"
|
||||
android:layout_gravity="center_vertical"
|
||||
app:layout_constraintTop_toBottomOf="@+id/subtitle"
|
||||
app:layout_constraintTop_toBottomOf="@+id/compose_layout"
|
||||
android:layout_marginTop="@dimen/dp_32"
|
||||
android:height="@dimen/dp_48"
|
||||
android:textAllCaps="false"
|
||||
tools:text="Add Appointee" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</layout>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
{}
|
||||
{}
|
||||
Reference in New Issue
Block a user