diff --git a/package.json b/package.json index 355167a..bee6074 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { "name": "open-archiver", + "version": "0.3.0", "private": true, "scripts": { "dev": "dotenv -- pnpm --filter \"./packages/*\" --parallel dev", diff --git a/packages/frontend/package.json b/packages/frontend/package.json index a409ad1..a3ba4fc 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -22,6 +22,7 @@ "jose": "^6.0.1", "lucide-svelte": "^0.525.0", "postal-mime": "^2.4.4", + "semver": "^7.7.2", "svelte-persisted-store": "^0.12.0", "sveltekit-i18n": "^2.4.2", "tailwind-merge": "^3.3.1", @@ -35,6 +36,7 @@ "@sveltejs/vite-plugin-svelte": "^5.0.0", "@tailwindcss/vite": "^4.0.0", "@types/d3-shape": "^3.1.7", + "@types/semver": "^7.7.1", "dotenv": "^17.2.0", "layerchart": "2.0.0-next.27", "mode-watcher": "^1.1.0", diff --git a/packages/frontend/src/lib/components/custom/Footer.svelte b/packages/frontend/src/lib/components/custom/Footer.svelte index c5b3291..a30f037 100644 --- a/packages/frontend/src/lib/components/custom/Footer.svelte +++ b/packages/frontend/src/lib/components/custom/Footer.svelte @@ -1,18 +1,37 @@ diff --git a/packages/frontend/src/lib/translations/en.json b/packages/frontend/src/lib/translations/en.json index f8d98b2..2e44dee 100644 --- a/packages/frontend/src/lib/translations/en.json +++ b/packages/frontend/src/lib/translations/en.json @@ -163,7 +163,8 @@ "not_available": "Raw .eml file not available for this email." }, "footer": { - "all_rights_reserved": "All rights reserved." + "all_rights_reserved": "All rights reserved.", + "new_version_available": "New version available" }, "ingestion_source_form": { "provider_generic_imap": "Generic IMAP", diff --git a/packages/frontend/src/routes/+layout.server.ts b/packages/frontend/src/routes/+layout.server.ts index 77de0f6..c0dfb31 100644 --- a/packages/frontend/src/routes/+layout.server.ts +++ b/packages/frontend/src/routes/+layout.server.ts @@ -3,6 +3,11 @@ import type { LayoutServerLoad } from './$types'; import 'dotenv/config'; import { api } from '$lib/server/api'; import type { SystemSettings } from '@open-archiver/types'; +import { version } from '../../../../package.json'; +import semver from 'semver'; + +let newVersionInfo: { version: string; description: string; url: string } | null = null; +let lastChecked: Date | null = null; export const load: LayoutServerLoad = async (event) => { const { locals, url } = event; @@ -32,10 +37,33 @@ export const load: LayoutServerLoad = async (event) => { ? await systemSettingsResponse.json() : null; + const now = new Date(); + if (!lastChecked || now.getTime() - lastChecked.getTime() > 1000 * 60 * 60) { + try { + const res = await fetch('https://api.github.com/repos/LogicLabs-OU/OpenArchiver/releases/latest'); + if (res.ok) { + const latestRelease = await res.json(); + const latestVersion = latestRelease.tag_name.replace('v', ''); + if (semver.gt(latestVersion, version)) { + newVersionInfo = { + version: latestVersion, + description: latestRelease.name, + url: latestRelease.html_url + }; + } + } + lastChecked = now; + } catch (error) { + console.error('Failed to fetch latest version from GitHub:', error); + } + } + return { user: locals.user, accessToken: locals.accessToken, isDemo: process.env.IS_DEMO === 'true', systemSettings, + currentVersion: version, + newVersionInfo: newVersionInfo }; }; diff --git a/packages/frontend/src/routes/+layout.svelte b/packages/frontend/src/routes/+layout.svelte index 80db5ae..8bc717a 100644 --- a/packages/frontend/src/routes/+layout.svelte +++ b/packages/frontend/src/routes/+layout.svelte @@ -35,5 +35,5 @@
{@render children()}
-