@td-design/react-native
Version:
react-native UI组件库
56 lines (54 loc) • 1.64 kB
JavaScript
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