From d12d7cc1c74aeda8bee9ef3537add926eaa02d8f Mon Sep 17 00:00:00 2001 From: Logan Yang Date: Tue, 3 Dec 2024 12:45:01 -0800 Subject: [PATCH] Fix load error (#893) * Fix critical load error for new installs * Add version update notice --- src/main.ts | 32 ++++++++++++++++++++++++++++++++ src/settings/model.ts | 10 ++++++---- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/main.ts b/src/main.ts index 26727a5b..4bf85b73 100644 --- a/src/main.ts +++ b/src/main.ts @@ -36,6 +36,7 @@ import { TFile, TFolder, WorkspaceLeaf, + requestUrl, } from "obsidian"; export default class CopilotPlugin extends Plugin { @@ -50,6 +51,7 @@ export default class CopilotPlugin extends Plugin { settingsUnsubscriber?: () => void; async onload(): Promise { + await this.checkForUpdates(); await this.loadSettings(); this.settingsUnsubscriber = subscribeToSettingsChange(() => { const settings = getSettings(); @@ -667,4 +669,34 @@ export default class CopilotPlugin extends Plugin { metadata: doc.metadata, })); } + + private async checkForUpdates(): Promise { + try { + const response = await requestUrl({ + url: "https://api.github.com/repos/logancyang/obsidian-copilot/releases/latest", + method: "GET", + }); + + const latestVersion = response.json.tag_name.replace("v", ""); + if (this.isNewerVersion(latestVersion, this.manifest.version)) { + new Notice( + `A new version (${latestVersion}) of Obsidian Copilot is available. You are currently on version ${this.manifest.version}. Please update to the latest version.`, + 10000 + ); + } + } catch (error) { + console.error("Failed to check for updates:", error); + } + } + + private isNewerVersion(latest: string, current: string): boolean { + const latestParts = latest.split(".").map(Number); + const currentParts = current.split(".").map(Number); + + for (let i = 0; i < 3; i++) { + if (latestParts[i] > currentParts[i]) return true; + if (latestParts[i] < currentParts[i]) return false; + } + return false; + } } diff --git a/src/settings/model.ts b/src/settings/model.ts index 42d7985e..4f7ede7c 100644 --- a/src/settings/model.ts +++ b/src/settings/model.ts @@ -115,16 +115,18 @@ export function useSettingsValue(): Readonly { * Note: This will be better handled by Zod in the future. */ export function sanitizeSettings(settings: CopilotSettings): CopilotSettings { - const sanitizedSettings: CopilotSettings = { ...settings }; + // If settings is null/undefined, use DEFAULT_SETTINGS + const settingsToSanitize = settings || DEFAULT_SETTINGS; + const sanitizedSettings: CopilotSettings = { ...settingsToSanitize }; // Stuff in settings are string even when the interface has number type! - const temperature = Number(settings.temperature); + const temperature = Number(settingsToSanitize.temperature); sanitizedSettings.temperature = isNaN(temperature) ? DEFAULT_SETTINGS.temperature : temperature; - const maxTokens = Number(settings.maxTokens); + const maxTokens = Number(settingsToSanitize.maxTokens); sanitizedSettings.maxTokens = isNaN(maxTokens) ? DEFAULT_SETTINGS.maxTokens : maxTokens; - const contextTurns = Number(settings.contextTurns); + const contextTurns = Number(settingsToSanitize.contextTurns); sanitizedSettings.contextTurns = isNaN(contextTurns) ? DEFAULT_SETTINGS.contextTurns : contextTurns;