UNPKG

@td-design/react-native

Version:

react-native UI组件库

56 lines (54 loc) 1.64 kB
import { useEffect, useRef, useState } from 'react'; import { BackHandler } from 'react-native'; import { useMemoizedFn } from '@td-design/rn-hooks'; import { INFINITY } from './constant'; export default function useToast() { const timer = useRef(); const [visible, setVisible] = useState(false); const [options, setOptions] = useState(undefined); const hide = () => { if (!visible) return; setVisible(false); clearTimeout(timer.current); }; /** 每次显示前,先隐藏之前的Toast */ const show = params => { if (visible) { hide(); } setOptions(params); setVisible(true); }; useEffect(() => { if (!options || options.duration === INFINITY) return; if (visible) { timer.current = setTimeout(() => { setVisible(false); }, options.duration); } else { clearTimeout(timer.current); } return () => clearTimeout(timer.current); }, [visible, options]); /** 当Toast显示的时候,不允许安卓物理返回键可用 */ useEffect(() => { let backHandler; if (visible) { backHandler = BackHandler.addEventListener('hardwareBackPress', () => true); } else { var _backHandler; (_backHandler = backHandler) === null || _backHandler === void 0 ? void 0 : _backHandler.remove(); } return () => { var _backHandler2; return (_backHandler2 = backHandler) === null || _backHandler2 === void 0 ? void 0 : _backHandler2.remove(); }; }, [visible]); return { visible, options, show: useMemoizedFn(show), hide: useMemoizedFn(hide) }; } //# sourceMappingURL=useToast.js.map