UNPKG

@flatbiz/antd

Version:
146 lines (140 loc) 5.29 kB
/*! @flatjs/forge MIT @flatbiz/antd */ import { _ as _objectWithoutProperties, a as _slicedToArray, b as _objectSpread2 } from './_rollupPluginBabelHelpers-BspM60Sw.js'; import { classNames } from '@dimjs/utils/class-names/class-names'; import { forwardRef, useState, useMemo, useEffect, useImperativeHandle } from 'react'; import { useCountDown, useMemoizedFn } from 'ahooks'; import { jsx } from 'react/jsx-runtime'; var _excluded = ["onSendRequest", "totalTicks", "duration", "autoStart", "format", "sendTxt", "sentTxt", "processingTxt", "onTick", "className", "style"]; /** * 短信验证码倒计时组件 * * @param props - 组件属性 * @param ref - 组件引用,用于访问内部方法 * @returns JSX.Element - 返回可点击的倒计时显示元素 */ var SmsCountDown = /*#__PURE__*/forwardRef(function (props, ref) { var onSendRequest = props.onSendRequest, _props$totalTicks = props.totalTicks, totalTicks = _props$totalTicks === void 0 ? 60 : _props$totalTicks, _props$duration = props.duration, duration = _props$duration === void 0 ? 1000 : _props$duration, _props$autoStart = props.autoStart, autoStart = _props$autoStart === void 0 ? false : _props$autoStart, _props$format = props.format, format = _props$format === void 0 ? '{t}s' : _props$format, _props$sendTxt = props.sendTxt, sendTxt = _props$sendTxt === void 0 ? '获取验证码' : _props$sendTxt, _props$sentTxt = props.sentTxt, sentTxt = _props$sentTxt === void 0 ? '重新获取' : _props$sentTxt, _props$processingTxt = props.processingTxt, processingTxt = _props$processingTxt === void 0 ? '发送中...' : _props$processingTxt, onTick = props.onTick, propsClassName = props.className, style = props.style, restProps = _objectWithoutProperties(props, _excluded); var _useState = useState(sendTxt), _useState2 = _slicedToArray(_useState, 2), showMessage = _useState2[0], setShowMessage = _useState2[1]; var _useState3 = useState(false), _useState4 = _slicedToArray(_useState3, 2), running = _useState4[0], setRunning = _useState4[1]; var _useState5 = useState(false), _useState6 = _slicedToArray(_useState5, 2), starting = _useState6[0], setStarting = _useState6[1]; /** * 初始化配置对象 * @description * - 使用 useMemo 缓存配置,避免不必要的重新计算 * - 只在相关依赖变化时重新计算 * - 排除 onSendRequest、onTick、className 等不需要缓存的属性 */ var initConfig = useMemo(function () { return { sendTxt: sendTxt, sentTxt: sentTxt, processingTxt: processingTxt, format: format, autoStart: autoStart, totalTicks: totalTicks, duration: duration }; }, [autoStart, duration, format, processingTxt, sendTxt, sentTxt, totalTicks]); /** * 倒计时的目标时间戳(毫秒) * @description * - undefined: 未开始倒计时 * - number: 倒计时结束的时间戳,用于计算剩余时间 */ var _useState7 = useState(), _useState8 = _slicedToArray(_useState7, 2), targetDate = _useState8[0], setTargetDate = _useState8[1]; var _useCountDown = useCountDown({ targetDate: targetDate, interval: duration, onEnd: function onEnd() { setRunning(false); setStarting(false); setShowMessage(initConfig.sentTxt || sentTxt); setTargetDate(undefined); onTick === null || onTick === void 0 || onTick(0); } }), _useCountDown2 = _slicedToArray(_useCountDown, 1), countdownState = _useCountDown2[0]; useEffect(function () { if (countdownState > 0) { if (!running) { setRunning(true); } var second = Math.floor(countdownState / 1000); var formattedMessage = (initConfig.format || format).replace('{t}', String(second)); setShowMessage(formattedMessage); onTick === null || onTick === void 0 || onTick(second); } }, [countdownState, running, initConfig, format, onTick]); useEffect(function () { if (!initConfig.autoStart) { setShowMessage(initConfig.sendTxt || sendTxt); } else { var targetTime = Date.now() + totalTicks * 1000; setTargetDate(targetTime); setStarting(true); setRunning(true); } }, [initConfig, autoStart, sendTxt, totalTicks]); var onStart = useMemoizedFn(function () { if (running || starting) return; setStarting(true); setShowMessage(initConfig.processingTxt || processingTxt); void onSendRequest().then(function () { setRunning(true); var targetTime = Date.now() + totalTicks * 1000; setTargetDate(targetTime); }).catch(function () { setShowMessage(initConfig.sendTxt || sendTxt); setStarting(false); }); }); var className = classNames('v-count-down', propsClassName, { running: running, starting: starting }); useImperativeHandle(ref, function () { return { onStart: onStart }; }); return /*#__PURE__*/jsx("div", _objectSpread2(_objectSpread2({ className: className, style: style, onClick: onStart }, restProps), {}, { children: showMessage })); }); export { SmsCountDown as S }; //# sourceMappingURL=sms-count-down-DgPIS62Q.js.map