Add File
This commit is contained in:
150
frontend/src/stores/assistant.ts
Normal file
150
frontend/src/stores/assistant.ts
Normal file
@@ -0,0 +1,150 @@
|
|||||||
|
import { defineStore } from 'pinia'
|
||||||
|
import { store } from './index'
|
||||||
|
import { chatApi, ChatInfo } from '@/api/chat'
|
||||||
|
import { useCache } from '@/utils/useCache'
|
||||||
|
|
||||||
|
const { wsCache } = useCache()
|
||||||
|
const flagKey = 'sqlbit-assistant-flag'
|
||||||
|
type Resolver<T = any> = (value: T | PromiseLike<T>) => void
|
||||||
|
type Rejecter = (reason?: any) => void
|
||||||
|
interface PendingRequest<T = any> {
|
||||||
|
resolve: Resolver<T>
|
||||||
|
reject: Rejecter
|
||||||
|
}
|
||||||
|
interface AssistantState {
|
||||||
|
id: string
|
||||||
|
token: string
|
||||||
|
assistant: boolean
|
||||||
|
flag: number
|
||||||
|
type: number
|
||||||
|
certificate: string
|
||||||
|
online: boolean
|
||||||
|
pageEmbedded?: boolean
|
||||||
|
requestPromiseMap: Map<string, PendingRequest>
|
||||||
|
}
|
||||||
|
|
||||||
|
export const AssistantStore = defineStore('assistant', {
|
||||||
|
state: (): AssistantState => {
|
||||||
|
return {
|
||||||
|
id: '',
|
||||||
|
token: '',
|
||||||
|
assistant: false,
|
||||||
|
flag: 0,
|
||||||
|
type: 0,
|
||||||
|
certificate: '',
|
||||||
|
online: false,
|
||||||
|
pageEmbedded: false,
|
||||||
|
requestPromiseMap: new Map<string, PendingRequest>(),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
getters: {
|
||||||
|
getCertificate(): string {
|
||||||
|
return this.certificate
|
||||||
|
},
|
||||||
|
getId(): string {
|
||||||
|
return this.id
|
||||||
|
},
|
||||||
|
getToken(): string {
|
||||||
|
return this.token
|
||||||
|
},
|
||||||
|
getAssistant(): boolean {
|
||||||
|
return this.assistant
|
||||||
|
},
|
||||||
|
getFlag(): number {
|
||||||
|
return this.flag
|
||||||
|
},
|
||||||
|
getType(): number {
|
||||||
|
return this.type
|
||||||
|
},
|
||||||
|
getOnline(): boolean {
|
||||||
|
return this.online
|
||||||
|
},
|
||||||
|
getPageEmbedded(): boolean {
|
||||||
|
return this.pageEmbedded || false
|
||||||
|
},
|
||||||
|
getEmbedded(): boolean {
|
||||||
|
return this.assistant && this.type === 4
|
||||||
|
},
|
||||||
|
},
|
||||||
|
actions: {
|
||||||
|
refreshCertificate<T>() {
|
||||||
|
const timeout = 30000
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const timeoutId = setTimeout(() => {
|
||||||
|
this.requestPromiseMap.delete(this.id)
|
||||||
|
reject(new Error(`Request ${this.id} timed out after ${timeout}ms`))
|
||||||
|
}, timeout)
|
||||||
|
this.requestPromiseMap.set(this.id, {
|
||||||
|
resolve: (value: T) => {
|
||||||
|
clearTimeout(timeoutId)
|
||||||
|
this.requestPromiseMap.delete(this.id)
|
||||||
|
resolve(value)
|
||||||
|
},
|
||||||
|
reject: (reason) => {
|
||||||
|
clearTimeout(timeoutId)
|
||||||
|
this.requestPromiseMap.delete(this.id)
|
||||||
|
reject(reason)
|
||||||
|
},
|
||||||
|
})
|
||||||
|
const readyData = {
|
||||||
|
eventName: this.pageEmbedded ? 'sqlbot_embedded_event' : 'sqlbot_assistant_event',
|
||||||
|
busi: 'ready',
|
||||||
|
ready: true,
|
||||||
|
messageId: this.id,
|
||||||
|
}
|
||||||
|
window.parent.postMessage(readyData, '*')
|
||||||
|
})
|
||||||
|
},
|
||||||
|
resolveCertificate(data?: any) {
|
||||||
|
const peddingRequest = this.requestPromiseMap.get(this.id)
|
||||||
|
if (peddingRequest) {
|
||||||
|
peddingRequest.resolve(data)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
setId(id: string) {
|
||||||
|
this.id = id
|
||||||
|
},
|
||||||
|
setCertificate(certificate: string) {
|
||||||
|
this.certificate = certificate
|
||||||
|
},
|
||||||
|
setType(type: number) {
|
||||||
|
this.type = type
|
||||||
|
},
|
||||||
|
setToken(token: string) {
|
||||||
|
this.token = token
|
||||||
|
},
|
||||||
|
setAssistant(assistant: boolean) {
|
||||||
|
this.assistant = assistant
|
||||||
|
},
|
||||||
|
setFlag(flag: number) {
|
||||||
|
if (wsCache.get(flagKey)) {
|
||||||
|
this.flag = wsCache.get(flagKey)
|
||||||
|
} else {
|
||||||
|
this.flag = flag
|
||||||
|
wsCache.set(flagKey, flag)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
setPageEmbedded(embedded?: boolean) {
|
||||||
|
this.pageEmbedded = !!embedded
|
||||||
|
},
|
||||||
|
setOnline(online: boolean) {
|
||||||
|
this.online = !!online
|
||||||
|
},
|
||||||
|
async setChat() {
|
||||||
|
if (!this.assistant) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
const res = await chatApi.startAssistantChat()
|
||||||
|
const chat: ChatInfo | undefined = chatApi.toChatInfo(res)
|
||||||
|
return chat
|
||||||
|
},
|
||||||
|
clear() {
|
||||||
|
wsCache.delete(flagKey)
|
||||||
|
this.$reset()
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
export const useAssistantStore = () => {
|
||||||
|
return AssistantStore(store)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user