import { balBrowser } from "../browser";
import { debounce } from "../helpers";
import { ListenerAbstract } from "../types/listener";
export class BalResizeListener extends ListenerAbstract {
    constructor() {
        super(...arguments);
        this.debouncedNotify = debounce((info) => this.notify(info), 42);
    }
    connect(el) {
        var _a;
        super.connect(el);
        if (typeof ResizeObserver === 'undefined') {
            return;
        }
        if (this.resizeObserver !== undefined) {
            (_a = this.resizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
            this.resizeObserver = undefined;
        }
        this.resizeObserver = new ResizeObserver(entries => {
            if (balBrowser.hasWindow) {
                window.requestAnimationFrame(() => {
                    if (!Array.isArray(entries) || !entries.length) {
                        return;
                    }
                    const entry = entries[0];
                    if (this.lastWidth === undefined && this.lastHeight === undefined) {
                        this.lastWidth = entry.contentRect.width;
                        this.lastHeight = entry.contentRect.height;
                    }
                    else {
                        const widthChanged = this.lastWidth !== entry.contentRect.width;
                        const heightChanged = this.lastHeight !== entry.contentRect.height;
                        if (widthChanged || heightChanged) {
                            this.debouncedNotify({
                                width: widthChanged,
                                height: heightChanged,
                            });
                            this.lastWidth = entry.contentRect.width;
                            this.lastHeight = entry.contentRect.height;
                        }
                    }
                });
            }
        });
        this.resizeObserver.observe(el);
    }
    disconnect() {
        var _a;
        super.disconnect();
        (_a = this.resizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
        this.resizeObserver = undefined;
    }
}
