diff --git a/ProtectedRouter.tsx b/ProtectedRouter.tsx index b7a0d551..ac0ba48a 100644 --- a/ProtectedRouter.tsx +++ b/ProtectedRouter.tsx @@ -34,6 +34,7 @@ import { getCaseUnifiedData, UnifiedCaseDetailsTypes } from './src/action/caseAp import FeedbackDetailContainer from './src/screens/caseDetails/feedback/FeedbackDetailContainer'; import EmiSchedule from './src/screens/emiSchedule'; import { NetworkStatusService } from "./src/services/network-monitoring.service"; +import AddNewNumber from './src/screens/addNewNumber'; const ANIMATION_DURATION = 300; @@ -264,6 +265,16 @@ const ProtectedRouter = () => { }} listeners={getScreenFocusListenerObj} /> + null, + animation: 'slide_from_right', + animationDuration: ANIMATION_DURATION, + }} + listeners={getScreenFocusListenerObj} + /> ) : ( <> diff --git a/src/reducer/allCasesSlice.ts b/src/reducer/allCasesSlice.ts index 1dd3f8e7..3dcbb182 100644 --- a/src/reducer/allCasesSlice.ts +++ b/src/reducer/allCasesSlice.ts @@ -352,7 +352,7 @@ const allCasesSlice = createSlice({ if (newVisitCaseLoanIds?.length > 0) { addClickstreamEvent( - CLICKSTREAM_EVENT_NAMES.FIELD_APP_CASES_PINNED_UPDATED, + CLICKSTREAM_EVENT_NAMES.FA_VISIT_PLAN_UPDATED, { newPinCases: [...newVisitCaseLoanIds], currentPinCases: pinnedList.map(item => @@ -372,7 +372,7 @@ const allCasesSlice = createSlice({ } if(removedVisitedCasesLoanIds.length > 0) { addClickstreamEvent( - CLICKSTREAM_EVENT_NAMES.FIELD_APP_CASES_PINNED_UPDATED, + CLICKSTREAM_EVENT_NAMES.FA_VISIT_PLAN_UPDATED, { newUnpinCases: [...removedVisitedCasesLoanIds], currentPinCases: pinnedList.map(item => diff --git a/src/screens/addNewNumber/apiHelper.ts b/src/screens/addNewNumber/apiHelper.ts new file mode 100644 index 00000000..ac976157 --- /dev/null +++ b/src/screens/addNewNumber/apiHelper.ts @@ -0,0 +1,52 @@ +import { AxiosResponse } from 'axios'; +import { PageRouteEnum } from '../../../ProtectedRouter'; +import { toast } from '../../../RN-UI-LIB/src/components/toast'; +import { GenericFunctionArgs } from '../../common/GenericTypes'; +import axiosInstance from '../../components/utlis/apiHelper'; +import { navigateToScreen } from '../../components/utlis/navigationUtlis'; +import { Source, Tag } from './const'; + +interface IAddNewNumberApi { + tag: Tag; + source: Source; + number: string; + customerReferenceId: string; + caseId: string; +} +export const addNewNumberApi = ( + data: IAddNewNumberApi, + afterApiCallback?: GenericFunctionArgs, +) => { + const { tag, source, number, customerReferenceId, caseId } = data; + const url = '/telephones'; + const payload = [ + { + number, + tag, + origin: source, + }, + ]; + axiosInstance + .post(url, payload, { + params: { + customerReferenceId, + }, + }) + .then((response: AxiosResponse) => { + if (response.status === 200) { + toast({ + type: 'info', + text1: 'Number added successfully', + }); + navigateToScreen(PageRouteEnum.COLLECTION_CASE_DETAIL, { + caseId: caseId, + }); + } + }) + .catch(error => { + return error?.response?.data || error?.message || error; + }) + .finally(() => { + afterApiCallback && afterApiCallback(); + }); +}; diff --git a/src/screens/addNewNumber/const.ts b/src/screens/addNewNumber/const.ts new file mode 100644 index 00000000..07325f0c --- /dev/null +++ b/src/screens/addNewNumber/const.ts @@ -0,0 +1,12 @@ +export enum Tag { + Customer = 'Customer', + Relative = 'Relative', + Others = 'Others', +} + +export enum Source { + Relative = 'Relative', + Neighbour = 'Neighbour', + Security = 'Security', + Others = 'Others', +} diff --git a/src/screens/addNewNumber/index.tsx b/src/screens/addNewNumber/index.tsx new file mode 100644 index 00000000..c7e0b2be --- /dev/null +++ b/src/screens/addNewNumber/index.tsx @@ -0,0 +1,233 @@ +import { SafeAreaView, View, StyleSheet } from 'react-native'; +import React, { useState } from 'react'; +import Text from '../../../RN-UI-LIB/src/components/Text'; +import Layout from '../layout/Layout'; +import NavigationHeader, { + Icon, +} from '../../../RN-UI-LIB/src/components/NavigationHeader'; +import TextInput from '../../../RN-UI-LIB/src/components/TextInput'; +import Button from '../../../RN-UI-LIB/src/components/Button'; +import { popToScreen } from '../../components/utlis/navigationUtlis'; +import { GenericStyles, getShadowStyle } from '../../../RN-UI-LIB/src/styles'; +import Dropdown from '../../../RN-UI-LIB/src/components/dropdown/Dropdown'; +import { Controller, useForm } from 'react-hook-form'; +import { Source, Tag } from './const'; +import DropdownItem from '../registerPayements/DropdownItem'; +import { getDynamicBottomSheetHeightPercentageFn } from '../../components/utlis/commonFunctions'; +import { addNewNumberApi } from './apiHelper'; +import { useAppSelector } from '../../hooks'; + +interface IAddNewNumber { + number: string; + source: Source; + tag: Tag; +} +const HEADER_HEIGHT = 100; +const ROW_HEIGHT = 40; + +interface IAddNewNumber { + route: { + params: { + caseId: string; + }; + }; +} + +const AddNewNumber: React.FC = props => { + const [loading, setLoading] = useState(false); + const { caseId } = props.route.params; + const { customerReferenceId } = useAppSelector( + state => state.allCases.caseDetails[caseId], + ); + const { + control, + getValues, + formState: { isValid, defaultValues, errors }, + trigger, + } = useForm({ + defaultValues: { + number: '', + source: undefined, + tag: undefined, + }, + mode: 'onChange', + }); + const onBack = () => { + popToScreen(1); + }; + + const SourceChildComponents = Object.values(Source).map(source => { + return ; + }); + + const TagChildComponents = Object.values(Tag).map(tag => { + return ; + }); + + const getBottomSheetHeight = getDynamicBottomSheetHeightPercentageFn( + HEADER_HEIGHT, + ROW_HEIGHT, + ); + + const addCtaHandler = () => { + setLoading(true); + addNewNumberApi( + { + customerReferenceId: customerReferenceId, + ...getValues(), + caseId, + }, + () => { + setLoading(false); + }, + ); + }; + + return ( + + + + + + + + Add new number + + ( + { + onChange(number); + trigger(); + }} + keyboardType="numeric" + placeholder="Enter here" + maxLength={10} + /> + )} + name="number" + rules={{ + required: true, + minLength: 10, + min: 10, + }} + /> + + + + Source of the number + + ( + { + onChange(number); + trigger(); + }} + bottomSheetHeight={getBottomSheetHeight( + Object.values(Source).length, + )} + header="Source of the number" + value={value ?? ''}> + {SourceChildComponents} + + )} + name="source" + rules={{ required: true }} + /> + + + + Tag number + + ( + { + onChange(number); + trigger(); + }} + bottomSheetHeight={getBottomSheetHeight( + Object.values(Tag).length, + )} + header="Tag number" + value={value ?? ''}> + {TagChildComponents} + + )} + name="tag" + rules={{ required: true }} + /> + + + + +