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