mirror of
https://github.com/EthanMarti/infio-copilot.git
synced 2026-01-16 08:21:55 +00:00
在BaseFileView.tsx中添加关闭状态管理,优化文件保存逻辑以防止数据丢失,确保在视图关闭时不进行保存操作。
This commit is contained in:
parent
519fc3769d
commit
e2df9a7995
@ -11,6 +11,7 @@ export default abstract class BaseView extends TextFileView {
|
|||||||
protected state: { filePath?: string } | null = null;
|
protected state: { filePath?: string } | null = null;
|
||||||
protected isEditorLoaded: boolean = false;
|
protected isEditorLoaded: boolean = false;
|
||||||
protected currentFilePath: string | null = null;
|
protected currentFilePath: string | null = null;
|
||||||
|
protected isClosing: boolean = false;
|
||||||
|
|
||||||
protected constructor(leaf: WorkspaceLeaf, plugin: InfioPlugin) {
|
protected constructor(leaf: WorkspaceLeaf, plugin: InfioPlugin) {
|
||||||
super(leaf);
|
super(leaf);
|
||||||
@ -79,7 +80,7 @@ export default abstract class BaseView extends TextFileView {
|
|||||||
|
|
||||||
async onLoadFile(file: TFile): Promise<void> {
|
async onLoadFile(file: TFile): Promise<void> {
|
||||||
try {
|
try {
|
||||||
const content = await this.app.vault.read(file);
|
const content = await this.app.vault.cachedRead(file);
|
||||||
this.setViewData(content, true);
|
this.setViewData(content, true);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Failed to load file content:', error);
|
console.error('Failed to load file content:', error);
|
||||||
@ -103,8 +104,20 @@ export default abstract class BaseView extends TextFileView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async save(clear?: boolean): Promise<void> {
|
async save(clear?: boolean): Promise<void> {
|
||||||
|
// Prevent saving if the view is closing
|
||||||
|
if (this.isClosing) {
|
||||||
|
console.log("save() called during close, skipping to prevent data loss");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const content = this.getViewData();
|
const content = this.getViewData();
|
||||||
|
|
||||||
|
// Additional safety check: don't save if content is empty and we had content before
|
||||||
|
if (!content.trim() && this.currentFilePath) {
|
||||||
|
console.log("Refusing to save empty content, potential data loss prevented");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (this.file) {
|
if (this.file) {
|
||||||
// Regular file in vault
|
// Regular file in vault
|
||||||
await this.app.vault.modify(this.file, content);
|
await this.app.vault.modify(this.file, content);
|
||||||
@ -133,6 +146,7 @@ export default abstract class BaseView extends TextFileView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
onClose(): Promise<void> {
|
onClose(): Promise<void> {
|
||||||
|
this.isClosing = true;
|
||||||
return super.onClose();
|
return super.onClose();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -145,7 +159,7 @@ export default abstract class BaseView extends TextFileView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected onEditorUpdate(update: ViewUpdate): void {
|
protected onEditorUpdate(update: ViewUpdate): void {
|
||||||
if (update.docChanged) {
|
if (update.docChanged && !this.isClosing) {
|
||||||
this.requestSave();
|
this.requestSave();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -150,6 +150,7 @@ export class McpHub {
|
|||||||
private mcpSettingsFilePath: string | null = null
|
private mcpSettingsFilePath: string | null = null
|
||||||
// private globalMcpFilePath: string | null = null
|
// private globalMcpFilePath: string | null = null
|
||||||
private fileWatchers: Map<string, FSWatcher[]> = new Map()
|
private fileWatchers: Map<string, FSWatcher[]> = new Map()
|
||||||
|
private configFileChangeTimeout: NodeJS.Timeout | null = null
|
||||||
private isDisposed: boolean = false
|
private isDisposed: boolean = false
|
||||||
connections: McpConnection[] = []
|
connections: McpConnection[] = []
|
||||||
// 添加内置服务器连接
|
// 添加内置服务器连接
|
||||||
@ -177,7 +178,7 @@ export class McpHub {
|
|||||||
// Ensure the MCP configuration directory exists
|
// Ensure the MCP configuration directory exists
|
||||||
await this.ensureMcpFileExists()
|
await this.ensureMcpFileExists()
|
||||||
await this.watchMcpSettingsFile();
|
await this.watchMcpSettingsFile();
|
||||||
this.setupWorkspaceWatcher();
|
// this.setupWorkspaceWatcher();
|
||||||
await this.initializeGlobalMcpServers();
|
await this.initializeGlobalMcpServers();
|
||||||
// 初始化内置服务器
|
// 初始化内置服务器
|
||||||
await this.initializeBuiltInServer();
|
await this.initializeBuiltInServer();
|
||||||
@ -287,7 +288,6 @@ export class McpHub {
|
|||||||
this.eventRefs.push(this.app.vault.on('modify', async (file) => {
|
this.eventRefs.push(this.app.vault.on('modify', async (file) => {
|
||||||
// Adjusted to use the new config file name and path logic
|
// Adjusted to use the new config file name and path logic
|
||||||
const configFilePath = await this.getMcpSettingsFilePath();
|
const configFilePath = await this.getMcpSettingsFilePath();
|
||||||
console.log("configFilePath", configFilePath)
|
|
||||||
if (file instanceof TFile && file.path === configFilePath) {
|
if (file instanceof TFile && file.path === configFilePath) {
|
||||||
await this.handleConfigFileChange(file.path);
|
await this.handleConfigFileChange(file.path);
|
||||||
}
|
}
|
||||||
@ -295,7 +295,6 @@ export class McpHub {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private async handleConfigFileChange(filePath: string): Promise<void> {
|
private async handleConfigFileChange(filePath: string): Promise<void> {
|
||||||
console.log("handleConfigFileChange", filePath)
|
|
||||||
try {
|
try {
|
||||||
const content = await this.app.vault.adapter.read(filePath);
|
const content = await this.app.vault.adapter.read(filePath);
|
||||||
const config = JSON.parse(content)
|
const config = JSON.parse(content)
|
||||||
@ -347,7 +346,6 @@ export class McpHub {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async ensureMcpFileExists(): Promise<void> {
|
async ensureMcpFileExists(): Promise<void> {
|
||||||
console.log("ensureMcpFileExists")
|
|
||||||
// 新的配置目录和文件路径
|
// 新的配置目录和文件路径
|
||||||
const newMcpFolderPath = ROOT_DIR
|
const newMcpFolderPath = ROOT_DIR
|
||||||
const newMcpSettingsFilePath = normalizePath(path.join(newMcpFolderPath, "mcp_settings.json"))
|
const newMcpSettingsFilePath = normalizePath(path.join(newMcpFolderPath, "mcp_settings.json"))
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user