2024-04-22 16:13:14 +05:30
|
|
|
import isEqual from "lodash/isEqual";
|
2024-03-27 20:36:03 +05:30
|
|
|
import React, { useEffect, useMemo, useState } from "react";
|
|
|
|
|
import { View } from "react-native";
|
|
|
|
|
import { useDispatch, useSelector } from "react-redux";
|
|
|
|
|
import { commonStyles } from "../../Container/Navi-Insurance/Styles";
|
|
|
|
|
import { ActionMetaData, GenericActionPayload } from "../actions/GenericAction";
|
2024-11-07 15:31:54 +05:30
|
|
|
import {
|
|
|
|
|
AnalyticsEventNameConstants,
|
|
|
|
|
BASE_SCREEN,
|
|
|
|
|
EVENT_NAMES,
|
|
|
|
|
} from "../constants";
|
2024-03-27 20:36:03 +05:30
|
|
|
import { sendAsAnalyticsEvent } from "../hooks/useAnalyticsEvent";
|
|
|
|
|
import { useBottomSheet } from "../hooks/useBottomSheet";
|
2024-11-07 15:31:54 +05:30
|
|
|
import useScreenLoadTime from "../hooks/useScreenLoadTime";
|
2024-03-27 20:36:03 +05:30
|
|
|
import { CtaData } from "../interface";
|
|
|
|
|
import { ModalView } from "../interface/modals/ModalView";
|
|
|
|
|
import { ScreenData } from "../interface/widgets/screenData/ScreenData";
|
|
|
|
|
import { Router } from "../navigator/NavigationRouter";
|
|
|
|
|
import { updateCtaData } from "../redux/screens/screenActionCreators";
|
2024-04-07 20:25:37 +05:30
|
|
|
import { setCurrentScreenName } from "../utilities/AlfredUtils";
|
|
|
|
|
import {
|
|
|
|
|
getScreenMapperNameFromCtaData,
|
|
|
|
|
getScreenNameFromCtaData,
|
|
|
|
|
} from "../utilities/MiscUtils";
|
2024-03-27 20:36:03 +05:30
|
|
|
import { WidgetActionTypes } from "../widgets/widget-actions/WidgetActionTypes";
|
|
|
|
|
import { ScreenMapper } from "./screen-mappers/ScreenMapper";
|
|
|
|
|
|
|
|
|
|
const BaseScreen: React.FC<{ navigation: any; route: any }> = ({
|
|
|
|
|
navigation,
|
|
|
|
|
route,
|
|
|
|
|
}) => {
|
|
|
|
|
const [screenData, setScreenData] = useState<ScreenData | null>(null);
|
|
|
|
|
const [screenName, setScreenName] = useState<string | null>(null);
|
2024-11-15 17:35:58 +05:30
|
|
|
const [moduleName, setModuleName] = useState<string | null>(null);
|
2024-03-27 20:36:03 +05:30
|
|
|
const [screenState, setScreenState] = useState<ScreenState | null>(
|
2024-06-11 23:24:34 +05:30
|
|
|
ScreenState.LOADING,
|
2024-03-27 20:36:03 +05:30
|
|
|
);
|
|
|
|
|
const [errorMetaData, setErrorMetaData] = useState<ActionMetaData[] | null>(
|
2024-06-11 23:24:34 +05:30
|
|
|
null,
|
2024-03-27 20:36:03 +05:30
|
|
|
);
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
if (!screenData) {
|
|
|
|
|
const screenInitialData: ScreenData = {
|
|
|
|
|
screenState: ScreenState.LOADING,
|
|
|
|
|
};
|
|
|
|
|
setScreenData(screenInitialData);
|
|
|
|
|
}
|
|
|
|
|
}, [screenData]);
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
if (!!getScreenNameFromCtaData(route.params?.ctaData)) {
|
|
|
|
|
setScreenName(getScreenNameFromCtaData(route.params?.ctaData)!!);
|
2024-11-15 17:35:58 +05:30
|
|
|
setModuleName(getScreenMapperNameFromCtaData(route.params?.ctaData)!!);
|
2024-03-27 20:36:03 +05:30
|
|
|
}
|
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
const { cta } = useSelector((state: any) => {
|
|
|
|
|
const savedCta = state.screenReducer.ctaData;
|
|
|
|
|
if (isEqual(savedCta, route.params.ctaData)) {
|
|
|
|
|
return { cta: state.screenReducer.ctaData };
|
|
|
|
|
}
|
|
|
|
|
return { cta: route.params.ctaData };
|
|
|
|
|
});
|
|
|
|
|
|
2024-11-07 15:31:54 +05:30
|
|
|
const dispatch = useDispatch();
|
2024-03-27 20:36:03 +05:30
|
|
|
useEffect(() => {
|
|
|
|
|
const ctaData: CtaData = route.params.ctaData;
|
|
|
|
|
if (!isEqual(cta, ctaData)) {
|
|
|
|
|
dispatch(updateCtaData({ cta: ctaData, setScreenState: screenState }));
|
|
|
|
|
}
|
|
|
|
|
}, [route.params.ctaData, screenState]);
|
2024-11-07 15:31:54 +05:30
|
|
|
|
2024-11-15 17:35:58 +05:30
|
|
|
useScreenLoadTime(screenName, moduleName, screenData?.screenState);
|
2024-06-11 23:24:34 +05:30
|
|
|
|
2024-03-27 20:36:03 +05:30
|
|
|
const handleActions = (actionPayload?: GenericActionPayload) => {
|
2024-06-11 23:24:34 +05:30
|
|
|
actionPayload?.metaData?.forEach(ActionMetaData => {
|
2024-03-27 20:36:03 +05:30
|
|
|
if (!!ActionMetaData.analyticsEventProperties) {
|
|
|
|
|
sendAsAnalyticsEvent(ActionMetaData.analyticsEventProperties);
|
|
|
|
|
}
|
|
|
|
|
if (ActionMetaData.actionType === WidgetActionTypes.OPEN_BOTTOM_SHEET) {
|
|
|
|
|
addBottomSheet(ActionMetaData.data as ModalView);
|
|
|
|
|
}
|
2024-06-11 23:24:34 +05:30
|
|
|
if (
|
|
|
|
|
ActionMetaData.actionType === WidgetActionTypes.REPLACE_BOTTOM_SHEET
|
|
|
|
|
) {
|
2024-06-07 00:01:49 +05:30
|
|
|
replaceBottomSheet(ActionMetaData.data as ModalView);
|
|
|
|
|
}
|
2024-03-27 20:36:03 +05:30
|
|
|
});
|
2024-05-15 15:54:59 +05:30
|
|
|
const updatedActionPayload: GenericActionPayload = {
|
|
|
|
|
...(actionPayload as GenericActionPayload),
|
|
|
|
|
setScreenData,
|
|
|
|
|
setScreenState,
|
|
|
|
|
setErrorMetaData,
|
|
|
|
|
ctaData: cta,
|
|
|
|
|
screenData: { ...screenData },
|
|
|
|
|
};
|
|
|
|
|
if (!!actionPayload) {
|
|
|
|
|
Router.handleAction(updatedActionPayload, navigation);
|
|
|
|
|
} else {
|
2024-10-24 16:38:07 +05:30
|
|
|
sendAsAnalyticsEvent({
|
|
|
|
|
name: AnalyticsEventNameConstants.HI_RN_PAYLOAD_ERROR,
|
|
|
|
|
properties: {
|
|
|
|
|
screenName: BASE_SCREEN,
|
|
|
|
|
errorType: EVENT_NAMES.ACTION_PAYLOAD_MISSING_ERROR,
|
|
|
|
|
error: `${actionPayload}`,
|
|
|
|
|
methodName: "handleActions",
|
|
|
|
|
},
|
|
|
|
|
});
|
2024-05-15 15:54:59 +05:30
|
|
|
}
|
2024-03-27 20:36:03 +05:30
|
|
|
};
|
2024-05-14 23:40:14 +05:30
|
|
|
|
2024-06-11 23:24:34 +05:30
|
|
|
const { bottomsheet, addBottomSheet, replaceBottomSheet } =
|
|
|
|
|
useBottomSheet(handleActions);
|
2024-05-14 23:40:14 +05:30
|
|
|
|
2024-03-27 20:36:03 +05:30
|
|
|
const MemoizedScreenMapper = useMemo(() => {
|
2024-04-07 20:25:37 +05:30
|
|
|
const secondIdentifier = getScreenMapperNameFromCtaData(cta);
|
|
|
|
|
setCurrentScreenName(
|
2024-06-11 23:24:34 +05:30
|
|
|
"RN_" + secondIdentifier?.toUpperCase() + "_" + screenName,
|
2024-04-07 20:25:37 +05:30
|
|
|
);
|
|
|
|
|
|
2024-03-27 20:36:03 +05:30
|
|
|
return (
|
|
|
|
|
<View style={commonStyles.flex_1}>
|
|
|
|
|
{ScreenMapper.getScreenMapper(cta, screenData, handleActions)}
|
|
|
|
|
</View>
|
|
|
|
|
);
|
|
|
|
|
}, [cta, screenData]);
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<View style={commonStyles.flex_1}>
|
|
|
|
|
{MemoizedScreenMapper}
|
|
|
|
|
{bottomsheet.map((sheet, index) => (
|
|
|
|
|
<React.Fragment key={`bottomSheet-${index}`}>{sheet}</React.Fragment>
|
|
|
|
|
))}
|
|
|
|
|
</View>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export enum ScreenState {
|
|
|
|
|
LOADING,
|
|
|
|
|
LOADED,
|
|
|
|
|
ERROR,
|
|
|
|
|
OVERLAY,
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-07 20:25:37 +05:30
|
|
|
export default BaseScreen;
|