diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 4815e009..dbaef9b9 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -30,7 +30,12 @@ -> -21 -> lollipop 28 -> + + + + + + - + + + + + diff --git a/android/app/src/main/java/com/avapp/DeviceUtilsModule.java b/android/app/src/main/java/com/avapp/DeviceUtilsModule.java index 56c69465..71da3d39 100644 --- a/android/app/src/main/java/com/avapp/DeviceUtilsModule.java +++ b/android/app/src/main/java/com/avapp/DeviceUtilsModule.java @@ -1,32 +1,59 @@ package com.avapp; +import static android.app.Activity.RESULT_CANCELED; +import static android.app.Activity.RESULT_OK; + +import static com.imagepicker.Utils.deleteFile; + import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.location.LocationManager; import androidx.annotation.Nullable; +import androidx.core.content.FileProvider; import com.facebook.react.bridge.ActivityEventListener; +import com.facebook.react.bridge.BaseActivityEventListener; import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; import android.content.pm.PackageInfo; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.os.Environment; +import android.os.Handler; +import android.util.Base64; + import org.json.JSONArray; +import org.json.JSONException; import org.json.JSONObject; import java.util.List; -public class DeviceUtilsModule extends ReactContextBaseJavaModule implements ActivityEventListener { +import android.net.Uri; +import android.util.Log; +import android.widget.Toast; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +public class DeviceUtilsModule extends ReactContextBaseJavaModule { private ReactApplicationContext RNContext; + private File imageFile; + + private int WHATSAPP_SHARE_REQUEST_CODE = 12345; + public DeviceUtilsModule(@Nullable ReactApplicationContext reactContext){ super(reactContext); RNContext = reactContext; + reactContext.addActivityEventListener(mActivityEventListener); } @Override @@ -34,15 +61,22 @@ public class DeviceUtilsModule extends ReactContextBaseJavaModule implements Act return "DeviceUtilsModule"; } - @Override - public void onActivityResult(Activity activity, int i, int i1, @Nullable Intent intent) { + private final ActivityEventListener mActivityEventListener = new BaseActivityEventListener() { + @Override + public void onActivityResult(Activity activity, int i, int i1, @Nullable Intent intent) { + if(i1 != RESULT_CANCELED) { + if (i == WHATSAPP_SHARE_REQUEST_CODE) { + deleteFile(Uri.fromFile(imageFile)); + } + } + } - } + @Override + public void onNewIntent(Intent intent) { - @Override - public void onNewIntent(Intent intent) { + } + }; - } @ReactMethod public void isLocationEnabled (Promise promise) { @@ -77,4 +111,74 @@ public class DeviceUtilsModule extends ReactContextBaseJavaModule implements Act promise.reject( err); } } + private static File convertBase64ToFile(Context context,String base64Data) { + try { + byte[] decodedBytes = Base64.decode(base64Data, Base64.DEFAULT); + File outputDir = context.getCacheDir(); + File file = File.createTempFile("temp_image", ".jpg", Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)); + FileOutputStream fos = new FileOutputStream(file); + fos.write(decodedBytes); + fos.flush(); + fos.close(); + return file; + } catch (IOException e) { + Log.e("ShareUtils", "Failed to convert Base64 to file: " + e.getMessage()); + return null; + } + } + + public boolean isWhatsAppInstalled() { + PackageManager packageManager = RNContext.getPackageManager(); + List packages = packageManager.getInstalledPackages(PackageManager.GET_META_DATA); + + for (PackageInfo packageInfo : packages) { + String packageName = packageInfo.packageName; + if(packageName.equals("com.whatsapp")){ + return true; + } + } + return false; + } + + @ReactMethod + public void sendFeedbackToWhatsapp(String message, String imageUrl, String mimeType, Promise promise) { + try{ + if(!isWhatsAppInstalled()){ + promise.reject("errorCode", "1"); + return; + } + + Intent sendIntent = new Intent(); + sendIntent.setAction(Intent.ACTION_SEND); + sendIntent.putExtra(Intent.EXTRA_TEXT, message); + + if(imageUrl.equals("")) { + sendIntent.setType("text/plain"); + sendIntent.setPackage("com.whatsapp"); + getCurrentActivity().startActivity(sendIntent); + } else { + sendIntent.setType(mimeType); + sendIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + imageFile = convertBase64ToFile(getReactApplicationContext(), imageUrl); + Uri fileUri = FileProvider.getUriForFile(getReactApplicationContext(), BuildConfig.APPLICATION_ID + ".provider", new File( + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), + imageFile.getName() + ) + ); + sendIntent.putExtra(Intent.EXTRA_STREAM, fileUri); + sendIntent.setPackage("com.whatsapp"); + getCurrentActivity().startActivityForResult(sendIntent, WHATSAPP_SHARE_REQUEST_CODE); + } + promise.resolve(true); + return; + + } catch (Error e){ + promise.reject("errorCode","2"); + } + return; + } + + + + } diff --git a/android/app/src/main/java/com/avapp/MainActivity.java b/android/app/src/main/java/com/avapp/MainActivity.java index 9ac0a557..db8a3e5d 100644 --- a/android/app/src/main/java/com/avapp/MainActivity.java +++ b/android/app/src/main/java/com/avapp/MainActivity.java @@ -3,6 +3,8 @@ package com.avapp; import com.facebook.react.ReactActivity; import com.facebook.react.ReactActivityDelegate; import com.facebook.react.ReactRootView; + +import android.content.IntentFilter; import android.os.Bundle; public class MainActivity extends ReactActivity { @@ -16,15 +18,6 @@ public class MainActivity extends ReactActivity { return "AVAPP"; } - - // https://github.com/software-mansion/react-native-screens#android - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(null); - } - - - /** * Returns the instance of the {@link ReactActivityDelegate}. There the RootView is created and * you can specify the renderer you wish to use - the new renderer (Fabric) or the old renderer diff --git a/package.json b/package.json index 3a7aaa70..80e271f4 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,8 @@ "react-native-webview": "12.0.2", "react-redux": "8.0.5", "redux": "4.2.0", - "redux-persist": "6.0.0" + "redux-persist": "6.0.0", + "rn-fetch-blob": "0.12.0" }, "devDependencies": { "@babel/core": "7.12.9", diff --git a/src/assets/icons/ChevronDown.tsx b/src/assets/icons/ChevronDown.tsx new file mode 100644 index 00000000..ce42c6ba --- /dev/null +++ b/src/assets/icons/ChevronDown.tsx @@ -0,0 +1,14 @@ +import * as React from 'react'; +import Svg, { Mask, Path, G } from 'react-native-svg'; +const ChevronDown = (props) => { + const { fillColor = '#969696', size = 24 } = props; + return ( + + + + ); +}; +export default ChevronDown; diff --git a/src/assets/icons/ChevronUp.tsx b/src/assets/icons/ChevronUp.tsx new file mode 100644 index 00000000..e4e5ba08 --- /dev/null +++ b/src/assets/icons/ChevronUp.tsx @@ -0,0 +1,14 @@ +import * as React from 'react'; +import Svg, { Mask, Path, G } from 'react-native-svg'; +const ChevronUp = (props) => { + const { fillColor = '#969696', size = 24 } = props; + return ( + + + + ); +}; +export default ChevronUp; diff --git a/src/assets/icons/WhatsAppFeedbackShareIcon.tsx b/src/assets/icons/WhatsAppFeedbackShareIcon.tsx new file mode 100644 index 00000000..10067e6f --- /dev/null +++ b/src/assets/icons/WhatsAppFeedbackShareIcon.tsx @@ -0,0 +1,11 @@ +import * as React from 'react'; +import Svg, { Path, SvgProps } from 'react-native-svg'; +const SvgComponent = (props: SvgProps) => ( + + + +); +export default SvgComponent; diff --git a/src/common/Constants.ts b/src/common/Constants.ts index d3d1d46a..1f584517 100644 --- a/src/common/Constants.ts +++ b/src/common/Constants.ts @@ -431,6 +431,15 @@ export const CLICKSTREAM_EVENT_NAMES = { name: 'FA_UNIFIED_ENTITY_REQUEST_FAILED', description: 'FA_UNIFIED_ENTITY_REQUEST_FAILED', }, + FA_SHARE_FEEDBACK_CLICKED: { + name: 'FA_SHARE_FEEDBACK_CLICKED', + description: + 'When user clicks on share feedback on case details screen for any of the filled feedback', + }, + FA_SHARE_SUCCESSFUL: { + name: 'FA_SHARE_SUCCESSFUL', + description: 'When user is redirected to WhatsApp after clicking on share feedback', + }, // Notifications FA_NOTIFICATION_ICON_CLICK: { diff --git a/src/components/utlis/DeviceUtils.ts b/src/components/utlis/DeviceUtils.ts index 5443d7d7..926d85a3 100644 --- a/src/components/utlis/DeviceUtils.ts +++ b/src/components/utlis/DeviceUtils.ts @@ -7,3 +7,10 @@ export const locationEnabled = (): Promise => DeviceUtilsModule.isLocat // returns array of all the installed packages. export const getAllInstalledApp = (): Promise => DeviceUtilsModule.getAllInstalledApp(); + +// sends feedback data to whatsapp. +export const sendFeedbackToWhatsapp = ( + message: string, + imageUrl: string, + mimeType: string +): Promise => DeviceUtilsModule.sendFeedbackToWhatsapp(message, imageUrl, mimeType); diff --git a/src/components/utlis/commonFunctions.ts b/src/components/utlis/commonFunctions.ts index caf22894..993f96cd 100644 --- a/src/components/utlis/commonFunctions.ts +++ b/src/components/utlis/commonFunctions.ts @@ -368,3 +368,10 @@ export function getDistanceFromLatLonInKm( const distance = 2 * Math.atan2(Math.sqrt(intermediateResult), Math.sqrt(1 - intermediateResult)); return EARTH_RADIUS * distance; } + +export function insertCommasinAmount(amount: number | undefined) { + const reversedAmount = amount?.toString().split('').reverse().join(''); + const groups = reversedAmount?.match(/.{1,3}/g); + const result = groups?.join(',').split('').reverse().join(''); + return result; +} diff --git a/src/screens/allCases/constants.ts b/src/screens/allCases/constants.ts index fee142c9..ec1d1c1d 100644 --- a/src/screens/allCases/constants.ts +++ b/src/screens/allCases/constants.ts @@ -77,6 +77,9 @@ export const ToastMessages = { CASES_DELETION_DISABLED: 'Case deletion is disabled during the generation of visit plan', GEOLOCATION_COORDINATES_INCORRECT: 'Geolocation not found', IMAGE_UPLOAD_SUCCESS: 'Your ID card has been sent for approval', + WHATSAPP_FEEDBACK_SHARE_SUCCESS: 'Feedback shared successfully via WhatsApp', + WHATSAPP_FEEDBACK_SHARE_FAILURE: 'Feedback sharing failed via WhatsApp', + WHATSAPP_NOT_INSTALLED: 'WhatsApp is not installed on your device', }; export enum BOTTOM_TAB_ROUTES { diff --git a/src/screens/caseDetails/CollectionCaseDetail.tsx b/src/screens/caseDetails/CollectionCaseDetail.tsx index 3131fcf1..2a4f9190 100644 --- a/src/screens/caseDetails/CollectionCaseDetail.tsx +++ b/src/screens/caseDetails/CollectionCaseDetail.tsx @@ -215,7 +215,7 @@ const CollectionCaseDetails: React.FC = (props) => { const commonParams = { loanAccountNumber: caseDetail.loanAccountNumber, customerReferenceId: caseDetail.customerReferenceId, - caseId, + caseId: caseId, }; navigateToScreen(route, { ...params, ...commonParams }); }; @@ -463,6 +463,7 @@ const CollectionCaseDetails: React.FC = (props) => { diff --git a/src/screens/caseDetails/feedback/FeedbackDetailContainer.tsx b/src/screens/caseDetails/feedback/FeedbackDetailContainer.tsx index 3a19a0db..78186917 100644 --- a/src/screens/caseDetails/feedback/FeedbackDetailContainer.tsx +++ b/src/screens/caseDetails/feedback/FeedbackDetailContainer.tsx @@ -25,6 +25,8 @@ import { setFeedbackHistoryLoading } from '../../../reducer/feedbackHistorySlice import SuspenseLoader from '../../../../RN-UI-LIB/src/components/suspense_loader/SuspenseLoader'; import LineLoader from '../../../../RN-UI-LIB/src/components/suspense_loader/LineLoader'; import NoPastFeedbackIcon from '../../../assets/icons/NoPastFeedbackIcon'; +import ChevronDown from '../../../assets/icons/ChevronDown'; +import ChevronUp from '../../../assets/icons/ChevronUp'; const FEEDBACK_PAGE_TITLE = 'All feedbacks'; const ADDRESS_FEEDBACK_PAGE_TITLE = 'Address feedback'; @@ -39,13 +41,20 @@ interface IFeedbackDetailContainer { addressReferenceIds?: string[]; addressText?: string; activeFeedbackReferenceId?: string; + caseId: string; }; }; } const FeedbackDetailContainer: React.FC = ({ route: routeParams }) => { const { - params: { loanAccountNumber, activeFeedbackReferenceId, addressReferenceIds, addressText }, + params: { + loanAccountNumber, + activeFeedbackReferenceId, + addressReferenceIds, + addressText, + caseId, + }, } = routeParams; const isPastFeedbackOnAddress = addressText || addressReferenceIds?.length; @@ -212,7 +221,12 @@ const FeedbackDetailContainer: React.FC = ({ route: ro }} > = ({ route: ro key={feedback.referenceId} feedbackItem={feedback} isExpanded={isExpanded} + caseId={caseId} /> } customExpandUi={{ - whenCollapsed: View more, - whenExpanded: View less, + whenCollapsed: , + whenExpanded: , }} onExpanded={(value) => { setIsExpanded(value); @@ -321,6 +336,10 @@ const styles = StyleSheet.create({ lineHeight: 20, color: COLORS.TEXT.BLUE, }, + accordianPadding: { + paddingTop: 16, + paddingBottom: 8, + }, }); export default FeedbackDetailContainer; diff --git a/src/screens/caseDetails/feedback/FeedbackDetailItem.tsx b/src/screens/caseDetails/feedback/FeedbackDetailItem.tsx index bcb5e69c..3ca7bfea 100644 --- a/src/screens/caseDetails/feedback/FeedbackDetailItem.tsx +++ b/src/screens/caseDetails/feedback/FeedbackDetailItem.tsx @@ -1,5 +1,5 @@ -import React, { ReactNode } from 'react'; -import { View, StyleSheet, TouchableOpacity, Linking } from 'react-native'; +import React, { ReactNode, useEffect, useState } from 'react'; +import { View, StyleSheet, TouchableOpacity, Linking, Platform, NativeModules } from 'react-native'; import Text from '../../../../RN-UI-LIB/src/components/Text'; import { GenericStyles } from '../../../../RN-UI-LIB/src/styles'; import { COLORS } from '../../../../RN-UI-LIB/src/styles/colors'; @@ -8,25 +8,42 @@ import { BUSINESS_TIME_FORMAT, dateFormat, } from '../../../../RN-UI-LIB/src/utlis/dates'; -import { getGoogleMapUrl, sanitizeString } from '../../../components/utlis/commonFunctions'; -import { FIELD_FEEDBACKS, ICallingFeedback, IFeedback } from '../../../types/feedback.types'; -import { Address as IAddress } from '../interface'; +import { + getGoogleMapUrl, + insertCommasinAmount, + sanitizeString, +} from '../../../components/utlis/commonFunctions'; +import { + FIELD_FEEDBACKS, + ICallingFeedback, + IFeedback, + OPTION_TAG, +} from '../../../types/feedback.types'; +import { CaseDetail, Address as IAddress } from '../interface'; import MapIcon from '../../../../RN-UI-LIB/src/Icons/MapIcon'; import { FEEDBACK_TYPE } from '../../../types/feedback.types'; import CallIcon from '../../../../RN-UI-LIB/src/Icons/CallIcon'; import { addClickstreamEvent } from '../../../services/clickstreamEventService'; import { CLICKSTREAM_EVENT_NAMES } from '../../../common/Constants'; +import IconLabel from '../../../common/IconLabel'; +import WhatsAppFeedbackShareIcon from '../../../assets/icons/WhatsAppIcon'; +import ReactNativeBlobUtil from 'react-native-blob-util'; +import { useAppSelector } from '../../../hooks'; +import { toast } from '../../../../RN-UI-LIB/src/components/toast'; +import { ToastMessages } from '../../allCases/constants'; +import { sendFeedbackToWhatsapp } from '../../../components/utlis/DeviceUtils'; interface IFeedbackDetailItem { feedbackItem: IFeedback; isExpanded: boolean; + caseId: string; } const feedbackTypeIcon: Record = { - FIELD_VISIT: , - INHOUSE_FIELD_VISIT: , - SELF_CALL: , - CALL_BRIDGE: , + FIELD_VISIT: , + INHOUSE_FIELD_VISIT: , + SELF_CALL: , + CALL_BRIDGE: , }; const getAddress = (address?: IAddress) => { @@ -47,9 +64,123 @@ const openGeolocation = (latitude: string, longitude: string) => { return Linking.openURL(geolocationUrl); }; -const FeedbackDetailItem = ({ feedbackItem, isExpanded }: IFeedbackDetailItem) => { +function getLocationLink(latitude: string, longitude: string): string { + const link = 'https://www.google.com/maps/search/?api=1&query=' + latitude + ',' + longitude; + return link; +} + +const sendToWhatsappNative = ( + message: string, + imageUrl: string, + mimeType: string, + caseDetails: CaseDetail, + agentId: string +) => { + sendFeedbackToWhatsapp(message, imageUrl, mimeType) + .then((res: boolean) => { + addClickstreamEvent(CLICKSTREAM_EVENT_NAMES.FA_SHARE_SUCCESSFUL, { + caseId: caseDetails?.id, + agentId: agentId, + }); + }) + .catch((err: Error) => { + if (err.message === '1') { + toast({ + text1: ToastMessages.WHATSAPP_NOT_INSTALLED, + type: 'error', + }); + } else { + toast({ + text1: ToastMessages.WHATSAPP_FEEDBACK_SHARE_FAILURE, + type: 'error', + }); + } + }); +}; + +const sendToWhatsapp = (feedbackItem: IFeedback, caseDetails: CaseDetail, agentId: string) => { + addClickstreamEvent(CLICKSTREAM_EVENT_NAMES.FA_SHARE_FEEDBACK_CLICKED, { + caseId: caseDetails?.id, + agentId: agentId, + }); + + var message = `*Visit Feedback* for ${sanitizeString(caseDetails?.customerName)} +_${sanitizeString(dateFormat(new Date(feedbackItem?.createdAt), 'DD MMM, YYYY | HH:mm a.'))}_\n +*LAN*: ${sanitizeString(caseDetails?.loanAccountNumber)} +*DPD Bucket*: ${sanitizeString(caseDetails?.dpdBucket)} +*EMI Amount*: ₹${insertCommasinAmount(caseDetails?.outstandingEmiDetails?.[0]?.emiAmount)}\n +*Disposition*: ${sanitizeString(feedbackItem?.interactionStatus)}`; + + const ptpDate = feedbackItem?.answerViews.filter((answer) => answer.questionName === 'PTP Date'); + if (ptpDate.length > 0) { + message += + ' for ' + sanitizeString(dateFormat(new Date(ptpDate[0].inputDate), 'DD MMM, YYYY')) + '\n\n'; + } else { + message += '\n\n'; + } + + message += '*Remarks*: '; + const answerList = feedbackItem?.answerViews?.filter( + (answer) => answer.questionName === 'Comments' + ); + if (answerList.length > 0) { + message += sanitizeString(answerList[0]?.inputText) + '\n\n'; + } else { + message += 'N.A.\n\n'; + } + + { + feedbackItem?.metadata?.interactionLatitude && + feedbackItem?.metadata?.interactionLongitude && + FIELD_FEEDBACKS.includes(feedbackItem?.type) + ? (message += + '*Location of feedback*: ' + + sanitizeString( + getLocationLink( + feedbackItem?.metadata?.interactionLatitude, + feedbackItem?.metadata?.interactionLongitude + ) + ) + + '\n\n') + : null; + } + + const imagesList = feedbackItem?.answerViews.filter( + (answer) => answer.questionTag === OPTION_TAG.IMAGE_UPLOAD + ); + var imageUrl = ''; + const mimeType = 'image/*'; + if (imagesList.length > 0) { + var imageUri = ''; + imageUri = imagesList[0]?.inputText ? imagesList[0].inputText : ''; + let imagePath = ''; + ReactNativeBlobUtil.config({ + fileCache: true, + }) + .fetch('GET', imageUri) + .then((resp: any) => { + if (resp.info().status !== 200) { + return ''; + } else { + imagePath = resp.path(); + return resp.readFile('base64'); + } + }) + .then((base64Data: any) => { + imageUrl = base64Data; + sendToWhatsappNative(message, imageUrl, mimeType, caseDetails, agentId); + ReactNativeBlobUtil.fs.unlink(imagePath); + }); + } else { + sendToWhatsappNative(message, imageUrl, mimeType, caseDetails, agentId); + } +}; + +const FeedbackDetailItem = ({ feedbackItem, isExpanded, caseId }: IFeedbackDetailItem) => { + const caseDetails = useAppSelector((state) => state.allCases.caseDetails[caseId]); + const { agentId } = useAppSelector((state) => ({ agentId: state.user.user?.referenceId!! })); return ( - + {feedbackTypeIcon[feedbackItem.type] ? ( {feedbackTypeIcon[feedbackItem.type]} @@ -70,13 +201,17 @@ const FeedbackDetailItem = ({ feedbackItem, isExpanded }: IFeedbackDetailItem) = {sanitizeString(dateFormat(new Date(feedbackItem.createdAt), BUSINESS_DATE_FORMAT))} -   ●   + {sanitizeString(dateFormat(new Date(feedbackItem.createdAt), BUSINESS_TIME_FORMAT))} - {feedbackItem.metadata?.interactionLatitude && FIELD_FEEDBACKS.includes(feedbackItem.type) ? ( - - openGeolocation( - feedbackItem.metadata?.interactionLatitude, - feedbackItem.metadata?.interactionLongitude - ) - } - style={[GenericStyles.row, GenericStyles.pv12]} - > - Open map - + <> + + + openGeolocation( + feedbackItem.metadata?.interactionLatitude, + feedbackItem.metadata?.interactionLongitude + ) + } + style={[GenericStyles.row, styles.BtnPadding]} + > + Open map + + sendToWhatsapp(feedbackItem, caseDetails, agentId)} + style={[GenericStyles.row, styles.BtnPadding]} + > + } + textStyle={{ color: COLORS.BASE.BLUE }} + /> + + + ) : null} ); @@ -121,7 +271,7 @@ const styles = StyleSheet.create({ }, cardLightTitle: { fontWeight: '400', - color: '#BCBCBC', + color: COLORS.TEXT.BLACK, }, cardFooterText: { fontWeight: '400', @@ -129,6 +279,22 @@ const styles = StyleSheet.create({ }, geolocationBtn: { color: COLORS.BASE.BLUE, + marginRight: 20, + }, + container: { + flexDirection: 'row', + alignItems: 'center', + marginTop: 0, + }, + bullet: { + color: COLORS.TEXT.GREY_1, + }, + BtnPadding: { + paddingTop: 8, + paddingBottom: 8, + }, + addressItem: { + paddingHorizontal: 0, }, }); diff --git a/src/screens/caseDetails/feedback/FeedbackListContainer.tsx b/src/screens/caseDetails/feedback/FeedbackListContainer.tsx index 721f983b..31565c4a 100644 --- a/src/screens/caseDetails/feedback/FeedbackListContainer.tsx +++ b/src/screens/caseDetails/feedback/FeedbackListContainer.tsx @@ -18,6 +18,7 @@ import { getCaseUnifiedData, UnifiedCaseDetailsTypes } from '../../../action/cas interface IFeedbackListContainer { loanAccountNumber: string; feedbackList: (IFeedback | IUnSyncedFeedbackItem)[]; + caseId: string; } interface IOfflineFeedbackListContainer { @@ -66,6 +67,7 @@ const OfflineFeedbackListContainer: React.FC = ({ const FeedbackListContainer: React.FC = ({ loanAccountNumber, feedbackList, + caseId, }) => { const [retryBtnCount, setRetryBtnCount] = useState(0); @@ -97,6 +99,7 @@ const FeedbackListContainer: React.FC = ({ feedbackItem={feedbackItem} loanAccountNumber={loanAccountNumber} showHorizontalLine={++idx !== feedbackList.length} + caseId={caseId} /> ))} diff --git a/src/screens/caseDetails/feedback/FeedbackListItem.tsx b/src/screens/caseDetails/feedback/FeedbackListItem.tsx index 3b7c06a7..f7fc51c5 100644 --- a/src/screens/caseDetails/feedback/FeedbackListItem.tsx +++ b/src/screens/caseDetails/feedback/FeedbackListItem.tsx @@ -15,11 +15,13 @@ interface IFeedbackListItem { feedbackItem: IFeedback | IUnSyncedFeedbackItem; showHorizontalLine?: boolean; loanAccountNumber: string; + caseId: string; } const FeedbackListItem: React.FC = ({ feedbackItem, loanAccountNumber, + caseId, showHorizontalLine = true, }) => { const handleRouting = (route: PageRouteEnum, params: object | undefined = undefined) => { @@ -27,6 +29,7 @@ const FeedbackListItem: React.FC = ({ const commonParams = { loanAccountNumber, activeFeedbackReferenceId: (feedbackItem as IFeedback).referenceId, + caseId: caseId, }; navigateToScreen(route, { ...params, ...commonParams }); }; diff --git a/yarn.lock b/yarn.lock index 56f6ead8..27be2e18 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4705,6 +4705,18 @@ glob@5.0.15: once "^1.3.0" path-is-absolute "^1.0.0" +glob@7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a" + integrity sha512-f8c0rE8JiCxpa52kWPAOa3ZaYEnzofDzCQLCn3Vdk0Z5OVLq3BsRFJI4S4ykpeVW6QMGBUkMeUpoEgWnMTnw5Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" @@ -8236,6 +8248,14 @@ rimraf@~2.6.2: dependencies: glob "^7.1.3" +rn-fetch-blob@0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/rn-fetch-blob/-/rn-fetch-blob-0.12.0.tgz#ec610d2f9b3f1065556b58ab9c106eeb256f3cba" + integrity sha512-+QnR7AsJ14zqpVVUbzbtAjq0iI8c9tCg49tIoKO2ezjzRunN7YL6zFSFSWZm6d+mE/l9r+OeDM3jmb2tBb2WbA== + dependencies: + base-64 "0.1.0" + glob "7.0.6" + route-recognizer@^0.3.3: version "0.3.4" resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.4.tgz#39ab1ffbce1c59e6d2bdca416f0932611e4f3ca3"