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"