@applicaster/quick-brick-core
Version:
Core package for Applicaster's Quick Brick App
120 lines (101 loc) • 2.65 kB
text/typescript
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,
});
}, []);
}