| import { defineStore } from 'pinia' | |
| import { getLocalState, setLocalState } from './helper' | |
| import { router } from '@/router' | |
| export const useChatStore = defineStore('chat-store', { | |
| state: (): Chat.ChatState => getLocalState(), | |
| getters: { | |
| getChatHistoryByCurrentActive(state: Chat.ChatState) { | |
| const index = state.history.findIndex(item => item.uuid === state.active) | |
| if (index !== -1) | |
| return state.history[index] | |
| return null | |
| }, | |
| getChatByUuid(state: Chat.ChatState) { | |
| return (uuid?: number) => { | |
| if (uuid) | |
| return state.chat.find(item => item.uuid === uuid)?.data ?? [] | |
| return state.chat.find(item => item.uuid === state.active)?.data ?? [] | |
| } | |
| }, | |
| }, | |
| actions: { | |
| setUsingContext(context: boolean) { | |
| this.usingContext = context | |
| this.recordState() | |
| }, | |
| addHistory(history: Chat.History, chatData: Chat.Chat[] = []) { | |
| this.history.unshift(history) | |
| this.chat.unshift({ uuid: history.uuid, data: chatData }) | |
| this.active = history.uuid | |
| this.reloadRoute(history.uuid) | |
| }, | |
| updateHistory(uuid: number, edit: Partial<Chat.History>) { | |
| const index = this.history.findIndex(item => item.uuid === uuid) | |
| if (index !== -1) { | |
| this.history[index] = { ...this.history[index], ...edit } | |
| this.recordState() | |
| } | |
| }, | |
| async deleteHistory(index: number) { | |
| this.history.splice(index, 1) | |
| this.chat.splice(index, 1) | |
| if (this.history.length === 0) { | |
| this.active = null | |
| this.reloadRoute() | |
| return | |
| } | |
| if (index > 0 && index <= this.history.length) { | |
| const uuid = this.history[index - 1].uuid | |
| this.active = uuid | |
| this.reloadRoute(uuid) | |
| return | |
| } | |
| if (index === 0) { | |
| if (this.history.length > 0) { | |
| const uuid = this.history[0].uuid | |
| this.active = uuid | |
| this.reloadRoute(uuid) | |
| } | |
| } | |
| if (index > this.history.length) { | |
| const uuid = this.history[this.history.length - 1].uuid | |
| this.active = uuid | |
| this.reloadRoute(uuid) | |
| } | |
| }, | |
| async setActive(uuid: number) { | |
| this.active = uuid | |
| return await this.reloadRoute(uuid) | |
| }, | |
| getChatByUuidAndIndex(uuid: number, index: number) { | |
| if (!uuid || uuid === 0) { | |
| if (this.chat.length) | |
| return this.chat[0].data[index] | |
| return null | |
| } | |
| const chatIndex = this.chat.findIndex(item => item.uuid === uuid) | |
| if (chatIndex !== -1) | |
| return this.chat[chatIndex].data[index] | |
| return null | |
| }, | |
| addChatByUuid(uuid: number, chat: Chat.Chat) { | |
| if (!uuid || uuid === 0) { | |
| if (this.history.length === 0) { | |
| const uuid = Date.now() | |
| this.history.push({ uuid, title: chat.text, isEdit: false }) | |
| this.chat.push({ uuid, data: [chat] }) | |
| this.active = uuid | |
| this.recordState() | |
| } | |
| else { | |
| this.chat[0].data.push(chat) | |
| if (this.history[0].title === 'New Chat') | |
| this.history[0].title = chat.text | |
| this.recordState() | |
| } | |
| } | |
| const index = this.chat.findIndex(item => item.uuid === uuid) | |
| if (index !== -1) { | |
| this.chat[index].data.push(chat) | |
| if (this.history[index].title === 'New Chat') | |
| this.history[index].title = chat.text | |
| this.recordState() | |
| } | |
| }, | |
| updateChatByUuid(uuid: number, index: number, chat: Chat.Chat) { | |
| if (!uuid || uuid === 0) { | |
| if (this.chat.length) { | |
| this.chat[0].data[index] = chat | |
| this.recordState() | |
| } | |
| return | |
| } | |
| const chatIndex = this.chat.findIndex(item => item.uuid === uuid) | |
| if (chatIndex !== -1) { | |
| this.chat[chatIndex].data[index] = chat | |
| this.recordState() | |
| } | |
| }, | |
| updateChatSomeByUuid(uuid: number, index: number, chat: Partial<Chat.Chat>) { | |
| if (!uuid || uuid === 0) { | |
| if (this.chat.length) { | |
| this.chat[0].data[index] = { ...this.chat[0].data[index], ...chat } | |
| this.recordState() | |
| } | |
| return | |
| } | |
| const chatIndex = this.chat.findIndex(item => item.uuid === uuid) | |
| if (chatIndex !== -1) { | |
| this.chat[chatIndex].data[index] = { ...this.chat[chatIndex].data[index], ...chat } | |
| this.recordState() | |
| } | |
| }, | |
| deleteChatByUuid(uuid: number, index: number) { | |
| if (!uuid || uuid === 0) { | |
| if (this.chat.length) { | |
| this.chat[0].data.splice(index, 1) | |
| this.recordState() | |
| } | |
| return | |
| } | |
| const chatIndex = this.chat.findIndex(item => item.uuid === uuid) | |
| if (chatIndex !== -1) { | |
| this.chat[chatIndex].data.splice(index, 1) | |
| this.recordState() | |
| } | |
| }, | |
| clearChatByUuid(uuid: number) { | |
| if (!uuid || uuid === 0) { | |
| if (this.chat.length) { | |
| this.chat[0].data = [] | |
| this.recordState() | |
| } | |
| return | |
| } | |
| const index = this.chat.findIndex(item => item.uuid === uuid) | |
| if (index !== -1) { | |
| this.chat[index].data = [] | |
| this.recordState() | |
| } | |
| }, | |
| async reloadRoute(uuid?: number) { | |
| this.recordState() | |
| await router.push({ name: 'Chat', params: { uuid } }) | |
| }, | |
| recordState() { | |
| setLocalState(this.$state) | |
| }, | |
| }, | |
| }) | |