{"version":3,"file":"chat.mjs","sources":["../../src/chat/chat.tsx"],"sourcesContent":["import { defineComponent, computed, provide, ref } from 'vue';\nimport { Divider, Popconfirm } from 'tdesign-vue-next';\nimport { ClearIcon } from 'tdesign-icons-vue-next';\nimport { isArray } from 'lodash-es';\n\nimport props from './props';\nimport { usePrefixClass, useConfig } from '../hooks/useConfig';\nimport { useTNodeJSX } from '../hooks/tnode';\nimport ChatItem from './chat-item';\nimport { TdChatItemProps, BackBottomParams } from './type';\n\nconst handleScrollToBottom = (target: HTMLDivElement, behavior?: 'auto' | 'smooth') => {\n  const currentScrollHeight = target.scrollHeight;\n  const currentClientHeight = target.clientHeight;\n\n  const innerBehavior = behavior ?? 'auto';\n  if (innerBehavior === 'auto') {\n    target.scrollTop = currentScrollHeight - currentClientHeight;\n  } else {\n    const startScrollTop = target.scrollTop;\n    const endScrollTop = currentScrollHeight - currentClientHeight;\n    const duration = 300;\n    const step = (endScrollTop - startScrollTop) / duration;\n    let startTime: number | undefined;\n    // 平滑地修改scrollTop值\n    const animateScroll = (time: number) => {\n      if (!startTime) {\n        startTime = time;\n      }\n      const elapsed = time - startTime;\n      const top = Math.min(endScrollTop, startScrollTop + elapsed * step);\n      target.scrollTop = top;\n      if (top < endScrollTop) {\n        requestAnimationFrame(animateScroll);\n      }\n    };\n\n    requestAnimationFrame(animateScroll);\n  }\n};\n\nexport default defineComponent({\n  name: 'TChat',\n  props: {\n    data: props.data,\n    layout: props.layout,\n    clearHistory: props.clearHistory,\n    reverse: props.reverse,\n    isStreamLoad: props.isStreamLoad,\n    textLoading: props.textLoading,\n    animation: props.animation,\n    onClear: props.onClear,\n    onScroll: props.onScroll,\n  },\n  emits: ['clear', 'scroll'],\n  setup(props, { emit, expose, slots }) {\n    const COMPONENT_NAME = usePrefixClass('chat');\n    const { globalConfig } = useConfig('chat');\n    const { clearHistoryBtnText, confirmClearHistory } = globalConfig.value;\n    const renderTNodeJSX = useTNodeJSX();\n    provide('textLoading', props.textLoading);\n    provide('animation', props.animation);\n    provide('reverse', props.reverse);\n    const classes = computed(() => {\n      return [\n        COMPONENT_NAME.value,\n        {\n          [`${COMPONENT_NAME.value}--normal`]: props.layout === 'both',\n        },\n      ];\n    });\n    // 默认反转布局\n    const listClasses = computed(() => {\n      return [\n        `${COMPONENT_NAME.value}__list`,\n        {\n          [`${COMPONENT_NAME.value}__list--reverse`]: props.reverse,\n        },\n      ];\n    });\n    const renderBody = () => {\n      /**\n       * 1. 两种方式获取要渲染的 list\n       *  a. props 传 data\n       *  b. slots t-chat-item\n       * a 优先级更高\n       */\n      const data = renderTNodeJSX('data') || props.data;\n      if (isArray(data) && data.length > 0) {\n        const isLoading = (index: number) => {\n          return (props.reverse ? index === 0 : index === data.length - 1) && props.textLoading;\n        };\n        const isReasoningLoading = (index: number) => {\n          return (props.reverse ? index === 0 : index === data.length - 1) && props.isStreamLoad;\n        };\n        // 判断content是否为插槽，如果是插槽，则关闭reasoning默认渲染\n        const setReasoning = (item: TdChatItemProps) => {\n          return slots.content ? false : item.reasoning;\n        };\n        return data.map((item: TdChatItemProps, index: number) => (\n          <ChatItem\n            avatar={item.avatar}\n            name={item.name}\n            role={item.role}\n            datetime={item.datetime}\n            content={item.content}\n            reasoning={setReasoning(item)}\n            reasoningLoading={isReasoningLoading(index)}\n            text-loading={isLoading(index)}\n            itemIndex={index}\n            animation={props.animation}\n            v-slots={{\n              actions: () =>\n                renderTNodeJSX('actions', {\n                  params: { item, index },\n                }),\n              name: () => renderTNodeJSX('name', { params: { item, index } }),\n              avatar: () => renderTNodeJSX('avatar', { params: { item, index } }),\n              datetime: () => renderTNodeJSX('datetime', { params: { item, index } }),\n              content: () => renderTNodeJSX('content', { params: { item, index } }),\n            }}\n          />\n        ));\n      } else {\n        return renderTNodeJSX('default');\n      }\n    };\n    const clearConfirm = (context: { e: MouseEvent }) => {\n      emit('clear', context);\n    };\n    const defaultClearHistory = (\n      <Popconfirm content={confirmClearHistory} onConfirm={clearConfirm}>\n        <Divider class=\"clear-btn\">\n          <ClearIcon size=\"14px\" />\n          <span class=\"clear-btn-text\">{clearHistoryBtnText}</span>\n        </Divider>\n      </Popconfirm>\n    );\n    const showFooter = computed(() => renderTNodeJSX('footer'));\n    const chatBoxRef = ref<HTMLDivElement>();\n    // 滚动到底部\n    const scrollToBottom = (data: BackBottomParams) => {\n      if (!chatBoxRef.value) return;\n      const { behavior = 'auto' } = data;\n      handleScrollToBottom(chatBoxRef.value, behavior);\n    };\n    const handleScroll = (e: Event) => {\n      emit('scroll', {\n        e,\n      });\n    };\n    expose({\n      scrollToBottom,\n    });\n    // clearHistory为true时，清空历史记录显示\n    // return里的props是响应式\n    // 倒序渲染不影响清空历史的位置\n    return () => (\n      <div class={classes.value}>\n        <div class={listClasses.value} ref={chatBoxRef} onScroll={handleScroll}>\n          {props.reverse && <div className=\"place-holder\"></div>}\n          {props.reverse && props.clearHistory && renderTNodeJSX('clearHistory', defaultClearHistory)}\n          {renderBody()}\n          {!props.reverse && props.clearHistory && renderTNodeJSX('clearHistory', defaultClearHistory)}\n        </div>\n        {showFooter.value && <div class={`${COMPONENT_NAME.value}__footer`}>{showFooter.value}</div>}\n      </div>\n    );\n  },\n});\n"],"names":["handleScrollToBottom","target","behavior","currentScrollHeight","scrollHeight","currentClientHeight","clientHeight","innerBehavior","scrollTop","startScrollTop","endScrollTop","duration","step","startTime","animateScroll","time","elapsed","top","Math","min","requestAnimationFrame","defineComponent","name","props","data","layout","clearHistory","reverse","isStreamLoad","textLoading","animation","onClear","onScroll","emits","setup","_ref","emit","expose","slots","COMPONENT_NAME","usePrefixClass","_useConfig","useConfig","globalConfig","_globalConfig$value","value","clearHistoryBtnText","confirmClearHistory","renderTNodeJSX","useTNodeJSX","provide","classes","computed","_defineProperty","concat","listClasses","renderBody","isArray","length","isLoading","index","isReasoningLoading","setReasoning","item","content","reasoning","map","_createVNode","ChatItem","avatar","role","datetime","actions","params","clearConfirm","context","defaultClearHistory","Popconfirm","_default","Divider","ClearIcon","showFooter","chatBoxRef","ref","scrollToBottom","_data$behavior","handleScroll","e"],"mappings":"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"}