import { forwardRef, useCallback, useEffect, useRef } from '@byted-doubao-apps/framework';
import { Text } from '../Text/index.jsx';
import { mapScrollViewProps, toScrollViewEvent } from './map.js';
export const ScrollView = forwardRef(ScrollViewImpl);
function ScrollViewImpl(props, ref) {
    const { children, onScrollToUpper, onScrollToLower, onScroll, onScrollEnd, onContentSizeChanged, ...nonEventProps } = props;
    const { mapped, scrollViewId, scrollOffset, scrollWithAnimation } = mapScrollViewProps(nonEventProps);
    const scrollViewRef = useRef(null);
    const previousScrollOffsetRef = useRef(scrollOffset);
    const assignRef = useCallback((instance) => {
        scrollViewRef.current = instance;
        assignForwardedRef(ref, instance);
    }, [ref]);
    useEffect(() => {
        if (scrollOffset === undefined || previousScrollOffsetRef.current === scrollOffset) {
            previousScrollOffsetRef.current = scrollOffset;
            return;
        }
        previousScrollOffsetRef.current = scrollOffset;
        scrollViewRef.current
            ?.invoke({
            method: 'scrollTo',
            params: {
                offset: scrollOffset,
                smooth: scrollWithAnimation
            }
        })
            .exec();
    }, [scrollOffset, scrollWithAnimation]);
    const handleScrollToUpper = useCallback((event) => {
        onScrollToUpper?.(toScrollViewEvent(event, 'scrolltoupper', scrollViewId));
    }, [onScrollToUpper, scrollViewId]);
    const handleScrollToLower = useCallback((event) => {
        onScrollToLower?.(toScrollViewEvent(event, 'scrolltolower', scrollViewId));
    }, [onScrollToLower, scrollViewId]);
    const handleScroll = useCallback((event) => {
        onScroll?.(toScrollViewEvent(event, 'scroll', scrollViewId));
    }, [onScroll, scrollViewId]);
    const handleScrollEnd = useCallback((event) => {
        onScrollEnd?.(toScrollViewEvent(event, 'scrollend', scrollViewId));
    }, [onScrollEnd, scrollViewId]);
    const handleContentSizeChanged = useCallback((event) => {
        onContentSizeChanged?.(toScrollViewEvent(event, 'contentsizechanged', scrollViewId));
    }, [onContentSizeChanged, scrollViewId]);
    return (<scroll-view {...mapped} ref={assignRef} {...(onScrollToUpper ? { onScrollToUpper: handleScrollToUpper } : {})} {...(onScrollToLower ? { onScrollToLower: handleScrollToLower } : {})} {...(onScroll ? { onScroll: handleScroll } : {})} {...(onScrollEnd ? { onScrollEnd: handleScrollEnd } : {})} {...(onContentSizeChanged ? { onContentSizeChanged: handleContentSizeChanged } : {})}>
      {wrapTextNode(children)}
    </scroll-view>);
}
function wrapTextNode(child) {
    if (typeof child === 'string' || typeof child === 'number') {
        return <Text>{child}</Text>;
    }
    if (Array.isArray(child)) {
        return child.map((item) => wrapTextNode(item));
    }
    return child;
}
function assignForwardedRef(ref, value) {
    if (typeof ref === 'function') {
        ref(value);
        return;
    }
    if (ref) {
        ref.current = value;
    }
}
//# sourceMappingURL=index.jsx.map