From 8959d58c88155d7ce57e878a4d497ea59db0bbda Mon Sep 17 00:00:00 2001 From: Mantri Ramkishor Date: Fri, 15 Nov 2024 17:21:49 +0530 Subject: [PATCH] NTP-7914 | Feedback Section Revamp (#1009) --- RN-UI-LIB | 2 +- android/app/build.gradle | 4 +- package.json | 4 +- src/action/feedbackActions.ts | 27 +++ src/assets/icons/NotAttemptedIcon.tsx | 19 ++ src/assets/icons/RightChevronIcon.tsx | 20 ++ src/assets/icons/SmsIcon.tsx | 10 +- src/reducer/topFeedbacksSlice.ts | 44 ++++ .../caseDetails/FeedbackDetailsSection.tsx | 62 ++---- .../feedback/FeedbackDetailContainer.tsx | 8 +- .../feedback/FeedbackDetailItem.tsx | 8 +- .../feedback/FeedbackListContainer.tsx | 29 +-- .../caseDetails/feedback/FeedbackListItem.tsx | 191 +++++++++++------- .../caseDetails/feedback/FeedbackLoading.tsx | 60 ++++++ .../caseDetails/feedback/TopFeedbacks.tsx | 90 +++++++++ src/screens/caseDetails/feedback/types.ts | 9 + src/store/store.ts | 2 + src/types/feedback.types.ts | 3 + 18 files changed, 447 insertions(+), 145 deletions(-) create mode 100644 src/assets/icons/NotAttemptedIcon.tsx create mode 100644 src/assets/icons/RightChevronIcon.tsx create mode 100644 src/reducer/topFeedbacksSlice.ts create mode 100644 src/screens/caseDetails/feedback/FeedbackLoading.tsx create mode 100644 src/screens/caseDetails/feedback/TopFeedbacks.tsx create mode 100644 src/screens/caseDetails/feedback/types.ts diff --git a/RN-UI-LIB b/RN-UI-LIB index 019bc50b..348345f1 160000 --- a/RN-UI-LIB +++ b/RN-UI-LIB @@ -1 +1 @@ -Subproject commit 019bc50b015b464438047e37c6253cb41af4bf68 +Subproject commit 348345f1bb3af8b78a8246231dbc440ddc02de32 diff --git a/android/app/build.gradle b/android/app/build.gradle index 55bdff23..14564e09 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -134,8 +134,8 @@ def reactNativeArchitectures() { return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"] } -def VERSION_CODE = 213 -def VERSION_NAME = "2.14.13" +def VERSION_CODE = 214 +def VERSION_NAME = "2.15.0" android { ndkVersion rootProject.ext.ndkVersion diff --git a/package.json b/package.json index 2867af09..bdb2de35 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "AV_APP", - "version": "2.14.13", - "buildNumber": "213", + "version": "2.15.0", + "buildNumber": "214", "private": true, "scripts": { "android:dev": "yarn move:dev && react-native run-android", diff --git a/src/action/feedbackActions.ts b/src/action/feedbackActions.ts index 00f89844..e38b4274 100644 --- a/src/action/feedbackActions.ts +++ b/src/action/feedbackActions.ts @@ -1,5 +1,7 @@ +import { AppDispatch } from '@store'; import axiosInstance, { ApiKeys, getApiUrl } from '../components/utlis/apiHelper'; import { logError } from '../components/utlis/errorUtils'; +import { setTopFeedbacks, setTopFeedbacksLoading } from '@reducers/topFeedbacksSlice'; interface IPastFeedbacksPayload { loan_account_number: string; @@ -70,3 +72,28 @@ export const getPastFeedbacksOnAddresses = (pastFeedbackPayload: IPastFeedbacksP logError(err); }); }; + +export const getTopFeedbacks = (loanAccountNumber: string) => (dispatch: AppDispatch) => { + // TODO: Change API Endpoint + const url = getApiUrl(ApiKeys.PAST_FEEDBACK_ON_ADDRESSES); + dispatch(setTopFeedbacksLoading({ loanAccountNumber, isLoading: true })); + return axiosInstance + .get(url, { + params: { loanAccountNumber }, + }) + .then((response) => { + dispatch( + setTopFeedbacks({ + loanAccountNumber, + feedbacks: [ + response?.data?.data?.currentMonthFeedbackStatus, + response?.data?.data?.lastMonthFeedbackStatus, + ], + }) + ); + }) + .catch((err) => { + dispatch(setTopFeedbacksLoading({ loanAccountNumber, isLoading: false })); + logError(err); + }); +}; diff --git a/src/assets/icons/NotAttemptedIcon.tsx b/src/assets/icons/NotAttemptedIcon.tsx new file mode 100644 index 00000000..8d1f5ab4 --- /dev/null +++ b/src/assets/icons/NotAttemptedIcon.tsx @@ -0,0 +1,19 @@ +import * as React from 'react'; +import Svg, { Path } from 'react-native-svg'; + +function NotAttemptedIcon() { + return ( + + + + + ); +} + +export default NotAttemptedIcon; diff --git a/src/assets/icons/RightChevronIcon.tsx b/src/assets/icons/RightChevronIcon.tsx new file mode 100644 index 00000000..69e11441 --- /dev/null +++ b/src/assets/icons/RightChevronIcon.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import { G, Mask, Path, Rect, Svg } from 'react-native-svg'; + +const RightChevronIcon = () => { + return ( + + + + + + + + + ); +}; + +export default RightChevronIcon; diff --git a/src/assets/icons/SmsIcon.tsx b/src/assets/icons/SmsIcon.tsx index 9cf1f046..23591e2b 100644 --- a/src/assets/icons/SmsIcon.tsx +++ b/src/assets/icons/SmsIcon.tsx @@ -3,13 +3,13 @@ import Svg, { Mask, Path, G, Rect } from 'react-native-svg'; function SmsIcon() { return ( - - - + + + - + diff --git a/src/reducer/topFeedbacksSlice.ts b/src/reducer/topFeedbacksSlice.ts new file mode 100644 index 00000000..774ca90d --- /dev/null +++ b/src/reducer/topFeedbacksSlice.ts @@ -0,0 +1,44 @@ +import { createSlice, PayloadAction } from '@reduxjs/toolkit'; + +interface ITopFeedback { + status: string; + color: string; + referenceId: string; + offset: number; + createdAt: string; + type: string; +} + +interface ITopFeedbackState { + [loanAccountNumber: string]: { + feedbacks: ITopFeedback[]; + isLoading: boolean; + }; +} + +const initialState: ITopFeedbackState = {}; + +const TopFeedbacksSlice = createSlice({ + name: 'topFeedbacks', + initialState, + reducers: { + setTopFeedbacks: (state, action) => { + const { loanAccountNumber, feedbacks } = action.payload || {}; + state[loanAccountNumber] = { + ...(state[loanAccountNumber] || {}), + feedbacks, + }; + }, + setTopFeedbacksLoading: (state, action) => { + const { loanAccountNumber, isLoading } = action.payload || {}; + state[loanAccountNumber] = { + ...(state?.[loanAccountNumber] || {}), + isLoading: isLoading, + }; + }, + }, +}); + +export const { setTopFeedbacks, setTopFeedbacksLoading } = TopFeedbacksSlice.actions; + +export default TopFeedbacksSlice.reducer; diff --git a/src/screens/caseDetails/FeedbackDetailsSection.tsx b/src/screens/caseDetails/FeedbackDetailsSection.tsx index b3b95be3..fe4ab5c6 100644 --- a/src/screens/caseDetails/FeedbackDetailsSection.tsx +++ b/src/screens/caseDetails/FeedbackDetailsSection.tsx @@ -60,63 +60,45 @@ const FeedbackDetailsSection = ({ caseId }: IFeedbackDetailsSection) => { return notSyncedCases; }; return ( - + - - - Feedbacks - - {feedbackList?.length ? ( - - [GenericStyles.flex20, { opacity: pressed ? 0.7 : 1 }]} - > - Open all feedbacks - - - ) : null} - + Recent feedbacks + {feedbackList?.length ? ( + [{ opacity: pressed ? 0.7 : 1 }]} + > + View all + + ) : null} + + + - - ); }; export const styles = StyleSheet.create({ secondSection: { - alignSelf: 'center', borderRadius: 16, - width: '100%', - position: 'relative', - overflow: 'hidden', }, textContainer: { fontSize: 13, lineHeight: 18, - color: COLORS.TEXT.LIGHT, + color: COLORS.TEXT.BLACK, }, feedbackBtn: { fontWeight: '500', diff --git a/src/screens/caseDetails/feedback/FeedbackDetailContainer.tsx b/src/screens/caseDetails/feedback/FeedbackDetailContainer.tsx index c882acab..1fc0016d 100644 --- a/src/screens/caseDetails/feedback/FeedbackDetailContainer.tsx +++ b/src/screens/caseDetails/feedback/FeedbackDetailContainer.tsx @@ -50,6 +50,7 @@ interface IFeedbackDetailContainer { addressText?: string; activeFeedbackReferenceId?: string; caseId: string; + pageNo?: number; }; }; } @@ -77,6 +78,7 @@ const FeedbackDetailContainer: React.FC = ({ route: ro addressReferenceIds, addressText, caseId, + pageNo = 1, }, } = routeParams; @@ -101,7 +103,7 @@ const FeedbackDetailContainer: React.FC = ({ route: ro const [totalPage, setTotalPage] = useState(!isPastFeedbackOnAddress ? feedbackTotalPages : 0); const [loading, setLoading] = useState(false); - const [currentPage, setCurrentPage] = useState(1); + const [currentPage, setCurrentPage] = useState(pageNo); const [dataSourceCord, setDataSourceCord] = useState(0); const [ref, setRef] = useState(); const [showFilterModal, setShowFilterModal] = useState(false); @@ -169,6 +171,10 @@ const FeedbackDetailContainer: React.FC = ({ route: ro } }, [isOnline]); + useEffect(() => { + setCurrentPage(pageNo ?? 1); + }, [pageNo]) + useEffect(() => { if (isPastFeedbackOnAddress) { addClickstreamEvent(CLICKSTREAM_EVENT_NAMES.FA_ADDRESS_FEEDBACK_LANDED, { diff --git a/src/screens/caseDetails/feedback/FeedbackDetailItem.tsx b/src/screens/caseDetails/feedback/FeedbackDetailItem.tsx index fc6f1b0c..96a00d5a 100644 --- a/src/screens/caseDetails/feedback/FeedbackDetailItem.tsx +++ b/src/screens/caseDetails/feedback/FeedbackDetailItem.tsx @@ -1,4 +1,4 @@ -import React, { useRef, ReactNode, useEffect, useState } from 'react'; +import React, { ReactNode, 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'; @@ -8,7 +8,7 @@ import { BUSINESS_TIME_FORMAT, dateFormat, } from '../../../../RN-UI-LIB/src/utlis/dates'; -import { Address, CaseDetail, Address as IAddress, IGeolocation, VisitType } from '../interface'; +import { Address, Address as IAddress, IGeolocation, VisitType } from '../interface'; import { debounce, getGoogleMapUrl, @@ -18,7 +18,6 @@ import { FIELD_FEEDBACKS, ICallingFeedback, IFeedback, - OPTION_TAG, } from '../../../types/feedback.types'; import MapIcon from '../../../../RN-UI-LIB/src/Icons/MapIcon'; import { FEEDBACK_TYPE } from '../../../types/feedback.types'; @@ -31,7 +30,7 @@ import WhatsAppFeedbackShareIcon from '../../../assets/icons/WhatsAppIcon'; import { useAppSelector } from '../../../hooks'; import { shareToWhatsapp } from '../../../services/FeedbackWhatsApp'; import SmsIcon from "@assets/icons/SmsIcon"; -import Button from '@rn-ui-lib/components/Button'; +import NotAttemptedIcon from '@assets/icons/NotAttemptedIcon'; interface IFeedbackDetailItem { feedbackItem: IFeedback; @@ -46,6 +45,7 @@ export const feedbackTypeIcon: Record = { SELF_CALL: , CALL_BRIDGE: , GEN_AI_BOT_FIELD: , + NOT_ATTEMPTED: }; const getAddress = (address?: Address) => { diff --git a/src/screens/caseDetails/feedback/FeedbackListContainer.tsx b/src/screens/caseDetails/feedback/FeedbackListContainer.tsx index 62016f9e..78564294 100644 --- a/src/screens/caseDetails/feedback/FeedbackListContainer.tsx +++ b/src/screens/caseDetails/feedback/FeedbackListContainer.tsx @@ -8,12 +8,13 @@ import { GenericFunctionArgs } from '../../../common/GenericTypes'; import Heading from '../../../../RN-UI-LIB/src/components/Heading'; import LoadingIcon from '../../../../RN-UI-LIB/src/Icons/LoadingIcon'; import FeedbackListItem from './FeedbackListItem'; -import { useAppDispatch, useAppSelector } from '../../../hooks'; +import { useAppDispatch } from '../../../hooks'; import useIsOnline from '../../../hooks/useIsOnline'; import NoFeedbackIcon from '../../../assets/icons/NoFeedbackIcon'; -import { RootState } from '../../../store/store'; import OfflineIcon from '../../../../RN-UI-LIB/src/Icons/OfflineIcon'; import { getCaseUnifiedData, UnifiedCaseDetailsTypes } from '../../../action/caseApiActions'; +import SuspenseLoader from '@rn-ui-lib/components/suspense_loader/SuspenseLoader'; +import FeedbackLoading from './FeedbackLoading'; interface IFeedbackListContainer { loanAccountNumber: string; @@ -93,17 +94,19 @@ const FeedbackListContainer: React.FC = ({ } return ( - - {feedbackList.map((feedbackItem: IFeedback | IUnSyncedFeedbackItem, idx: number) => ( - - ))} - + }> + + {feedbackList.map((feedbackItem: IFeedback | IUnSyncedFeedbackItem, idx: number) => ( + + ))} + + ); }; diff --git a/src/screens/caseDetails/feedback/FeedbackListItem.tsx b/src/screens/caseDetails/feedback/FeedbackListItem.tsx index 2fcbbcda..f4c06320 100644 --- a/src/screens/caseDetails/feedback/FeedbackListItem.tsx +++ b/src/screens/caseDetails/feedback/FeedbackListItem.tsx @@ -1,7 +1,7 @@ import React, { useState } from 'react'; import { StyleSheet, TouchableOpacity, View } from 'react-native'; import Text from '../../../../RN-UI-LIB/src/components/Text'; -import Chevron from '../../../../RN-UI-LIB/src/Icons/Chevron'; +import RightChevronIcon from '@assets/icons/RightChevronIcon'; import UnsyncedIcon from '../../../../RN-UI-LIB/src/Icons/UnsyncedIcon'; import { GenericStyles } from '../../../../RN-UI-LIB/src/styles'; import { COLORS } from '../../../../RN-UI-LIB/src/styles/colors'; @@ -15,12 +15,14 @@ import { useAppSelector } from '@hooks'; import { shareToWhatsapp } from '../../../services/FeedbackWhatsApp'; import { CaseDetailStackEnum } from '../CaseDetailStack'; import { feedbackTypeIcon } from '@screens/caseDetails/feedback/FeedbackDetailItem'; +import Tag, { TagVariant } from '@rn-ui-lib/components/Tag'; interface IFeedbackListItem { feedbackItem: IFeedback | IUnSyncedFeedbackItem; showHorizontalLine?: boolean; loanAccountNumber: string; caseId: string; + isTopFeedbackItem?: boolean; } const FeedbackListItem: React.FC = ({ @@ -28,15 +30,19 @@ const FeedbackListItem: React.FC = ({ loanAccountNumber, caseId, showHorizontalLine = true, + isTopFeedbackItem = false, }) => { - const handleRouting = (route: CaseDetailStackEnum, params: object | undefined = undefined) => { + const handleRouting = () => { if (!(feedbackItem as IFeedback).referenceId) return; const commonParams = { loanAccountNumber, activeFeedbackReferenceId: (feedbackItem as IFeedback).referenceId, caseId: caseId, }; - navigateToScreen(route, { ...params, ...commonParams }); + navigateToScreen(CaseDetailStackEnum.PAST_FEEDBACK_DETAIL, { + ...commonParams, + pageNo: isTopFeedbackItem ? (feedbackItem as IFeedback)?.offset : 1, + }); }; const [isWhastappSendLoading, setIsWhatsappSendLoading] = useState(false); const { agentId, caseDetails } = useAppSelector((state) => ({ @@ -46,80 +52,93 @@ const FeedbackListItem: React.FC = ({ const throttledSendToWhatsapp = React.useRef(debounce(shareToWhatsapp, 500)); return ( - + handleRouting(CaseDetailStackEnum.PAST_FEEDBACK_DETAIL)} + activeOpacity={!(feedbackItem as IFeedback)?.referenceId ? 1 : 0.7} + onPress={handleRouting} style={[ - GenericStyles.row, - GenericStyles.alignCenter, - showHorizontalLine ? GenericStyles.pb16 : GenericStyles.pb4, + GenericStyles.pv16, + isTopFeedbackItem ? styles.topFeedbackItem : styles.feedbackItem, ]} > - {feedbackItem.isSynced === false ? ( - - + {isTopFeedbackItem ? ( + + ) : null} - - - - - {feedbackItem.type && feedbackTypeIcon[feedbackItem.type] ? ( - - {feedbackTypeIcon[feedbackItem.type]} - - ) : null} - + {feedbackItem.isSynced === false ? ( + + + + ) : null} + + {feedbackItem.type && feedbackTypeIcon[feedbackItem.type] ? ( + - {sanitizeString(feedbackItem.interactionStatus)} - - - - {sanitizeString( - `${dateFormat(new Date(feedbackItem?.createdAt), BUSINESS_DATE_FORMAT)}` - )} - + {feedbackTypeIcon[feedbackItem.type]} + + ) : null} - {feedbackItem?.type === 'FIELD_VISIT' ? ( - - { - e.stopPropagation(); - throttledSendToWhatsapp.current( - feedbackItem, - caseDetails, - agentId, - setIsWhatsappSendLoading - ); - }} - disabled={isWhastappSendLoading} - > - } - textStyle={styles.ButtonText} - /> - + + + {sanitizeString(feedbackItem.interactionStatus)} + + {feedbackItem?.createdAt ? ( + + {sanitizeString( + `${dateFormat(new Date(feedbackItem?.createdAt), BUSINESS_DATE_FORMAT)}` + )} + + ) : null} + + {!(feedbackItem.isSynced === false || !(feedbackItem as IFeedback)?.referenceId) ? ( + + ) : null} - {!(feedbackItem.isSynced === false) ? : null} + {feedbackItem?.type === FEEDBACK_TYPE.FIELD_VISIT ? ( + { + e.stopPropagation(); + throttledSendToWhatsapp.current( + feedbackItem, + caseDetails, + agentId, + setIsWhatsappSendLoading + ); + }} + disabled={isWhastappSendLoading} + > + } + textStyle={styles.ButtonText} + /> + + ) : null} {showHorizontalLine ? : null} @@ -129,9 +148,9 @@ const FeedbackListItem: React.FC = ({ const styles = StyleSheet.create({ textHeading: { fontSize: 14, - lineHeight: 30, - paddingTop: 4, - color: COLORS.TEXT.DARK, + lineHeight: 18, + marginBottom: 2, + color: COLORS.TEXT.BLACK, }, capitalized: { textTransform: 'capitalize', @@ -142,18 +161,13 @@ const styles = StyleSheet.create({ color: COLORS.TEXT.LIGHT, }, feedBox: { - flexBasis: '94%', - }, - textBox: { - marginLeft: 10, - marginTop: 5, + flexBasis: '80%', + marginRight: 14, }, ShareButton: { - width: 75, - height: 35, - padding: 5, - justifyContent: 'flex-start', - marginLeft: 5, + marginTop: 5, + marginLeft: 36, + alignSelf: 'flex-start', }, ButtonText: { color: COLORS.BASE.BLUE, @@ -161,6 +175,29 @@ const styles = StyleSheet.create({ ml_4: { marginLeft: -4, }, + feedbackIcon: { + width: 28, + height: 28, + backgroundColor: COLORS.BACKGROUND.SILVER, + borderRadius: 4, + }, + feedbackItem: { + paddingTop: 16, + paddingHorizontal: 0, + }, + topFeedbackItem: { + paddingTop: 40, + paddingHorizontal: 16, + }, + currentMonthFeedback: { + borderRadius: 0, + borderBottomRightRadius: 8, + }, + lastMonthfeedback: { + borderRadius: 0, + borderBottomRightRadius: 8, + borderTopLeftRadius: 7, + }, }); export default FeedbackListItem; diff --git a/src/screens/caseDetails/feedback/FeedbackLoading.tsx b/src/screens/caseDetails/feedback/FeedbackLoading.tsx new file mode 100644 index 00000000..85cefb41 --- /dev/null +++ b/src/screens/caseDetails/feedback/FeedbackLoading.tsx @@ -0,0 +1,60 @@ +import Tag, { TagVariant } from '@rn-ui-lib/components/Tag'; +import LineLoader from '@rn-ui-lib/components/suspense_loader/LineLoader'; +import { GenericStyles } from '@rn-ui-lib/styles'; +import React from 'react'; +import { StyleSheet, View } from 'react-native'; +import { IFeedbackLoading, TOP_FEEDBACK_MAP } from './types'; + +const FeedbackLoading = (props: IFeedbackLoading) => { + const { isTopFeedbackItem = false, arrayLength = 5 } = props; + return ( + + {Array.from({ length: arrayLength }).map((_, idx) => ( + + + {isTopFeedbackItem ? ( + + + + ) : null} + + + {idx !== arrayLength ? ( + + ) : null} + + ))} + + ); +}; + +const styles = StyleSheet.create({ + currentMonthFeedback: { + borderRadius: 0, + borderBottomRightRadius: 8, + }, + lastMonthfeedback: { + borderRadius: 0, + borderBottomRightRadius: 8, + borderTopLeftRadius: 7, + }, + feedbackItem: { + paddingTop: 16, + paddingHorizontal: 0, + }, + topFeedbackItem: { + paddingTop: 38, + paddingHorizontal: 16, + }, +}); + +export default FeedbackLoading; diff --git a/src/screens/caseDetails/feedback/TopFeedbacks.tsx b/src/screens/caseDetails/feedback/TopFeedbacks.tsx new file mode 100644 index 00000000..c9e2a62b --- /dev/null +++ b/src/screens/caseDetails/feedback/TopFeedbacks.tsx @@ -0,0 +1,90 @@ +import React, { useEffect } from 'react'; +import FeedbackListItem from './FeedbackListItem'; +import { useAppDispatch, useAppSelector } from '@hooks'; +import { RootState } from '@store'; +import { StyleSheet, View } from 'react-native'; +import { GenericStyles, getShadowStyle } from '@rn-ui-lib/styles'; +import Text from '@rn-ui-lib/components/Text'; +import { COLORS } from '@rn-ui-lib/colors'; +import SuspenseLoader from '@rn-ui-lib/components/suspense_loader/SuspenseLoader'; +import FeedbackLoading from './FeedbackLoading'; +import { getTopFeedbacks } from '@actions/feedbackActions'; + +interface ITopFeedbacks { + caseId: string; +} + +const TopFeedbacks = (props: ITopFeedbacks) => { + const { caseId } = props; + const dispatch = useAppDispatch(); + const caseDetail = useAppSelector((state: RootState) => state.allCases.caseDetails[caseId]) || {}; + const { loanAccountNumber } = caseDetail || {}; + const feedbackList = useAppSelector( + (state: RootState) => state.topFeedbacks?.[loanAccountNumber as string]?.feedbacks || [] + ); + const isLoading = useAppSelector( + (state: RootState) => state.topFeedbacks?.[loanAccountNumber as string]?.isLoading || false + ); + + useEffect(() => { + dispatch(getTopFeedbacks(loanAccountNumber)); + }, []); + + if (!feedbackList?.length) return null; + + return ( + + + + + Feedbacks + + + + + } + > + {feedbackList?.map((feedbackItem: any, idx: number) => ( + + ))} + + + + ); +}; + +const styles = StyleSheet.create({ + feedbackHeading: { color: COLORS.TEXT.BLACK }, + border: { + borderWidth: 1, + borderColor: COLORS.BORDER.PRIMARY, + }, +}); + +export default TopFeedbacks; diff --git a/src/screens/caseDetails/feedback/types.ts b/src/screens/caseDetails/feedback/types.ts new file mode 100644 index 00000000..111ef1e6 --- /dev/null +++ b/src/screens/caseDetails/feedback/types.ts @@ -0,0 +1,9 @@ +export const TOP_FEEDBACK_MAP: { [key: number]: string } = { + 0: 'Current month status', + 1: 'Last month status', +}; + +export interface IFeedbackLoading { + isTopFeedbackItem?: boolean; + arrayLength?: number; +} diff --git a/src/store/store.ts b/src/store/store.ts index 436296d2..9583a436 100644 --- a/src/store/store.ts +++ b/src/store/store.ts @@ -33,6 +33,7 @@ import commitmentTrackerSlice from '@reducers/commitmentTrackerSlice'; import nearbyCasesSlice from '@reducers/nearbyCasesSlice'; import activeCallSlice from '@reducers/activeCallSlice'; import documentsSlice from '@reducers/documentsSlice'; +import topFeedbacksSlice from '@reducers/topFeedbacksSlice'; import escalationSlice from '@reducers/escalationSlice'; const rootReducer = combineReducers({ @@ -67,6 +68,7 @@ const rootReducer = combineReducers({ nearbyCasesSlice: nearbyCasesSlice, activeCall: activeCallSlice, documentsSlice: documentsSlice, + topFeedbacks: topFeedbacksSlice, escalationSlice: escalationSlice, }); diff --git a/src/types/feedback.types.ts b/src/types/feedback.types.ts index 4079b54d..5fa66fe8 100644 --- a/src/types/feedback.types.ts +++ b/src/types/feedback.types.ts @@ -46,6 +46,7 @@ export enum FEEDBACK_TYPE { CALL_BRIDGE = 'CALL_BRIDGE', SELF_CALL = 'SELF_CALL', GEN_AI_BOT_FIELD = 'GEN_AI_BOT_FIELD', + NOT_ATTEMPTED = 'NOT_ATTEMPTED' } export interface FIELD_FEEDBACK_METADATA { @@ -75,6 +76,8 @@ export interface IFeedback { agentReferenceId: string; source: Address | IGeolocation | ICallingFeedback; interactionStatus: InteractionStatuses; + tagTitle?: string; + offset?: number; } export interface IUnSyncedFeedbackItem {