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);