react-native-priv-sdk
Version:
Official MyCover.ai SDK. Supercharge your product with MyCover AI Insurance offerings. Create embedded insurance offerings or full white label insurance applications that excite your customers.
637 lines (547 loc) • 20.5 kB
text/typescript
import { useNavigation } from '@react-navigation/native';
import type { NativeStackNavigationProp } from '@react-navigation/native-stack';
import type { RootStackParamList } from '../../utils/navigatorStackList';
import { type InspectStore, useInspectStore } from '../../store/inspectStore';
import {
CarVerificationStep,
PhoneVerificationStep,
ToastStatus,
TransactionType,
} from '../../utils/enums';
import type { FileData } from '../purchase/form/components/CustomImagePicker';
import InspectionRepository from '../../data/repositories/inspection_repo';
import ClaimRepository from '../../data/repositories/claim_repo';
import { InspectionModel } from '../../models/InspectionModel';
import GenericResponse from '../../data/api/GenericResponse';
import FileRepository from '../../data/repositories/file_repo';
import globalObject from '../../store/globalObject';
import { showToast } from '../../components/CustomToast';
const fileRepository = new FileRepository();
const inspectionRepository = new InspectionRepository();
const claimRepository = new ClaimRepository();
interface VerifyInspectionImageAIProps {
file: FileData;
vehicleSection: string;
claimId?: string;
policyId?: string;
}
interface SubmitAutoInspectionProps {
vehicleImages: Record<string, FileData>;
videoUrl: string;
address: string;
longitude: string;
latitude: string;
inspectionType: string;
timeStamp: string;
policyId?: string;
reference?: string;
}
interface SubmitGadgetInspectionProps {
gadgetImages: Record<string, FileData>;
videoUrl: string;
address: string;
longitude: string;
latitude: string;
inspectionType: string;
timeStamp: string;
policyId?: string;
reference?: string;
}
type NavigationProps = NativeStackNavigationProp<RootStackParamList>;
export const InspectionViewModel = () => {
const inspectStore = useInspectStore((state: InspectStore) => state);
// const globalInspect = useInspectStore((state: InspectStore) => state);
let {
verificationStep,
setVerificationStep,
phoneVerificationStep,
setPhoneVerificationStep,
setVerifiedCount,
} = useInspectStore();
// const verificationStep = useInspectStore(state => state.verificationStep);
// const setVerificationStep = useInspectStore(
// state => state.setVerificationStep,
// );
const navigation = useNavigation<NavigationProps>();
const verifyInspectionImageAI = async ({
file,
vehicleSection,
claimId,
policyId,
}: VerifyInspectionImageAIProps): Promise<boolean> => {
// const [isLoading, setIsLoading] = useState(false);
// const { vehicleImageUrl, setVehicleImageUrl } = useContext(VehicleImageContext); // Assume you're using context
// const { retryCount, setRetryCount } = useState(0); // Assume you're using context
try {
// Call your repository function
const res = await inspectionRepository.verifyImageAI({
file,
action:
globalObject.transactionType == TransactionType.claim
? 'claim'
: 'inspection',
vehicleSection,
policyId,
bypass: inspectStore.retryCount > 1 ? true : false, // Adjust based on retryCount
claimId,
});
if (res.data) {
const data = res.data;
// Check for valid image and URL
if (
data.is_valid_image === true &&
data.image_url &&
data.image_url.length > 0
) {
// loadingState.setInspectVmLoading(false);
inspectStore.setVehicleImageUrl(vehicleSection, data['image_url']);
inspectStore.setVehicleImage(vehicleSection, file);
// Reset retry count
inspectStore.setRetryCount(0);
return true;
} else {
// Increment retry count if the image isn't valid
const newCount = inspectStore.retryCount + 1;
inspectStore.setRetryCount(newCount);
// loadingState.setInspectVmLoading(false);
return false;
}
} else {
// No data received, increment retry count
const newCount = inspectStore.retryCount + 1;
inspectStore.setRetryCount(newCount);
// loadingState.setInspectVmLoading(false);
return false;
}
} catch (error) {
// loadingState.setInspectVmLoading(false);
// Show toast message with the error
showToast(
ToastStatus.failed,
'An error occurred during the verification process'
);
return false;
}
};
const submitAutoInspection = async ({
vehicleImages,
videoUrl,
address,
longitude,
latitude,
inspectionType,
timeStamp,
policyId,
reference,
}: SubmitAutoInspectionProps): Promise<void> => {
try {
// loadingState.setInspectVmLoading(true);
// Call your repository function
const res =
globalObject.transactionType == TransactionType.claim
? await claimRepository.submitAutoClaimInspection({
vehicleImages: vehicleImages,
videoUrl: videoUrl ?? '',
address: address,
longitude: longitude,
latitude: latitude,
inspectionType: inspectionType,
timeStamp: timeStamp,
policyId: policyId,
// reference:reference,
claimId: globalObject.claimId ?? '',
})
: await claimRepository.submitAutoInspection({
vehicleImages,
videoUrl,
address,
longitude,
latitude,
inspectionType,
timeStamp,
policyId,
reference,
});
if (res.responseCode == 1) {
// const data = res.data;
const inspection = InspectionModel.fromJson(res.data);
navigation.replace('InspectionSuccessScreen', {
inspection,
});
// Navigator.push(
// context,
// MaterialPageRoute(
// builder: (context) =>
// InspectionSuccessScreenScreen(inspection: policy)));
// showToast(ToastStatus.failed, 'Doneeee');
} else {
// loadingState.setInspectVmLoading(false);
const errorMessage =
res.errors && res.errors.length > 0
? res.errors.join(', ')
: res.message;
showToast(
ToastStatus.failed,
errorMessage
);
}
} catch (error) {
// loadingState.setInspectVmLoading(false);
// Show toast message with the error
showToast(
ToastStatus.failed,
'An error occurred during the verification process'
);
}
};
const submitGadgetInspection = async ({
gadgetImages,
videoUrl,
address,
longitude,
latitude,
inspectionType,
timeStamp,
policyId,
reference,
}: SubmitGadgetInspectionProps): Promise<void> => {
try {
const maxRetries = 3;
// loadingState.setInspectVmLoading(true);
const results = await Promise.all([
uploadWithRetry(gadgetImages['front']!, maxRetries),
uploadWithRetry(gadgetImages['back']!, maxRetries),
uploadWithRetry(gadgetImages['side']!, maxRetries),
uploadWithRetry(gadgetImages['settings']!, maxRetries),
]);
const resOne = results[0];
const resTwo = results[1];
const resThree = results[2];
const resFour = results[3];
const frontImage = resOne.data['file_url'];
const backImage = resTwo.data['file_url'];
const sideImage = resThree.data['file_url'];
const serialNumberImage = resFour.data['file_url'];
const claimId = globalObject.claimId ?? '';
const policyNumber = globalObject.policyNumber ?? '';
// Call your repository function
const res =
globalObject.transactionType == TransactionType.claim
? await claimRepository.submitGadgetClaimInspection({
videoUrl,
address,
longitude,
latitude,
frontImage,
backImage,
sideImage,
serialNumberImage,
claimId,
policyNumber,
inspectionType,
timeStamp,
policyId,
reference,
})
: await claimRepository.submitGadgetInspection({
videoUrl,
address,
longitude,
latitude,
frontImage,
backImage,
sideImage,
serialNumberImage,
inspectionType,
timeStamp,
policyId,
reference,
});
if (res.responseCode == 1) {
// const data = res.data;
const inspection = InspectionModel.fromJson(res.data);
navigation.replace('InspectionSuccessScreen', {
inspection,
});
// Navigator.push(
// context,
// MaterialPageRoute(
// builder: (context) =>
// InspectionSuccessScreenScreen(inspection: policy)));
// showToast(ToastStatus.failed, 'Doneeee');
} else {
// loadingState.setInspectVmLoading(false);
const errorMessage =
res.errors && res.errors.length > 0
? res.errors.join(', ')
: res.message;
showToast(
ToastStatus.failed,
errorMessage
);
}
} catch (error) {
// loadingState.setInspectVmLoading(false);
// Show toast message with the error
console.log(error);
showToast(
ToastStatus.failed,
'An error occurred during the verification process'
);
}
};
const uploadWithRetry = async (
file: FileData,
maxRetries: number
): Promise<GenericResponse> => {
let attempts = 0;
while (attempts < maxRetries) {
try {
const res = await fileRepository.uploadFile(file!);
if (res.responseCode === 1) {
return res; // Success
}
} catch (error) {
console.error(`Attempt ${attempts + 1} failed: ${error}`);
}
attempts++;
}
throw new Error(`Failed to upload file after ${maxRetries} attempts`);
};
/////BELOW NOT NEEDED
const updatePreCaptureToCaptureStep = async () => {
const currentStep = verificationStep;
switch (currentStep) {
case CarVerificationStep.frontSidePreCapture:
setVerificationStep(CarVerificationStep.frontSideCapture);
break;
case CarVerificationStep.chasisNumberPreCapture:
setVerificationStep(CarVerificationStep.chasisNumberCapture);
break;
case CarVerificationStep.leftSidePreCapture:
setVerificationStep(CarVerificationStep.leftSideCapture);
break;
case CarVerificationStep.backSidePreCapture:
setVerificationStep(CarVerificationStep.backSideCapture);
break;
case CarVerificationStep.rightSidePreCapture:
setVerificationStep(CarVerificationStep.rightSideCapture);
break;
case CarVerificationStep.dashboardPreCapture:
setVerificationStep(CarVerificationStep.dashboardCapture);
break;
case CarVerificationStep.interiorPreCapture:
setVerificationStep(CarVerificationStep.interiorCapture);
break;
default:
// You can add a default case to handle unexpected values, if necessary
console.error(`Unknown verification step: ${currentStep}`);
break;
}
};
const updateCaptureToVerifyStep = async () => {
const currentStep = verificationStep;
switch (currentStep) {
case CarVerificationStep.frontSideCapture:
setVerificationStep(CarVerificationStep.frontSideVerify);
break;
case CarVerificationStep.chasisNumberCapture:
setVerificationStep(CarVerificationStep.chasisNumberVerify);
break;
case CarVerificationStep.leftSideCapture:
setVerificationStep(CarVerificationStep.leftSideVerify);
break;
case CarVerificationStep.backSideCapture:
setVerificationStep(CarVerificationStep.backSideVerify);
break;
case CarVerificationStep.rightSideCapture:
setVerificationStep(CarVerificationStep.rightSideVerify);
break;
case CarVerificationStep.dashboardCapture:
setVerificationStep(CarVerificationStep.dashboardVerify);
break;
case CarVerificationStep.interiorCapture:
setVerificationStep(CarVerificationStep.interiorVerify);
break;
default:
console.error(`Unknown capture step: ${currentStep}`);
break;
}
};
const updateVerifyToCaptureToStep = async () => {
const currentStep = verificationStep;
switch (currentStep) {
case CarVerificationStep.frontSideVerify:
case CarVerificationStep.frontSideFailed:
setVerificationStep(CarVerificationStep.frontSideCapture);
break;
case CarVerificationStep.chasisNumberVerify:
case CarVerificationStep.chasisNumberFailed:
setVerificationStep(CarVerificationStep.chasisNumberCapture);
break;
case CarVerificationStep.leftSideVerify:
case CarVerificationStep.leftSideFailed:
setVerificationStep(CarVerificationStep.leftSideCapture);
break;
case CarVerificationStep.backSideVerify:
case CarVerificationStep.backSideFailed:
setVerificationStep(CarVerificationStep.backSideCapture);
break;
case CarVerificationStep.rightSideVerify:
case CarVerificationStep.rightSideFailed:
setVerificationStep(CarVerificationStep.rightSideCapture);
break;
case CarVerificationStep.dashboardVerify:
case CarVerificationStep.dashboardFailed:
setVerificationStep(CarVerificationStep.dashboardCapture);
break;
case CarVerificationStep.interiorVerify:
case CarVerificationStep.interiorFailed:
setVerificationStep(CarVerificationStep.interiorCapture);
break;
default:
console.error(`Unknown verification step: ${currentStep}`);
break;
}
};
/////GADGET
const updateGadgetPreCaptureToCaptureStep = async () => {
if (phoneVerificationStep === PhoneVerificationStep.phoneFrontPreCapture) {
setPhoneVerificationStep(PhoneVerificationStep.phoneFrontCapture);
} else if (
phoneVerificationStep === PhoneVerificationStep.phoneBackPreCapture
) {
setPhoneVerificationStep(PhoneVerificationStep.phoneBackCapture);
} else if (
phoneVerificationStep === PhoneVerificationStep.phoneSettingsPreCapture
) {
setPhoneVerificationStep(PhoneVerificationStep.phoneSettingsCapture);
} else if (
phoneVerificationStep === PhoneVerificationStep.phoneSidePreCapture
) {
setPhoneVerificationStep(PhoneVerificationStep.phoneSideCapture);
}
};
const updateGadgetCaptureToVerifyStep = async () => {
if (phoneVerificationStep === PhoneVerificationStep.phoneFrontCapture) {
setPhoneVerificationStep(PhoneVerificationStep.phoneFrontVerify);
} else if (
phoneVerificationStep === PhoneVerificationStep.phoneBackCapture
) {
setPhoneVerificationStep(PhoneVerificationStep.phoneBackVerify);
} else if (
phoneVerificationStep === PhoneVerificationStep.phoneSettingsCapture
) {
setPhoneVerificationStep(PhoneVerificationStep.phoneSettingsVerify);
} else if (
phoneVerificationStep === PhoneVerificationStep.phoneSideCapture
) {
setPhoneVerificationStep(PhoneVerificationStep.phoneSideVerify);
}
};
const updateGadgetVerificationStep = async () => {
if (phoneVerificationStep === PhoneVerificationStep.phoneFrontVerify) {
setPhoneVerificationStep(PhoneVerificationStep.phoneBackPreCapture);
setVerifiedCount(1);
} else if (
phoneVerificationStep === PhoneVerificationStep.phoneBackVerify
) {
setPhoneVerificationStep(PhoneVerificationStep.phoneSettingsPreCapture);
setVerifiedCount(2);
} else if (
phoneVerificationStep === PhoneVerificationStep.phoneSettingsVerify
) {
setPhoneVerificationStep(PhoneVerificationStep.phoneSidePreCapture);
setVerifiedCount(3);
} else if (
phoneVerificationStep === PhoneVerificationStep.phoneSideVerify
) {
// const videoFile = stopVideo ? await stopVideo() : null;
setVerifiedCount(4);
// if (videoFile) {
// // Navigate to GadgetInspectionSummaryScreen and pass the video file
// navigation.replace('GadgetInspectionSummary', { videoFile });
// }
}
};
const updateGadgetVerifyToCaptureToStep = async () => {
if (phoneVerificationStep === PhoneVerificationStep.phoneFrontVerify) {
setPhoneVerificationStep(PhoneVerificationStep.phoneFrontCapture);
} else if (
phoneVerificationStep === PhoneVerificationStep.phoneBackVerify
) {
setPhoneVerificationStep(PhoneVerificationStep.phoneBackCapture);
} else if (
phoneVerificationStep === PhoneVerificationStep.phoneSettingsVerify
) {
setPhoneVerificationStep(PhoneVerificationStep.phoneSettingsCapture);
} else if (
phoneVerificationStep === PhoneVerificationStep.phoneSideVerify
) {
setPhoneVerificationStep(PhoneVerificationStep.phoneSideCapture);
}
// Function to update verification step based on status
};
// const updateVerificationStep = async (status: boolean, file: FileData) => {
const updateVerificationStep = async (status: boolean) => {
const currentStep = verificationStep;
setVerificationStep(CarVerificationStep.verificationLoading);
if (status) {
if (currentStep === CarVerificationStep.frontSideVerify) {
setVerificationStep(CarVerificationStep.chasisNumberPreCapture);
setVerifiedCount(1);
} else if (currentStep === CarVerificationStep.chasisNumberVerify) {
setVerificationStep(CarVerificationStep.leftSidePreCapture);
setVerifiedCount(2);
} else if (currentStep === CarVerificationStep.leftSideVerify) {
setVerificationStep(CarVerificationStep.backSidePreCapture);
setVerifiedCount(3);
} else if (currentStep === CarVerificationStep.backSideVerify) {
setVerificationStep(CarVerificationStep.rightSidePreCapture);
setVerifiedCount(4);
} else if (currentStep === CarVerificationStep.rightSideVerify) {
setVerificationStep(CarVerificationStep.dashboardPreCapture);
setVerifiedCount(5);
} else if (currentStep === CarVerificationStep.dashboardVerify) {
setVerificationStep(CarVerificationStep.interiorPreCapture);
setVerifiedCount(6);
} else if (currentStep === CarVerificationStep.interiorVerify) {
// const video = stopVideo ? await stopVideo() : null;
setVerificationStep(CarVerificationStep.verificationCompleted);
setVerifiedCount(7);
// if (video) {
// navigation.replace('VeicleInspectionSummaryScreen', { videoFile: video });
// }
}
} else {
if (currentStep === CarVerificationStep.frontSideVerify) {
setVerificationStep(CarVerificationStep.frontSideFailed);
} else if (currentStep === CarVerificationStep.chasisNumberVerify) {
setVerificationStep(CarVerificationStep.chasisNumberFailed);
} else if (currentStep === CarVerificationStep.leftSideVerify) {
setVerificationStep(CarVerificationStep.leftSideFailed);
} else if (currentStep === CarVerificationStep.backSideVerify) {
setVerificationStep(CarVerificationStep.backSideFailed);
} else if (currentStep === CarVerificationStep.rightSideVerify) {
setVerificationStep(CarVerificationStep.rightSideFailed);
} else if (currentStep === CarVerificationStep.dashboardVerify) {
setVerificationStep(CarVerificationStep.dashboardFailed);
} else {
setVerificationStep(CarVerificationStep.interiorFailed);
}
}
};
return {
verifyInspectionImageAI,
submitAutoInspection,
submitGadgetInspection,
updatePreCaptureToCaptureStep,
updateCaptureToVerifyStep,
updateVerificationStep,
updateGadgetPreCaptureToCaptureStep,
updateGadgetCaptureToVerifyStep,
updateGadgetVerificationStep,
updateGadgetVerifyToCaptureToStep,
updateVerifyToCaptureToStep,
};
};