@applicaster/zapp-react-native-app
Version:
Zapp App Component for Applicaster's Quick Brick React Native App
65 lines (51 loc) • 1.88 kB
JavaScript
import * as React from "react";
import { BackHandler } from "react-native";
import * as R from "ramda";
import {
QUICK_BRICK_EVENTS,
sendQuickBrickEvent,
} from "@applicaster/zapp-react-native-bridge/QuickBrick";
import { useNavigation } from "@applicaster/zapp-react-native-utils/reactHooks/navigation";
import { useAnalytics } from "@applicaster/zapp-react-native-utils/analyticsUtils";
import { useRivers } from "@applicaster/zapp-react-native-utils/reactHooks/state";
const getHome = R.compose(R.find(R.propEq("home", true)), R.values);
const InteractionManagerComponent = () => {
const { sendHardwareBackButtonClickEvent } = useAnalytics();
const rivers = useRivers();
const navigator = useNavigation();
const isHomeScreen = () => {
const homeId = R.compose(R.prop("id"), getHome)(rivers);
const homePath = `/river/${homeId}`;
return homePath === navigator.currentRoute;
};
const exitToBackground = () => {
sendQuickBrickEvent(QUICK_BRICK_EVENTS.MOVE_APP_TO_BACKGROUND, {
MOVE_APP_TO_BACKGROUND: true,
});
};
const goToHome = () => {
const home = getHome(rivers);
navigator.replace(home);
};
const onHardwareBackPress = React.useCallback(() => {
if (navigator && !navigator.canGoBack()) {
if (isHomeScreen()) {
exitToBackground();
} else {
goToHome();
}
} else {
sendHardwareBackButtonClickEvent({ navigator });
navigator.goBack();
}
return true; // Take care! see jsdoc above
}, [navigator.currentRoute]);
React.useEffect(() => {
BackHandler.addEventListener("hardwareBackPress", onHardwareBackPress);
return () => {
BackHandler.removeEventListener("hardwareBackPress", onHardwareBackPress);
};
}, [onHardwareBackPress]);
return null;
};
export const InteractionManager = React.memo(InteractionManagerComponent);