{"version":3,"file":"index.mjs","sources":["../../../../../../../packages/components/bubble/src/bubble-list/index.ts"],"sourcesContent":["import { computed, defineComponent, h, ref, unref, watch } from 'vue'\nimport { useNamespace } from 'element-plus'\nimport { useEventCallback, useState } from '@element-plus/hooks'\nimport { DIV_TAG } from '@element-plus/constants'\nimport useListData from '../hooks/use-list-data'\nimport useDisplayData from '../hooks/use-display-data'\nimport BubbleContextProvider from '../context'\nimport Bubble from '../bubble'\nimport { bubbleListProps } from './bubble-list'\nimport type { BubbleRef } from '../bubble/bubble'\n\nexport default defineComponent({\n  name: 'ElBubbleList',\n  props: bubbleListProps,\n  setup(props, { attrs, slots, expose }) {\n    const ns = useNamespace('bubble-list')\n    const listPrefixCls = ns.b()\n\n    const TOLERANCE = 1\n    const listRef = ref<HTMLDivElement>()\n    const bubbleRefs = ref<Record<string, BubbleRef>>({})\n\n    const items = computed(() => props.items)\n\n    const mergedData = useListData(items, props.roles)\n    const [displayData, onTypingComplete] = useDisplayData(\n      mergedData,\n      (key) => {\n        props.onLastBubbleTypingComplete?.(key)\n      }\n    )\n\n    const [scrollReachEnd, setScrollReachEnd] = useState(true)\n    const [updateCount, setUpdateCount] = useState(0)\n\n    const onInternalScroll = (e: Event) => {\n      const target = e.target as HTMLElement\n\n      setScrollReachEnd(\n        target.scrollHeight -\n          Math.abs(target.scrollTop) -\n          target.clientHeight <=\n          TOLERANCE\n      )\n    }\n\n    watch(updateCount, () => {\n      if (props.autoScroll && unref(listRef) && unref(scrollReachEnd)) {\n        unref(listRef)?.scrollTo({\n          top: unref(listRef)?.scrollHeight,\n        })\n      }\n    })\n\n    // Always scroll to bottom when data change\n    watch(\n      () => unref(displayData).length,\n      () => {\n        if (props.autoScroll) {\n          // New data come, the origin last one is the second last one\n          const lastItemKey =\n            unref(displayData)[unref(displayData).length - 2]?.key\n          const bubbleInst = unref(bubbleRefs)[lastItemKey!]\n\n          // Auto scroll if last 2 item is visible\n          if (bubbleInst && bubbleInst.nativeElement) {\n            const { top, bottom } =\n              bubbleInst.nativeElement.getBoundingClientRect()\n            const { top: listTop, bottom: listBottom } = (\n              unref(listRef) as any\n            ).getBoundingClientRect()\n\n            const isVisible = top < listBottom && bottom > listTop\n            if (isVisible) {\n              setUpdateCount(unref(updateCount) + 1)\n              setScrollReachEnd(true)\n            }\n          }\n        }\n      }\n    )\n\n    const onBubbleUpdate = useEventCallback<void>(() => {\n      if (props.autoScroll) {\n        setUpdateCount(unref(updateCount) + 1)\n      }\n    })\n\n    const context = computed(() => ({\n      onUpdate: onBubbleUpdate,\n    }))\n\n    expose({\n      nativeElement: listRef,\n      scrollTo: ({\n        key,\n        offset,\n        behavior = 'smooth',\n        block,\n      }: {\n        offset?: number\n        key?: string | number\n        behavior?: ScrollBehavior\n        block?: ScrollLogicalPosition\n      }) => {\n        if (typeof offset === 'number') {\n          // Offset scroll\n          unref(listRef)!.scrollTo({\n            top: offset,\n            behavior,\n          })\n        } else if (key !== undefined) {\n          // Key scroll\n          const bubbleInst = unref(bubbleRefs)[key]\n\n          if (bubbleInst) {\n            // Block current auto scrolling\n            const index = unref(displayData).findIndex(\n              (dataItem) => dataItem.key === key\n            )\n            setScrollReachEnd(index === unref(displayData).length - 1)\n\n            // Do native scroll\n            bubbleInst.nativeElement.scrollIntoView({\n              behavior,\n              block,\n            })\n          }\n        }\n      },\n    })\n\n    return () => {\n      return h(\n        BubbleContextProvider,\n        {\n          value: context.value,\n        },\n        {\n          default: () => {\n            return h(\n              DIV_TAG,\n              {\n                ...attrs,\n                class: [\n                  ns.b(),\n                  scrollReachEnd.value ? `${listPrefixCls}-reach-end` : '',\n                ].concat((attrs as any).class),\n                ref: listRef,\n                onScroll: onInternalScroll,\n              },\n              unref(displayData).map(({ key, ...bubble }) => {\n                return h(\n                  Bubble,\n                  {\n                    ...bubble,\n                    key,\n                    ref: (node: BubbleRef) => {\n                      if (node) {\n                        bubbleRefs.value[key] = node\n                      } else {\n                        delete bubbleRefs.value[key]\n                      }\n                    },\n                    onTypingComplete: () => {\n                      bubble.onTypingComplete?.()\n                      onTypingComplete(key)\n                    },\n                  },\n                  slots\n                )\n              })\n            )\n          },\n        }\n      )\n    }\n  },\n})\n"],"names":[],"mappings":"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"}