diff --git a/src/main.ts b/src/main.ts index e621377..4e05c10 100644 --- a/src/main.ts +++ b/src/main.ts @@ -32,6 +32,8 @@ export default class InfioPlugin extends Plugin { settings: InfioSettings settingTab: InfioSettingTab settingsListeners: ((newSettings: InfioSettings) => void)[] = [] + private activeLeafChangeUnloadFn: (() => void) | null = null + private metadataCacheUnloadFn: (() => void) | null = null initChatProps?: ChatProps dbManager: DBManager | null = null ragEngine: RAGEngine | null = null @@ -100,22 +102,26 @@ export default class InfioPlugin extends Plugin { } }); - this.app.workspace.on("active-leaf-change", (leaf) => { - if (leaf?.view instanceof MarkdownView) { - // @ts-expect-error, not typed - const editorView = leaf.view.editor.cm as EditorView; - eventListener.onViewUpdate(editorView); - if (leaf.view.file) { - eventListener.handleFileChange(leaf.view.file); + this.registerEvent( + this.app.workspace.on("active-leaf-change", (leaf) => { + if (leaf?.view instanceof MarkdownView) { + // @ts-expect-error, not typed + const editorView = leaf.view.editor.cm as EditorView; + eventListener.onViewUpdate(editorView); + if (leaf.view.file) { + eventListener.handleFileChange(leaf.view.file); + } } - } - }); + }) + ); - this.app.metadataCache.on("changed", (file: TFile) => { - if (file) { - eventListener.handleFileChange(file); - } - }); + this.registerEvent( + this.app.metadataCache.on("changed", (file: TFile) => { + if (file) { + eventListener.handleFileChange(file); + } + }) + ); // This adds a simple command that can be triggered anywhere this.addCommand({ diff --git a/src/settings/ModelsSettings.tsx b/src/settings/ModelsSettings.tsx deleted file mode 100644 index a99a45b..0000000 --- a/src/settings/ModelsSettings.tsx +++ /dev/null @@ -1,205 +0,0 @@ -import { Notice } from "obsidian"; -import React, { useState } from "react"; - -import { CustomLLMModel, ModelProviders } from "../types/llm/model"; -import { InfioSettings } from "../types/settings"; - -import { DropdownComponent, TextComponent, ToggleComponent } from "./FormComponents"; - -type ModelRowProps = { - model: CustomLLMModel; - canDelete: boolean; - onToggle: (enabled: boolean) => void; - onDelete: () => void; -} - -const ModelRow: React.FC = ({ model, canDelete, onToggle, onDelete }) => ( - - {model.provider} - {model.name}{model.isEmbeddingModel ? " [embedding]" : ""} - - - - - {!canDelete && ( - - )} - - -); - -type ModelFormProps = { - providers: string[]; - onSubmit: (model: CustomLLMModel) => void; - isEmbeddingModel: boolean; -} - -const ModelForm: React.FC = ({ providers, onSubmit, isEmbeddingModel }) => { - const [model, setModel] = useState({ - name: "", - provider: providers[0] || "", - baseUrl: "", - apiKey: "", - enabled: true, - isBuiltIn: false, - isEmbeddingModel, - }); - - const handleSubmit = () => { - if (model.name && model.provider) { - onSubmit(model); - setModel({ ...model, name: "", baseUrl: "", apiKey: "" }); - } else { - new Notice("Please fill in necessary fields!"); - } - }; - - return ( -
- setModel({ ...model, name })} - /> - setModel({ ...model, provider })} - /> - setModel({ ...model, baseUrl })} - /> - setModel({ ...model, apiKey })} - /> - setModel({ ...model, isEmbeddingModel })} - /> - -
- ); -}; - -type ModelListProps = { - models: CustomLLMModel[]; - chatModelKey: string; - applyModelKey: string; - onUpdateModel: (index: number, model: CustomLLMModel) => void; - onDeleteModel: (modelKey: string) => void; -} - -const ModelList: React.FC = ({ - models, - chatModelKey, - applyModelKey, - onUpdateModel, - onDeleteModel, -}) => ( -
- - - - - - - - - - - {models.map((model, index) => ( - { - const updatedModel = { ...model, enabled }; - onUpdateModel(index, updatedModel); - }} - onDelete={() => onDeleteModel(`${model.name}`)} - /> - ))} - -
ProviderModelEnabledDelete
-
-); - -type ModelsSettingsProps = { - settings: InfioSettings; - setSettings: (settings: InfioSettings) => void; -} - -const ModelsSettings: React.FC = ({ settings, setSettings }) => { - const [isAddModelOpen, setIsAddModelOpen] = useState(false); - - const [activeModels, setActiveModels] = useState(settings.activeModels); - - const handleUpdateModel = (index: number, updatedModel: CustomLLMModel) => { - const newActiveModels = [...activeModels]; - newActiveModels[index] = updatedModel; - setSettings({ ...settings, activeModels: newActiveModels }); - setActiveModels(newActiveModels); - }; - - const handleAddModel = (newModel: CustomLLMModel) => { - const newActiveModels = [...activeModels, newModel]; - setSettings({ ...settings, activeModels: newActiveModels }); - setActiveModels(newActiveModels); - }; - - const handleDeleteModel = (modelKey: string) => { - const newActiveModels = activeModels.filter( - (model) => `${model.name}` !== modelKey - ); - - setSettings({ - ...settings, - activeModels: newActiveModels, - }); - setActiveModels(newActiveModels); - }; - - return ( -
-

Models

-
- -
-

setIsAddModelOpen(!isAddModelOpen)} style={{ cursor: "pointer" }}> - Add Custom Model {isAddModelOpen ? "▼" : "▶"} -

- {isAddModelOpen && ( - - )} -
-
-
- ); -}; - -export default ModelsSettings; diff --git a/src/settings/ProviderSettings.tsx b/src/settings/ProviderSettings.tsx index 0eb7d34..b52e25f 100644 --- a/src/settings/ProviderSettings.tsx +++ b/src/settings/ProviderSettings.tsx @@ -127,14 +127,14 @@ const ProviderSettings: React.FC = ({ settings, setSettin }; return ( -
+
-
+
= ({ settings, setSettin onChange={updateProviderApiKey} type="password" /> -
+
= ({ settings, setSettin /> )} -
-
+
+
-
+
-
+
= ({ settings, setSettin isEmbedding={true} updateModel={updateEmbeddingModelId} /> +
+
); }; diff --git a/styles.css b/styles.css index d0445b3..e15ff47 100644 --- a/styles.css +++ b/styles.css @@ -1107,7 +1107,7 @@ input[type='text'].infio-chat-list-dropdown-item-title-input { margin-top: 20px; } -.infio-provider { +.infio-llm-setting-provider { margin-top: 20px; } @@ -1176,7 +1176,7 @@ input[type='text'].infio-chat-list-dropdown-item-title-input { padding-left: var(--size-4-1); } -.iinfio-llm-setting-divider { +.infio-llm-setting-divider { margin-top: 14px; }