TP-54096 | Mehul Garg | QrCode code cleanup (#9360)

This commit is contained in:
Mehul Garg
2024-01-17 12:28:38 +05:30
committed by GitHub
parent fc1c8e826e
commit a60a8dc6f5
5 changed files with 0 additions and 306 deletions

View File

@@ -886,12 +886,6 @@ class NaviPayAnalytics private constructor() {
}
}
inner class NaviPayMyQrCodes {
fun onMyQrCodesLanded() {
NaviTrackEvent.trackEventOnClickStream("NaviPay_MyQrCodes_Landed")
}
}
inner class NaviPayToContacts {
fun onSendToContactsLanded() {
NaviTrackEvent.trackEventOnClickStream("NaviPay_SendMoney_SelectContact_Landed")
@@ -2233,7 +2227,6 @@ class NaviPayAnalytics private constructor() {
const val NAVI_PAY_ACTIVE_COMPLETED_MANDATE_DETAILS =
"navipay_active_completed_mandate_details"
const val NAVI_PAY_PENDING_MANDATE_DETAILS = "navipay_pending_mandate_details"
const val NAVI_PAY_MY_QR_CODE = "navipay_my_qr_codes"
const val NAVI_PAY_MY_QUERIES = "navipay_my_queries"
const val NAVI_PAY_REQUEST_MONEY = "navipay_request_money"
const val NAVI_PAY_TRANSACTION_HISTORY = "navipay_transaction_history"

View File

@@ -22,7 +22,6 @@ import com.navi.pay.destinations.CollectRequestsScreenDestination
import com.navi.pay.destinations.ComplaintListScreenDestination
import com.navi.pay.destinations.LinkedAccountsScreenDestination
import com.navi.pay.destinations.MandateScreenDestination
import com.navi.pay.destinations.MyQrCodeScreenDestination
import com.navi.pay.destinations.NaviPayEmptyHomeScreenDestination
import com.navi.pay.destinations.NaviPayFaqScreenDestination
import com.navi.pay.destinations.NaviPayHomeScreenDestination
@@ -123,7 +122,6 @@ object NaviPayRouter {
SavedBeneficiaryScreenDestination
NaviPayScreenType.NAVI_PAY_UPI_NUMBER_SCREEN.name -> UpiNumberScreenDestination
NaviPayScreenType.NAVI_PAY_MANDATE_SCREEN.name -> MandateScreenDestination
NaviPayScreenType.NAVI_PAY_QR_CODE_SCREEN.name -> MyQrCodeScreenDestination
NaviPayScreenType.NAVI_PAY_PENDING_REQUESTS_SCREEN.name ->
CollectRequestsScreenDestination
NaviPayScreenType.NAVI_PAY_BLOCKED_USERS_SCREEN.name -> BlockedUsersScreenDestination

View File

@@ -1,234 +0,0 @@
/*
*
* * Copyright © 2022 by Navi Technologies Limited
* * All rights reserved. Strictly confidential
*
*/
package com.navi.pay.management.myqrcode.ui
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.layout.Arrangement
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.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalClipboardManager
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import coil.compose.AsyncImage
import com.google.accompanist.pager.ExperimentalPagerApi
import com.google.accompanist.pager.HorizontalPager
import com.google.accompanist.pager.HorizontalPagerIndicator
import com.google.accompanist.pager.rememberPagerState
import com.navi.design.font.FontWeightEnum
import com.navi.design.snackbar.SuccessSnackBar
import com.navi.design.theme.FFFFFF
import com.navi.design.theme.getFontWeight
import com.navi.design.theme.ttComposeFontFamily
import com.navi.pay.R
import com.navi.pay.analytics.NaviPayAnalytics
import com.navi.pay.common.theme.color.NaviPayColor
import com.navi.pay.common.ui.NaviPayHeader
import com.navi.pay.common.ui.NaviPaySponsorView
import com.navi.pay.common.utils.SnackBarPredefinedConfig
import com.navi.pay.management.myqrcode.model.view.QrVpaEntity
import com.navi.pay.management.myqrcode.viewmodel.MyQrCodeViewModel
import com.navi.pay.utils.getImageRequestBuilder
import com.navi.pay.utils.noRippleClickable
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
@OptIn(ExperimentalPagerApi::class)
@Destination
@Composable
fun MyQrCodeScreen(
navigator: DestinationsNavigator,
myQrCodeViewModel: MyQrCodeViewModel = hiltViewModel(),
naviPayAnalytics: NaviPayAnalytics.NaviPayMyQrCodes = NaviPayAnalytics.INSTANCE.NaviPayMyQrCodes()
) {
LaunchedEffect(Unit) {
naviPayAnalytics.onMyQrCodesLanded()
}
val pagerState = rememberPagerState()
val vpaList by myQrCodeViewModel.vpaList.collectAsStateWithLifecycle()
val showCopyToClipboardSnackBar by myQrCodeViewModel.showCopyToClipboardSnackBar.collectAsStateWithLifecycle()
Box(modifier = Modifier.fillMaxSize()) {
Column(
modifier = Modifier
.fillMaxSize()
.background(color = FFFFFF),
horizontalAlignment = Alignment.CenterHorizontally
) {
NaviPayHeader(
title = stringResource(id = R.string.my_qr_codes),
onNavigationIconClick = { navigator.navigateUp() },
onActionClick = {},
modifier = Modifier.fillMaxWidth()
)
Spacer(modifier = Modifier.height(30.dp))
HorizontalPager(
modifier = Modifier
.fillMaxWidth(),
state = pagerState,
count = vpaList.size
) { page ->
VpaItem(
qrVpaEntity = vpaList[page],
myQrCodeViewModel = myQrCodeViewModel
)
}
if (vpaList.size > 1) {
HorizontalPagerIndicator(
modifier = Modifier
.padding(horizontal = 16.dp, vertical = 32.dp),
pagerState = pagerState,
activeColor = NaviPayColor.brandPrimaryPurple,
inactiveColor = NaviPayColor.bgAlt2,
indicatorWidth = if (vpaList.size > 10) 16.dp else 24.dp,
indicatorHeight = 2.dp,
spacing = 8.dp,
indicatorShape = RoundedCornerShape(4.dp)
)
}
Spacer(modifier = Modifier.weight(1f))
NaviPaySponsorView(
modifier = Modifier
.align(Alignment.CenterHorizontally)
.padding(bottom = 32.dp)
)
}
SuccessSnackBar(
modifier = Modifier
.padding(start = 16.dp, end = 16.dp, bottom = 32.dp)
.align(Alignment.BottomCenter),
show = showCopyToClipboardSnackBar,
snackBarConfig = SnackBarPredefinedConfig.successConfig(
title = stringResource(id = R.string.copied_to_clipboard)
),
onDismissed = {
myQrCodeViewModel.updateShowSnackBarState(showSnackBar = false)
}
)
}
}
@Composable
fun VpaItem(
qrVpaEntity: QrVpaEntity,
myQrCodeViewModel: MyQrCodeViewModel
) {
val linkedAccountEntity = qrVpaEntity.linkedAccountEntity
val clipboardManager = LocalClipboardManager.current
Column(modifier = Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) {
Row(verticalAlignment = Alignment.CenterVertically) {
AsyncImage(
modifier = Modifier
.size(24.dp)
.background(color = FFFFFF, shape = RoundedCornerShape(1.dp))
.border(width = 1.dp, color = NaviPayColor.borderAlt)
.padding(6.dp),
contentScale = ContentScale.FillBounds,
model = LocalContext.current.getImageRequestBuilder(data = linkedAccountEntity.bankIconImageUrl),
contentDescription = linkedAccountEntity.bankName,
fallback = painterResource(id = linkedAccountEntity.fallbackBankLogoResId),
placeholder = painterResource(id = linkedAccountEntity.fallbackBankLogoResId),
error = painterResource(id = linkedAccountEntity.fallbackBankLogoResId),
)
Spacer(modifier = Modifier.width(12.dp))
Text(
text = linkedAccountEntity.bankNameAccountNumber,
fontSize = 14.sp,
fontFamily = ttComposeFontFamily,
fontWeight = getFontWeight(FontWeightEnum.NAVI_HEADLINE_REGULAR),
color = NaviPayColor.textPrimary
)
}
Spacer(modifier = Modifier.height(28.dp))
Box(modifier = Modifier.size(250.dp)) {
qrVpaEntity.qrCode?.let { qrCode ->
Image(
modifier = Modifier.fillMaxSize(),
bitmap = qrCode.asImageBitmap(),
contentDescription = "QR code",
contentScale = ContentScale.FillBounds
)
}
}
Spacer(modifier = Modifier.height(24.dp))
Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.SpaceBetween,
modifier = Modifier
.padding(horizontal = 8.dp)
.noRippleClickable {
clipboardManager.setText(
annotatedString = AnnotatedString(
linkedAccountEntity.vpa
)
)
myQrCodeViewModel.updateShowSnackBarState(showSnackBar = true)
}
) {
Text(
text = stringResource(id = R.string.upi_id_with_label, linkedAccountEntity.vpa),
fontSize = 12.sp,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
fontFamily = ttComposeFontFamily,
fontWeight = getFontWeight(FontWeightEnum.NAVI_BODY_REGULAR),
color = NaviPayColor.textTertiary
)
Spacer(modifier = Modifier.width(8.dp))
Image(
painter = painterResource(id = R.drawable.ic_copy),
contentDescription = "copy to clipboard",
modifier = Modifier
.size(16.dp)
)
}
}
}

View File

@@ -1,62 +0,0 @@
/*
*
* * Copyright © 2022 by Navi Technologies Limited
* * All rights reserved. Strictly confidential
*
*/
package com.navi.pay.management.myqrcode.viewmodel
import androidx.lifecycle.viewModelScope
import com.navi.pay.analytics.NaviPayAnalytics
import com.navi.pay.common.model.view.NaviPayVmData
import com.navi.pay.common.usecase.LinkedAccountsUseCase
import com.navi.pay.common.viewmodel.NaviPayBaseVM
import com.navi.pay.management.myqrcode.model.view.QrVpaEntity
import com.navi.pay.onboarding.account.add.model.view.AccountType
import com.navi.pay.utils.createQrCode
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
@HiltViewModel
class MyQrCodeViewModel
@Inject
constructor(private val linkedAccountsUseCase: LinkedAccountsUseCase) :
NaviPayBaseVM(NaviPayVmData(screenName = NaviPayAnalytics.NAVI_PAY_MY_QR_CODE)) {
private val _vpaList = MutableStateFlow<List<QrVpaEntity>>(emptyList())
val vpaList = _vpaList.asStateFlow()
private val _showCopyToClipboardSnackBar = MutableStateFlow(false)
val showCopyToClipboardSnackBar = _showCopyToClipboardSnackBar.asStateFlow()
init {
fetchMyVpaList()
}
private fun fetchMyVpaList() {
viewModelScope.launch(Dispatchers.IO) {
val linkedAccounts = linkedAccountsUseCase.execute()
_vpaList.value =
linkedAccounts
.filter { it.accountType != AccountType.CREDIT.name }
.map { linkedAccountEntity -> updateQrCode(QrVpaEntity(linkedAccountEntity)) }
}
}
private fun updateQrCode(vpa: QrVpaEntity): QrVpaEntity {
if (vpa.qrCode == null) {
vpa.qrCode = createQrCode(vpa.upiUri)
}
return vpa
}
fun updateShowSnackBarState(showSnackBar: Boolean) {
_showCopyToClipboardSnackBar.update { showSnackBar }
}
}

View File

@@ -162,7 +162,6 @@
<string name="yes_mark_as_not_spam">Yes, mark as not spam</string>
<string name="x_unblocked">%s unblocked</string>
<string name="x_removed_from_spam">%s removed from spam</string>
<string name="my_qr_codes">My QR codes</string>
<string name="choose_bank_account">Choose bank account</string>
<string name="scan_my_qr_code_to_pay">Scan my QR code to pay</string>
<string name="to_bank">To bank</string>