UNPKG

@applicaster/quick-brick-core

Version:

Core package for Applicaster's Quick Brick App

120 lines (101 loc) 2.65 kB
import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks"; import { ZappPipesEntryContext } from "@applicaster/zapp-react-native-ui-components/Contexts"; import { useNavigation } from "@applicaster/zapp-react-native-utils/reactHooks/navigation"; import { useEffect } from "react"; import * as R from "ramda"; import { handlePresentNavigation } from "../../../helpers"; import { noResolvedEntryError, noTargetScreenError, resolveError, typeWarningMessage, } from "./const"; import { getHomeScreenId, queryIsValid, resolveQueryData, wait, withInitialPlayerState, } from "./utils"; import { log_warning } from "../../../logger"; async function handleQuery({ query, url, rivers, contentTypes, onFinish, navigator, setEntryContext, }) { if (!queryIsValid(query)) { log_warning(typeWarningMessage(url), { query, url }); return onFinish((done) => done?.()); } try { const { targetScreen, entry } = await resolveQueryData({ query, rivers, contentTypes, }); if (R.isNil(entry)) { throw Error(noResolvedEntryError(url)); } if (R.isNil(targetScreen)) { throw Error(noTargetScreenError(url)); } const entryWithInitialPlayerState = withInitialPlayerState(query, entry); if (navigator.currentRoute === "/") { navigator.goHome(); await wait(); } setEntryContext(entryWithInitialPlayerState); if ((query.type || query.feed_locator) && !query.screen_id) { return onFinish((done) => { handlePresentNavigation({ data: entryWithInitialPlayerState, navigator, pushScreen: true, }); done?.(); }); } onFinish((done) => { handlePresentNavigation({ data: targetScreen, navigator, pushScreen: true, }); done?.(); }); } catch (e) { log_warning(resolveError(url), { url, query, error: e.message, stack: e.stack, }); onFinish((done) => { handlePresentNavigation({ data: null, navigator }); done?.(); }); } } export function useOpenSchemeHandler({ query, url, onFinish }) { const { rivers, contentTypes } = usePickFromState(["rivers", "contentTypes"]); const navigator = useNavigation(); const homeId = getHomeScreenId(rivers); const homeRoute = `/river/${homeId}`; const [_, setEntryContext] = ZappPipesEntryContext.useZappPipesContext(homeRoute); useEffect(() => { handleQuery({ query, url, rivers, contentTypes, onFinish, navigator, setEntryContext, }); }, []); }