@ant-design/x
Version:
Craft AI-driven interfaces effortlessly
48 lines (44 loc) • 1.8 kB
JavaScript
;
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _useLayoutEffect = _interopRequireDefault(require("rc-util/lib/hooks/useLayoutEffect"));
var React = _interopRequireWildcard(require("react"));
function isString(str) {
return typeof str === 'string';
}
/**
* Return typed content and typing status when typing is enabled.
* Or return content directly.
*/
const useTypedEffect = (content, typingEnabled, typingStep, typingInterval) => {
const prevContentRef = React.useRef('');
const [typingIndex, setTypingIndex] = React.useState(1);
const mergedTypingEnabled = typingEnabled && isString(content);
// Reset typing index when content changed
(0, _useLayoutEffect.default)(() => {
if (!mergedTypingEnabled && isString(content)) {
setTypingIndex(content.length);
} else if (isString(content) && isString(prevContentRef.current) && content.indexOf(prevContentRef.current) !== 0) {
setTypingIndex(1);
}
prevContentRef.current = content;
}, [content]);
// Start typing
React.useEffect(() => {
if (mergedTypingEnabled && typingIndex < content.length) {
const id = setTimeout(() => {
setTypingIndex(prev => prev + typingStep);
}, typingInterval);
return () => {
clearTimeout(id);
};
}
}, [typingIndex, typingEnabled, content]);
const mergedTypingContent = mergedTypingEnabled ? content.slice(0, typingIndex) : content;
return [mergedTypingContent, mergedTypingEnabled && typingIndex < content.length];
};
var _default = exports.default = useTypedEffect;