react-native-tvfocus
Version:
React Native tvOS and Android TV library to improve focus management with multiple screens.
41 lines (40 loc) • 1.62 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.withFocusScreen = void 0;
const React = require("react");
const react_1 = require("react");
const focus_manager_1 = require("./focus-manager");
const _FocusContext = function FocusContext(props) {
const [focus] = react_1.useState(() => new focus_manager_1.default());
const [context, setContext] = react_1.useState(() => ({ focus, active: props.active }));
const [, forceUpdate] = react_1.useReducer(a => !a, false);
react_1.useEffect(() => {
focus.forceUpdate = forceUpdate;
}, [focus, forceUpdate]);
react_1.useEffect(() => {
focus.focusFirstIfNoDefault();
}, [focus]);
if (focus.active && !props.active) {
focus.willBecomeInactive();
// @ts-expect-error
focus.active = false;
setContext({ focus, active: false });
}
else if (!focus.active && props.active) {
focus.willBecomeActive();
// @ts-expect-error
focus.active = true;
setContext({ focus, active: true });
}
return React.createElement(focus_manager_1.FocusManagerContext.Provider, { value: context }, props.children);
};
const FocusContext = React.memo(_FocusContext);
exports.default = FocusContext;
function withFocusScreen(component) {
const { useIsFocused } = require('@react-navigation/native');
return function FocusScreen(props) {
const active = useIsFocused();
return React.createElement(FocusContext, { active: active }, React.createElement(component, props));
};
}
exports.withFocusScreen = withFocusScreen;