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:
Kshitij Pramod Ghongadi
2023-09-08 12:06:40 +05:30
committed by GitHub
parent 54005e6cb4
commit 0b3dc238fc
10 changed files with 123 additions and 18 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1 +1 @@
{}
{}