92 lines
1.7 KiB
TypeScript
92 lines
1.7 KiB
TypeScript
import { watch, reactive } from 'vue';
|
|
import { v4 as uuidv4 } from 'uuid';
|
|
|
|
import I18n from '@/i18n/index';
|
|
import { safeSavePanels } from '@/hook/panel';
|
|
|
|
interface Tab {
|
|
id: string;
|
|
name: string;
|
|
icon: string;
|
|
type: string;
|
|
componentIndex: number;
|
|
storage: Record<string, any>;
|
|
}
|
|
|
|
// export const debugModes = [
|
|
// Resource, Prompt, Tool, Chat
|
|
// ]
|
|
|
|
// TODO: 实现对于 tabs 这个数据的可持久化
|
|
export const tabs = reactive<{
|
|
content: Tab[]
|
|
activeIndex: number
|
|
activeTab: Tab
|
|
}>({
|
|
content: [
|
|
createTab('blank', 1)
|
|
],
|
|
activeIndex: 0,
|
|
get activeTab() {
|
|
return this.content[this.activeIndex];
|
|
}
|
|
});
|
|
|
|
let tabCounter = 1;
|
|
|
|
// 监控 tabs
|
|
|
|
watch(
|
|
() => tabs,
|
|
(newValue, oldValue) => {
|
|
safeSavePanels();
|
|
},
|
|
{ deep: true }
|
|
);
|
|
|
|
export function createTab(type: string, index: number): Tab {
|
|
let customName: string | null = null;
|
|
const id = uuidv4();
|
|
const { t } = I18n.global;
|
|
|
|
return {
|
|
get name() {
|
|
if (customName !== null) {
|
|
return customName;
|
|
}
|
|
return t('blank-test');
|
|
},
|
|
set name(value: string) {
|
|
customName = value; // 允许外部修改 name
|
|
},
|
|
icon: 'icon-blank',
|
|
type,
|
|
id,
|
|
componentIndex: -1,
|
|
storage: {
|
|
// 默认打开一个 mcp server 的面板
|
|
activeNames: [0]
|
|
},
|
|
};
|
|
}
|
|
|
|
export function addNewTab() {
|
|
const newTab = createTab('blank', ++tabCounter);
|
|
tabs.content.push(newTab);
|
|
tabs.activeIndex = tabs.content.length - 1;
|
|
}
|
|
|
|
export function closeTab(index: number) {
|
|
tabs.content.splice(index, 1);
|
|
|
|
console.log(tabs.content);
|
|
|
|
// 调整活动标签索引
|
|
if (tabs.activeIndex >= index) {
|
|
tabs.activeIndex = Math.max(0, tabs.activeIndex - 1);
|
|
}
|
|
|
|
if (tabs.content.length === 0) {
|
|
addNewTab();
|
|
}
|
|
} |