| 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) |
| }, |
| }, |
| }) |
|
|