import * as React from "react";
import { isTV } from "@applicaster/zapp-react-native-utils/reactUtils";
import {
useBackHandler,
useIsNavBarVisible,
} from "@applicaster/zapp-react-native-utils/reactHooks/navigation";
import { useHookAnalytics } from "@applicaster/zapp-react-native-utils/analyticsUtils/helpers/hooks";
import { useSetNavbarState } from "@applicaster/zapp-react-native-utils/reactHooks";
import { componentsLogger } from "../../Helpers/logger";
const logger = componentsLogger.addSubsystem("HookRenderer");
const HOOK_PRESENTATION_TYPE = "Hook";
type Props = {
focused?: boolean;
parentFocus?: ParentFocus;
screenData: HookPluginProps;
callback: hookCallback;
};
const HookRenderer = (props: Props) => {
const { focused, screenData, callback } = props;
const { payload, hookPlugin } = screenData;
const {
module: { Component: HookComponent, presentFullScreen },
configuration,
} = hookPlugin;
const { setVisible: showNavBar } = useSetNavbarState();
useHookAnalytics(props);
const isNavBarVisible = useIsNavBarVisible();
useBackHandler(() => {
callback({ success: false, payload, cancelled: true });
return true;
});
React.useEffect(() => {
if (presentFullScreen && isTV()) {
showNavBar(false);
}
return () => {
if (isTV()) {
showNavBar(true);
}
};
}, [showNavBar]);
// Passing empty parentFocus if navbar is not visible (fullScreen hook)
const parentFocus = isNavBarVisible ? props.parentFocus : {};
return (
);
};
/**
* Guard component to prevent rendering HookRenderer when screenData or hookPlugin is missing. This is to avoid potential crashes due to missing data.
*/
const HookRendererGuard = (props: Props) => {
React.useEffect(() => {
if (!props.screenData) {
logger.error(
"HookRenderer received no screenData, screen cannot be rendered"
);
} else if (!props.screenData.hookPlugin) {
logger.error(
"HookRenderer received screenData with no hookPlugin, screen cannot be rendered",
{
screenData: props.screenData,
}
);
}
}, [props.screenData]);
if (!props.screenData || !props.screenData.hookPlugin) {
return null;
}
return ;
};
export { HookRendererGuard as HookRenderer };