<template>
<div
id="dataease-v2-embedded-assistant-sqlbot"
class="dataease-v2-embedded-assistant-sqlbot"
></div>
</template>
<script lang="ts" setup>
import { createApp, onMounted, onUnmounted, reactive, ref } from 'vue'
import request from '@/config/axios'
import { useUserStoreWithOut } from '@/store/modules/user'
import SQDatasetSelect from '@/views/sqlbot/SQDatasetSelect.vue'
import AssistantHead from '@/views/sqlbot/AssistantHead.vue'
const userStore = useUserStoreWithOut()
const loading = ref(true)
const state = reactive({
domain: '',
id: '',
enabled: false,
valid: false,
historyShow: false,
sqlbotScript: null
})
const sqlbotExist = ref(false)
const timer = ref()
const loadSqlbotInfo = () => {
const url = '/sysParameter/sqlbot'
request.get({ url }).then(res => {
if (res && res.data) {
const { domain, id, enabled, valid } = res.data
if (!enabled) {
console.error('sqlbot embedded disabled')
}
if (!valid) {
console.error('sqlbot embedded invalid')
}
state.domain = domain
state.id = id
state.enabled = enabled
state.valid = valid
loadSqlbotPage()
}
})
}
const loadSqlbotPage = () => {
const scriptId = `sqlbot-assistant-float-script-${state.id}`
const exitsScript = document.getElementById(scriptId)
if (exitsScript && window['sqlbot_assistant_handler']) {
mountedEmbeddedPage()
return
}
const script = document.createElement('script')
script.defer = true
script.async = true
script.id = scriptId
let sqlbotDomain = state.domain
if (sqlbotDomain.endsWith('/')) {
sqlbotDomain = sqlbotDomain.slice(0, -1)
}
script.src = `${sqlbotDomain}/assistant.js?id=${state.id}&online=true&userFlag=${
userStore.getUid
}&t=${new Date().getTime()}`
script.onload = () => {
mountedEmbeddedPage()
}
document.head.appendChild(script)
state.sqlbotScript = script
}
const mountedEmbeddedPage = () => {
if (sqlbotExist.value) {
return
}
const tempTimer = setTimeout(() => {
if (window['sqlbot_assistant_handler']) {
const container = document.getElementById('sqlbot-assistant-chat-container')
if (container) {
// 数据集选择
const mountPoint = document.createElement('div')
mountPoint.id = 'chat-component-mount-point'
container.appendChild(mountPoint)
const chatApp = createApp(SQDatasetSelect, {
// 在这里传递 props
assistantId: state.id
})
chatApp.mount(mountPoint)
// 头部样式
const mountPointHead = document.createElement('div')
mountPointHead.id = 'chat-component-mount-point-head'
container.appendChild(mountPointHead)
const chatHeadApp = createApp(AssistantHead)
chatHeadApp.mount(mountPointHead)
}
loading.value = false
sqlbotExist.value = true
if (tempTimer) {
clearTimeout(tempTimer)
}
}
}, 2000)
}
onMounted(() => {
loadSqlbotInfo()
timer.value = setInterval(() => {
loadSqlbotInfo()
}, 30000)
})
onUnmounted(() => {
if (timer.value) {
clearInterval(timer.value)
timer.value = null
}
// 移除 script 标签
if (state.sqlbotScript && state.sqlbotScript.parentNode) {
state.sqlbotScript.parentNode.removeChild(state.sqlbotScript)
}
// 可选:清理全局变量
if (window['sqlbot_assistant_handler']) {
delete window['sqlbot_assistant_handler']
}
})
</script>
<style lang="less">
#sqlbot-assistant-chat-container {
z-index: 200;
}
</style>
<style lang="less" scoped>
.dataease-v2-embedded-assistant-sqlbot {
width: 20px;
height: 20px;
overflow: hidden;
position: absolute;
display: flex;
}
</style>