UNPKG

react-textra

Version:
117 lines (116 loc) 5.99 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); // eslint-disable-next-line no-use-before-define var react_1 = __importStar(require("react")); var animationStyles_1 = __importDefault(require("./animationStyles")); var Textra = function (props) { var selectedAnimation = props.effect || 'simple'; var animationRef = react_1.useRef(null); var _a = react_1.useState(animationStyles_1.default[selectedAnimation][0]), style = _a[0], setStyle = _a[1]; var textArrIndex = react_1.useRef(0); var previousTime = react_1.useRef(null); var animationDuration = props.duration || 500; var stopDuration = props.stopDuration || 3000; var currentRoundStartTime = react_1.useRef(0); var singleRoundDuration = stopDuration + 2 * animationDuration; var easeOutQuad = function (t) { return t * (2 - t); }; var text = props.data[textArrIndex.current]; react_1.useEffect(function () { setStyle(animationStyles_1.default[selectedAnimation][0]); }, [selectedAnimation]); var runShowTextAnimation = function (elapsed) { var showingTranlateInitial = animationStyles_1.default[selectedAnimation][1].translate.value; var showingTranlateDiffrence = animationStyles_1.default[selectedAnimation][1].translate.value - animationStyles_1.default[selectedAnimation][0].translate.value; var showingTiming = easeOutQuad((elapsed - currentRoundStartTime.current) / animationDuration); setStyle(function (s) { return ({ translate: __assign(__assign({}, s.translate), { value: showingTranlateInitial - showingTranlateDiffrence * showingTiming }), opacity: showingTiming }); }); }; var runHideTextAnimation = function (elapsed) { var hidingTraslateInitial = animationStyles_1.default[selectedAnimation][0].translate.value; var hidingTranslateDiffrence = animationStyles_1.default[selectedAnimation][0].translate.value - animationStyles_1.default[selectedAnimation][1].translate.value; var hidingOpacityInitial = animationStyles_1.default[selectedAnimation][0].opacity; var hidingTiming = easeOutQuad((elapsed - (currentRoundStartTime.current + singleRoundDuration - animationDuration)) / animationDuration); setStyle(function (s) { return ({ translate: __assign(__assign({}, s.translate), { value: hidingTraslateInitial - hidingTranslateDiffrence * hidingTiming }), opacity: hidingOpacityInitial - hidingTiming }); }); }; var updateTextIndex = function () { if (textArrIndex.current === props.data.length - 1) { textArrIndex.current = 0; } else { textArrIndex.current = textArrIndex.current + 1; } }; var updateRoudStartTime = function () { currentRoundStartTime.current += singleRoundDuration; }; var handlePropEvents = function () { props.onUpdate && props.onUpdate(textArrIndex.current); }; var runAnimation = react_1.useCallback(function (timestamps) { if (previousTime.current === null) previousTime.current = timestamps; var elapsed = timestamps - previousTime.current; if (elapsed > currentRoundStartTime.current && elapsed < currentRoundStartTime.current + animationDuration) { runShowTextAnimation(elapsed); } if (elapsed > currentRoundStartTime.current + singleRoundDuration - animationDuration && elapsed < currentRoundStartTime.current + singleRoundDuration) { runHideTextAnimation(elapsed); } if (elapsed > currentRoundStartTime.current + singleRoundDuration) { updateRoudStartTime(); updateTextIndex(); handlePropEvents(); } animationRef.current = window.requestAnimationFrame(runAnimation); }, [selectedAnimation, props.data.length, singleRoundDuration, animationDuration]); react_1.useEffect(function () { animationRef.current = window.requestAnimationFrame(runAnimation); return function () { return window.cancelAnimationFrame(animationRef.current); }; }, [runAnimation, props.effect]); return (react_1.default.createElement(react_1.default.Fragment, null, react_1.default.createElement("span", __assign({ style: { display: 'inline-block', transform: style.translate.type + "(" + style.translate.value + style.translate.unit + ")", opacity: style.opacity } }, props), text))); }; exports.default = Textra;