UNPKG

@applicaster/quick-brick-core

Version:

Core package for Applicaster's Quick Brick App

56 lines (45 loc) 1.22 kB
import * as React from "react"; import * as R from "ramda"; import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks"; enum ReactHooks { useEffect = "useEffect", useLayoutEffect = "useLayoutEffect", } function callHook(hook, pathname) { return function (effect, deps = []) { React?.[hook]?.(effect, [pathname, ...deps]); }; } function getHooksWrappers(pathname) { return R.compose( R.reduce( (hooksWrappers, hook) => R.assoc(hook, callHook(hook, pathname), hooksWrappers), {} ), R.values )(ReactHooks); } function hasScreenHook(plugin) { return ( plugin?.module?.useScreenHook && typeof plugin.module.useScreenHook === "function" ); } function invokeScreenHook(hooksWrappers) { return function (plugin) { return plugin?.module?.useScreenHook(hooksWrappers); }; } export function usePluginScreenHooks(pathname: string) { const { plugins } = usePickFromState(["plugins"]); const hooks = React.useMemo( () => R.filter(hasScreenHook, plugins) || [], [plugins] ); const hooksWrappers = React.useMemo( () => getHooksWrappers(pathname), [pathname] ); hooks.forEach(invokeScreenHook(hooksWrappers)); }