UNPKG

@react-navigation/core

Version:

Core utilities for building navigators

42 lines (40 loc) 1.41 kB
"use strict"; import { nanoid } from 'nanoid/non-secure'; import * as React from 'react'; import useLatestCallback from 'use-latest-callback'; import { useNavigation } from "./useNavigation.js"; import { usePreventRemoveContext } from "./usePreventRemoveContext.js"; import { useRoute } from "./useRoute.js"; /** * Hook to prevent screen from being removed. Can be used to prevent users from leaving the screen. * * @param preventRemove Boolean indicating whether to prevent screen from being removed. * @param callback Function which is executed when screen was prevented from being removed. */ export function usePreventRemove(preventRemove, callback) { const [id] = React.useState(() => nanoid()); const navigation = useNavigation(); const { key: routeKey } = useRoute(); const { setPreventRemove } = usePreventRemoveContext(); React.useEffect(() => { setPreventRemove(id, routeKey, preventRemove); return () => { setPreventRemove(id, routeKey, false); }; }, [setPreventRemove, id, routeKey, preventRemove]); const beforeRemoveListener = useLatestCallback(e => { if (!preventRemove) { return; } e.preventDefault(); callback({ data: e.data }); }); React.useEffect(() => navigation?.addListener('beforeRemove', beforeRemoveListener), [navigation, beforeRemoveListener]); } //# sourceMappingURL=usePreventRemove.js.map