import React, { useEffect } from "react"; import { ComponentsMap } from "../River/ComponentsMap"; import { CellTapContext } from "@applicaster/zapp-react-native-ui-components/Contexts/CellTapContext"; import { useActions } from "@applicaster/zapp-react-native-utils/reactHooks/actions"; import { logger, whenMatchingType } from "./utils"; import { useLayoutVersion } from "@applicaster/zapp-react-native-utils/reactHooks/layout"; import { useScreenData } from "@applicaster/zapp-react-native-utils/reactHooks/screen/useScreenData"; import { useCurationAPI } from "./utils/useCurationAPI"; import { useRiverInitialState } from "@applicaster/quick-brick-core/App/ActionSetters"; import { allSettled } from "promise"; import { createLogger } from "@applicaster/zapp-react-native-utils/logger"; import { isNilOrEmpty } from "@applicaster/zapp-react-native-utils/reactUtils/helpers"; import { ScreenTrackedViewPositionsContext } from "@applicaster/zapp-react-native-ui-components/Contexts/ScreenTrackedViewPositionsContext"; import { useEventAlerts } from "./utils/useEventAlerts"; import { selectRiverById, useAppSelector, } from "@applicaster/zapp-react-native-redux"; import { getScreenDataSource } from "./utils/getScreenDataSource"; import { ScreenResolverFeedProvider } from "../ScreenResolverFeedProvider/ScreenResolverFeedProvider"; const { log_debug } = createLogger({ category: "ScreenContainer", subsystem: "General", }); /** Provides screen-feed from general-screen configuration (if defined) */ const useFeedData = (id) => { const river = useAppSelector((state) => selectRiverById(state, id)); const feedData = getScreenDataSource(river); return feedData; }; export const GeneralContentScreen = ({ feed, screenId, groupId, scrollViewExtraProps, components, cellTapAction, getStaticComponentFeed, extraAnchorPointYOffset, isScreenWrappedInContainer, componentsMapExtraProps = {}, focused, parentFocus, containerHeight, preferredFocus = false, }: GeneralContentScreenProps) => { const screenData = useScreenData(screenId); const uiComponents = useCurationAPI(screenData?.ui_components); const onCellTapAction = useActions( whenMatchingType(String, cellTapAction) || screenData?.general?.on_cell_tap_action_id ); const isLayoutV2 = useLayoutVersion({ isV2: true }); const useRiverActionProviderReady = () => { const actionsInitialStateSetters = useRiverInitialState(); const [riverActionProvidersReady, setRiverActionProvidersReady] = React.useState(actionsInitialStateSetters.length === 0); useEffect(() => { if (!riverActionProvidersReady) { if (actionsInitialStateSetters.length > 0) { allSettled(actionsInitialStateSetters).finally(() => { log_debug( "ScreenContainer: action provider ready, completed. Starting to present screen" ); setRiverActionProvidersReady(true); }); } else { log_debug( "ScreenContainer: no action provider to check, completed. Starting to present screen" ); setRiverActionProvidersReady(true); } } }, [actionsInitialStateSetters, riverActionProvidersReady]); return React.useMemo( () => riverActionProvidersReady, [riverActionProvidersReady] ); }; React.useEffect(() => { if (isLayoutV2 && feed) { logger.warn({ message: "Feed of feeds are not supported in layouts v2. Passed 'feed' parameter will be ignored", data: { layoutVersion: "v2", feed, screenId, }, }); } }, [feed]); const isReady = useRiverActionProviderReady(); const contextValue = React.useMemo( () => whenMatchingType(Function, cellTapAction) || onCellTapAction, [typeof cellTapAction === "function" ? cellTapAction : onCellTapAction] ); useEventAlerts(screenData); if (!isReady || isNilOrEmpty(components || uiComponents)) return null; return ( ); };