Merge pull request #611 from navi-medici/whatsapp-business-share-v2

Whatsapp Business share implemented
This commit is contained in:
Varnit Goyal
2023-10-12 19:29:45 +05:30
committed by GitHub
4 changed files with 183 additions and 140 deletions

View File

@@ -35,6 +35,7 @@
<queries>
<package android:name="com.whatsapp" />
<package android:name="com.whatsapp.w4b" />
</queries>
<uses-permission android:name="android.permission.USE_EXACT_ALARM"/>
<application

View File

@@ -28,6 +28,7 @@ import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Environment;
import android.os.Handler;
import android.os.Parcelable;
import android.util.Base64;
import android.os.Looper;
@@ -39,6 +40,7 @@ import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -71,7 +73,7 @@ public class DeviceUtilsModule extends ReactContextBaseJavaModule {
@Override
public void onActivityResult(Activity activity, int i, int i1, @Nullable Intent intent) {
if(i1 != RESULT_CANCELED) {
if (i == WHATSAPP_SHARE_REQUEST_CODE) {
if (i == WHATSAPP_SHARE_REQUEST_CODE && (imageFile!=null)) {
new File(Uri.fromFile(imageFile).getPath()).delete();
}
}
@@ -180,50 +182,87 @@ public class DeviceUtilsModule extends ReactContextBaseJavaModule {
}
}
public boolean isWhatsAppInstalled() {
public ArrayList<String> isWhatsAppInstalled() {
PackageManager packageManager = RNContext.getPackageManager();
List<PackageInfo> packages = packageManager.getInstalledPackages(PackageManager.GET_META_DATA);
ArrayList<String> appsInstalled = new ArrayList<String>();
for (PackageInfo packageInfo : packages) {
String packageName = packageInfo.packageName;
if(packageName.equals("com.whatsapp")){
return true;
if(packageName.equals("com.whatsapp") || packageName.equals("com.whatsapp.w4b")){
appsInstalled.add(packageName);
}
}
return false;
return appsInstalled;
}
public Intent getWhatsappShareIntent(String message, String imageUrl, String mimeType, String packageName) {
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, message);
if (imageUrl.equals("")) {
sendIntent.setType("text/plain");
sendIntent.setPackage(packageName);
} 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(packageName);
}
return sendIntent;
}
@ReactMethod
public void sendFeedbackToWhatsapp(String message, String imageUrl, String mimeType, Promise promise) {
try{
if(!isWhatsAppInstalled()){
ArrayList<String> appsInstalled = isWhatsAppInstalled();
int numberOfAppsInstalled = appsInstalled.size();
if(numberOfAppsInstalled == 0){
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);
else if(numberOfAppsInstalled == 1) {
String packageName = appsInstalled.get(0);
Intent sendIntent = getWhatsappShareIntent(message, imageUrl, mimeType, packageName);
if(getCurrentActivity()!=null) {
getCurrentActivity().startActivityForResult(sendIntent, WHATSAPP_SHARE_REQUEST_CODE);
}
promise.resolve(true);
return;
}
else {
String packageName1 = appsInstalled.get(0);
String packageName2 = appsInstalled.get(1);
//Firing two intents, one for WhatsApp, another for WhatsApp business
Intent sendIntent1 = getWhatsappShareIntent(message, imageUrl, mimeType, packageName1);
Intent sendIntent2 = getWhatsappShareIntent(message, imageUrl, mimeType, packageName2);
ArrayList<Intent> appIntents = new ArrayList<>();
appIntents.add(sendIntent1);
appIntents.add(sendIntent2);
Intent defaultIntent = new Intent(android.content.Intent.ACTION_SEND);
defaultIntent.setType("text/plain");
defaultIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Sharing to WhatsApp");
Intent chooserIntent = Intent.createChooser(defaultIntent, "Share via");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, appIntents.toArray(new Parcelable[appIntents.size()]));
if (getCurrentActivity() != null) {
getCurrentActivity().startActivityForResult(chooserIntent, WHATSAPP_SHARE_REQUEST_CODE);
}
promise.resolve(true);
return;
}
promise.resolve(true);
return;
} catch (Error e){
promise.reject("errorCode","2");

View File

@@ -368,10 +368,3 @@ 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;
}

View File

@@ -10,8 +10,8 @@ import {
} from '../../../../RN-UI-LIB/src/utlis/dates';
import { CaseDetail, Address as IAddress, IGeolocation, VisitType } from '../interface';
import {
debounce,
getGoogleMapUrl,
insertCommasinAmount,
sanitizeString,
} from '../../../components/utlis/commonFunctions';
import {
@@ -33,6 +33,7 @@ import { useAppSelector } from '../../../hooks';
import { toast } from '../../../../RN-UI-LIB/src/components/toast';
import { ToastMessages } from '../../allCases/constants';
import { sendFeedbackToWhatsapp } from '../../../components/utlis/DeviceUtils';
import { getSanitizedCommaAmount } from '@rn-ui-lib/utils/amount';
interface IFeedbackDetailItem {
feedbackItem: IFeedback;
@@ -71,122 +72,128 @@ function getLocationLink(latitude: string, longitude: string): string {
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,
const FeedbackDetailItem = ({ feedbackItem, isExpanded, caseId }: IFeedbackDetailItem) => {
const caseDetails = useAppSelector((state) => state.allCases.caseDetails[caseId]);
const { agentId } = useAppSelector((state) => ({ agentId: state.user.user?.referenceId!! }));
const [isWhastappSendLoading, setIsWhatsappSendLoading] = useState(false);
const isGeolocation = feedbackItem?.source?.sourceType === VisitType.GEOLOCATION;
const sendToWhatsappNative = (
message: string,
imageUrl: string,
mimeType: string,
caseDetails: CaseDetail,
agentId: string
) => {
setIsWhatsappSendLoading(true);
sendFeedbackToWhatsapp(message, imageUrl, mimeType)
.then((res: boolean) => {
addClickstreamEvent(CLICKSTREAM_EVENT_NAMES.FA_SHARE_SUCCESSFUL, {
caseId: caseDetails?.id,
agentId: agentId,
});
setIsWhatsappSendLoading(false);
})
.catch((err: Error) => {
setIsWhatsappSendLoading(false);
if (err.message === '1') {
toast({
text1: ToastMessages.WHATSAPP_NOT_INSTALLED,
type: 'error',
});
} else {
toast({
text1: ToastMessages.WHATSAPP_FEEDBACK_SHARE_FAILURE,
type: 'error',
});
}
});
})
.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) => {
setIsWhatsappSendLoading(true);
addClickstreamEvent(CLICKSTREAM_EVENT_NAMES.FA_SHARE_FEEDBACK_CLICKED, {
caseId: caseDetails?.id,
agentId: agentId,
});
};
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)}
let 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
*EMI Amount*: ₹${getSanitizedCommaAmount(caseDetails?.currentOutstandingEmi)}\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';
}
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';
}
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;
}
{
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');
}
const imagesList = feedbackItem?.answerViews.filter(
(answer) => answer.questionTag === OPTION_TAG.IMAGE_UPLOAD
);
let imageUrl = '';
const mimeType = 'image/*';
if (imagesList.length > 0) {
let imageUri = '';
imageUri = imagesList[0]?.inputText ? imagesList[0].inputText : '';
let imagePath = '';
ReactNativeBlobUtil.config({
fileCache: true,
})
.then((base64Data: any) => {
imageUrl = base64Data;
sendToWhatsappNative(message, imageUrl, mimeType, caseDetails, agentId);
ReactNativeBlobUtil.fs.unlink(imagePath);
});
} else {
sendToWhatsappNative(message, imageUrl, mimeType, caseDetails, agentId);
}
};
.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,
hideAddress,
}: IFeedbackDetailItem) => {
const isGeolocation = feedbackItem?.source?.sourceType === VisitType.GEOLOCATION;
const caseDetails = useAppSelector((state) => state.allCases.caseDetails[caseId]);
const { agentId } = useAppSelector((state) => ({ agentId: state.user.user?.referenceId!! }));
const throttledSendToWhatsapp = React.useRef(debounce(sendToWhatsapp, 500));
return (
<View style={[styles.addressItem]}>
<View style={[GenericStyles.row, GenericStyles.alignCenter]}>
@@ -273,8 +280,11 @@ const FeedbackDetailItem = ({
) : null}
<TouchableOpacity
activeOpacity={0.7}
onPress={() => sendToWhatsapp(feedbackItem, caseDetails, agentId)}
onPress={() => {
throttledSendToWhatsapp.current(feedbackItem, caseDetails, agentId);
}}
style={[GenericStyles.row, styles.BtnPadding]}
disabled={isWhastappSendLoading}
>
<IconLabel
text="Share"