@applicaster/quick-brick-core
Version:
Core package for Applicaster's Quick Brick App
56 lines (45 loc) • 1.22 kB
text/typescript
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));
}