import { __awaiter, __generator } from "tslib"; import { useEffect, useEvent, usePageShow, useState, } from 'functional-mini/component'; import '../_util/assert-component2'; import { mountComponent } from '../_util/component'; import { useComponentEvent } from '../_util/hooks/useComponentEvent'; import { useEvent as useStableCallback } from '../_util/hooks/useEvent'; import { useInstanceBoundingClientRect } from '../_util/hooks/useInstanceBoundingClientRect'; import { NoticeBarFunctionalProps } from './props'; var NoticeBar = function (props) { var _a = useState(''), marqueeStyle = _a[0], setMarqueeStyle = _a[1]; var _b = useState(true), show = _b[0], setShow = _b[1]; var triggerEventOnly = useComponentEvent(props).triggerEventOnly; var startMarquee = useStableCallback(function (state) { var loop = props.loop; var leading = 500; var duration = state.duration, overflowWidth = state.overflowWidth, viewWidth = state.viewWidth; var marqueeScrollWidth = overflowWidth; if (loop) { marqueeScrollWidth = overflowWidth + viewWidth; } var newMarqueeStyle = "transform: translate3d(".concat(-marqueeScrollWidth, "px, 0, 0); transition: ").concat(duration, "s all linear ").concat(typeof leading === 'number' ? "".concat(leading / 1000, "s") : '0s', ";"); setMarqueeStyle(newMarqueeStyle); }); var getBoundingClientRectWithId = useInstanceBoundingClientRect().getBoundingClientRectWithId; function measureText(callback) { var _this = this; var fps = 40; var loop = props.loop; // 计算文本所占据的宽度,计算需要滚动的宽度 setTimeout(function () { return __awaiter(_this, void 0, void 0, function () { var marqueeSize, contentSize, overflowWidth, viewWidth, marqueeScrollWidth; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, getBoundingClientRectWithId('.ant-notice-bar-marquee')]; case 1: marqueeSize = _a.sent(); return [4 /*yield*/, getBoundingClientRectWithId('.ant-notice-bar-content')]; case 2: contentSize = _a.sent(); overflowWidth = (marqueeSize && contentSize && marqueeSize.width - contentSize.width) || 0; viewWidth = (contentSize === null || contentSize === void 0 ? void 0 : contentSize.width) || 0; marqueeScrollWidth = overflowWidth; if (loop) { marqueeScrollWidth = overflowWidth + viewWidth; } if (overflowWidth > 0) { callback({ overflowWidth: overflowWidth, viewWidth: viewWidth, duration: marqueeScrollWidth / fps, }); } return [2 /*return*/]; } }); }); }, 0); } useEffect(function () { var enableMarquee = props.enableMarquee; if (enableMarquee) { measureText(startMarquee); } }); function resetMarquee(state) { var loop = props.loop; var viewWidth = state.viewWidth; var showMarqueeWidth = '0px'; if (loop) { showMarqueeWidth = "".concat(viewWidth, "px"); } var marqueeStyle = "transform: translate3d(".concat(showMarqueeWidth, ", 0, 0); transition: 0s all linear;"); setMarqueeStyle(marqueeStyle); } useEvent('onTransitionEnd', function () { var loop = props.loop; var trailing = 200; if (loop) { setTimeout(function () { measureText(function (state) { resetMarquee(state); }); }, trailing); } }); useEvent('onTap', function () { var mode = props.mode; if (mode === 'link') { triggerEventOnly('tap'); } if (mode === 'closeable') { if (typeof props.onTap !== 'function') { return; } setShow(false); triggerEventOnly('tap'); } }); usePageShow(function () { if (props.enableMarquee) { setMarqueeStyle(''); resetMarquee({ overflowWidth: 0, duration: 0, viewWidth: 0, }); measureText(startMarquee); } }); return { marqueeStyle: marqueeStyle, show: show, }; }; mountComponent(NoticeBar, NoticeBarFunctionalProps);