diff --git a/web/src/lib/components/shared-components/side-bar/server-status.svelte b/web/src/lib/components/shared-components/side-bar/server-status.svelte
index 513ee7370f..3d5c3d1215 100644
--- a/web/src/lib/components/shared-components/side-bar/server-status.svelte
+++ b/web/src/lib/components/shared-components/side-bar/server-status.svelte
@@ -1,8 +1,10 @@
, K extends keyof EventMap> = (...params: EventMap[K]) => void;
diff --git a/web/src/lib/managers/release-manager.svelte.ts b/web/src/lib/managers/release-manager.svelte.ts
new file mode 100644
index 0000000000..1a3108a227
--- /dev/null
+++ b/web/src/lib/managers/release-manager.svelte.ts
@@ -0,0 +1,12 @@
+import { eventManager } from '$lib/managers/event-manager.svelte';
+import { type ReleaseEvent } from '$lib/types';
+
+class ReleaseManager {
+ value = $state();
+
+ constructor() {
+ eventManager.on('ReleaseEvent', (event) => (this.value = event));
+ }
+}
+
+export const releaseManager = new ReleaseManager();
diff --git a/web/src/lib/stores/websocket.ts b/web/src/lib/stores/websocket.ts
index 9f01c6878e..342313d906 100644
--- a/web/src/lib/stores/websocket.ts
+++ b/web/src/lib/stores/websocket.ts
@@ -1,21 +1,15 @@
import { page } from '$app/state';
import { AppRoute } from '$lib/constants';
import { authManager } from '$lib/managers/auth-manager.svelte';
+import { eventManager } from '$lib/managers/event-manager.svelte';
import { notificationManager } from '$lib/stores/notification-manager.svelte';
+import type { ReleaseEvent } from '$lib/types';
import { createEventEmitter } from '$lib/utils/eventemitter';
import { type AssetResponseDto, type NotificationDto, type ServerVersionResponseDto } from '@immich/sdk';
import { io, type Socket } from 'socket.io-client';
import { get, writable } from 'svelte/store';
import { user } from './user.store';
-export interface ReleaseEvent {
- isAvailable: boolean;
- /** ISO8601 */
- checkedAt: string;
- serverVersion: ServerVersionResponseDto;
- releaseVersion: ServerVersionResponseDto;
-}
-
interface AppRestartEvent {
isMaintenanceMode: boolean;
}
@@ -32,7 +26,7 @@ export interface Events {
on_person_thumbnail: (personId: string) => void;
on_server_version: (serverVersion: ServerVersionResponseDto) => void;
on_config_update: () => void;
- on_new_release: (newRelease: ReleaseEvent) => void;
+ on_new_release: (event: ReleaseEvent) => void;
on_session_delete: (sessionId: string) => void;
on_notification: (notification: NotificationDto) => void;
@@ -50,7 +44,6 @@ const websocket: Socket = io({
export const websocketStore = {
connected: writable(false),
serverVersion: writable(),
- release: writable(),
serverRestarting: writable(),
};
@@ -61,7 +54,7 @@ websocket
.on('disconnect', () => websocketStore.connected.set(false))
.on('on_server_version', (serverVersion) => websocketStore.serverVersion.set(serverVersion))
.on('AppRestartV1', (mode) => websocketStore.serverRestarting.set(mode))
- .on('on_new_release', (releaseVersion) => websocketStore.release.set(releaseVersion))
+ .on('on_new_release', (event) => eventManager.emit('ReleaseEvent', event))
.on('on_session_delete', () => authManager.logout())
.on('on_notification', () => notificationManager.refresh())
.on('connect_error', (e) => console.log('Websocket Connect Error', e));
diff --git a/web/src/lib/types.ts b/web/src/lib/types.ts
index 960158a0f7..4e6e8a45f4 100644
--- a/web/src/lib/types.ts
+++ b/web/src/lib/types.ts
@@ -1,4 +1,13 @@
+import type { ServerVersionResponseDto } from '@immich/sdk';
import type { MenuItem } from '@immich/ui';
import type { HTMLAttributes } from 'svelte/elements';
export type ActionItem = MenuItem & { props?: Omit, 'color'> };
+
+export interface ReleaseEvent {
+ isAvailable: boolean;
+ /** ISO8601 */
+ checkedAt: string;
+ serverVersion: ServerVersionResponseDto;
+ releaseVersion: ServerVersionResponseDto;
+}
diff --git a/web/src/routes/+layout.svelte b/web/src/routes/+layout.svelte
index 636a7c901b..80d4da1252 100644
--- a/web/src/routes/+layout.svelte
+++ b/web/src/routes/+layout.svelte
@@ -4,6 +4,7 @@
import { shortcut } from '$lib/actions/shortcut';
import DownloadPanel from '$lib/components/asset-viewer/download-panel.svelte';
import ErrorLayout from '$lib/components/layouts/ErrorLayout.svelte';
+ import OnEvents from '$lib/components/OnEvents.svelte';
import AppleHeader from '$lib/components/shared-components/apple-header.svelte';
import NavigationLoadingBar from '$lib/components/shared-components/navigation-loading-bar.svelte';
import UploadPanel from '$lib/components/shared-components/upload-panel.svelte';
@@ -11,13 +12,10 @@
import { eventManager } from '$lib/managers/event-manager.svelte';
import { serverConfigManager } from '$lib/managers/server-config-manager.svelte';
import ServerRestartingModal from '$lib/modals/ServerRestartingModal.svelte';
+ import VersionAnnouncementModal from '$lib/modals/VersionAnnouncementModal.svelte';
import { user } from '$lib/stores/user.store';
- import {
- closeWebsocketConnection,
- openWebsocketConnection,
- websocketStore,
- type ReleaseEvent,
- } from '$lib/stores/websocket';
+ import { closeWebsocketConnection, openWebsocketConnection, websocketStore } from '$lib/stores/websocket';
+ import type { ReleaseEvent } from '$lib/types';
import { copyToClipboard, getReleaseType, semverToName } from '$lib/utils';
import { maintenanceShouldRedirect } from '$lib/utils/maintenance';
import { isAssetViewerRoute } from '$lib/utils/navigation';
@@ -79,15 +77,15 @@
}
});
- const { release, serverRestarting } = websocketStore;
+ const { serverRestarting } = websocketStore;
- const handleRelease = (release?: ReleaseEvent) => {
- if (!release?.isAvailable || !$user.isAdmin) {
+ const onReleaseEvent = async (release: ReleaseEvent) => {
+ if (!release.isAvailable || !$user.isAdmin) {
return;
}
const releaseVersion = semverToName(release.releaseVersion);
- // const serverVersion = semverToName(release.serverVersion);
+ const serverVersion = semverToName(release.serverVersion);
const type = getReleaseType(release.serverVersion, release.releaseVersion);
if (type === 'none' || type === 'patch' || localStorage.getItem('appVersion') === releaseVersion) {
@@ -95,15 +93,13 @@
}
try {
- // await modalManager.show(VersionAnnouncementModal, { serverVersion, releaseVersion });
+ await modalManager.show(VersionAnnouncementModal, { serverVersion, releaseVersion });
localStorage.setItem('appVersion', releaseVersion);
} catch (error) {
console.error('Error [VersionAnnouncementBox]:', error);
}
};
- $effect(() => void handleRelease($release));
-
serverRestarting.subscribe((isRestarting) => {
if (!isRestarting) {
return;
@@ -126,6 +122,8 @@
});
+
+
{page.data.meta?.title || 'Web'} - Immich