@flatbiz/antd
Version:
146 lines (140 loc) • 5.29 kB
JavaScript
/*! @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