Persist open file access mode setting across restarts in obsidian

Allows a lightweight mechanism to persist this user preference.
Improve hover text a bit for readability.

Resolves #1209
This commit is contained in:
Debanjum
2025-08-20 12:46:05 -07:00
parent 2884853c98
commit eb2f0ec6bc
2 changed files with 30 additions and 6 deletions

View File

@@ -104,6 +104,9 @@ export class KhojChatView extends KhojPaneView {
super(leaf, plugin);
this.fileInteractions = new FileInteractions(this.app);
// Initialize file access mode from persisted settings
this.fileAccessMode = this.setting.fileAccessMode ?? 'read';
this.waitingForLocation = true;
fetch("https://ipapi.co/json")
@@ -271,29 +274,48 @@ export class KhojChatView extends KhojPaneView {
text: "File Access",
attr: {
class: "khoj-input-row-button clickable-icon",
title: "Toggle file access mode (Read Only)",
title: "Toggle open file access",
},
});
setIcon(fileAccessButton, "file-search");
fileAccessButton.addEventListener('click', () => {
// Set initial icon based on persisted setting
switch (this.fileAccessMode) {
case 'none':
setIcon(fileAccessButton, "file-x");
fileAccessButton.title = "Toggle open file access (No Access)";
break;
case 'write':
setIcon(fileAccessButton, "file-edit");
fileAccessButton.title = "Toggle open file access (Read & Write)";
break;
case 'read':
default:
setIcon(fileAccessButton, "file-search");
fileAccessButton.title = "Toggle open file access (Read Only)";
break;
}
fileAccessButton.addEventListener('click', async () => {
// Cycle through modes: none -> read -> write -> none
switch (this.fileAccessMode) {
case 'none':
this.fileAccessMode = 'read';
setIcon(fileAccessButton, "file-search");
fileAccessButton.title = "Toggle file access mode (Read Only)";
fileAccessButton.title = "Toggle open file access (Read Only)";
break;
case 'read':
this.fileAccessMode = 'write';
setIcon(fileAccessButton, "file-edit");
fileAccessButton.title = "Toggle file access mode (Read & Write)";
fileAccessButton.title = "Toggle open file access (Read & Write)";
break;
case 'write':
this.fileAccessMode = 'none';
setIcon(fileAccessButton, "file-x");
fileAccessButton.title = "Toggle file access mode (No Access)";
fileAccessButton.title = "Toggle open file access (No Access)";
break;
}
// Persist the updated mode to settings
this.setting.fileAccessMode = this.fileAccessMode;
await this.plugin.saveSettings();
});
let chatInput = inputRow.createEl("textarea", {

View File

@@ -38,6 +38,7 @@ export interface KhojSetting {
syncFolders: string[];
syncInterval: number;
autoVoiceResponse: boolean;
fileAccessMode: 'none' | 'read' | 'write';
selectedChatModelId: string | null; // Mirrors server's selected_chat_model_config
availableChatModels: ModelOption[];
}
@@ -58,6 +59,7 @@ export const DEFAULT_SETTINGS: KhojSetting = {
syncFolders: [],
syncInterval: 60,
autoVoiceResponse: true,
fileAccessMode: 'read',
selectedChatModelId: null, // Will be populated from server
availableChatModels: [],
}