From c0e9cd5de367615f37d578df8153359fca0baa8c Mon Sep 17 00:00:00 2001 From: 4gray <4gray@users.noreply.github.com> Date: Mon, 29 Jun 2026 11:03:15 +0200 Subject: [PATCH] fix(settings): show current release notes (#1101) * fix(settings): show current release notes * fix(updater): use app version for local release notes * fix(settings): constrain release note images * fix(settings): prefer current notes without updates --- .../app/services/app-update.service.spec.ts | 36 ++++++++++++ .../src/app/services/app-update.service.ts | 24 +++++++- apps/electron-backend/src/main.ts | 2 + ...ate-release-notes-dialog.component.spec.ts | 27 ++++++++- ...p-update-release-notes-dialog.component.ts | 57 +++++++++++++++++-- .../settings-about-section.component.spec.ts | 18 ++++++ .../settings-about-section.component.ts | 9 +-- .../app/settings/settings.component.spec.ts | 26 +++++++++ .../src/app/settings/settings.component.ts | 18 +++++- apps/web/src/assets/i18n/ar.json | 2 +- apps/web/src/assets/i18n/ary.json | 2 +- apps/web/src/assets/i18n/by.json | 2 +- apps/web/src/assets/i18n/de.json | 2 +- apps/web/src/assets/i18n/el.json | 2 +- apps/web/src/assets/i18n/en.json | 2 +- apps/web/src/assets/i18n/es.json | 2 +- apps/web/src/assets/i18n/fr.json | 2 +- apps/web/src/assets/i18n/it.json | 2 +- apps/web/src/assets/i18n/ja.json | 2 +- apps/web/src/assets/i18n/ko.json | 2 +- apps/web/src/assets/i18n/nl.json | 2 +- apps/web/src/assets/i18n/pl.json | 2 +- apps/web/src/assets/i18n/pt.json | 2 +- apps/web/src/assets/i18n/ru.json | 2 +- apps/web/src/assets/i18n/tr.json | 2 +- apps/web/src/assets/i18n/zh.json | 2 +- apps/web/src/assets/i18n/zhtw.json | 2 +- .../src/lib/electron-api.interface.ts | 1 + 28 files changed, 217 insertions(+), 37 deletions(-) diff --git a/apps/electron-backend/src/app/services/app-update.service.spec.ts b/apps/electron-backend/src/app/services/app-update.service.spec.ts index 3b3adac05..042b7bab4 100644 --- a/apps/electron-backend/src/app/services/app-update.service.spec.ts +++ b/apps/electron-backend/src/app/services/app-update.service.spec.ts @@ -139,6 +139,26 @@ describe('AppUpdateService', () => { expect(updaterFactory).not.toHaveBeenCalled(); }); + it('uses the build app version instead of the Electron runtime version', () => { + const service = new AppUpdateService({ + app: { + getVersion: () => '41.7.2', + isPackaged: false, + }, + appVersion: '0.22.0', + getMainWindow: () => createWindow(), + updater: jest.fn(() => new FakeUpdater()), + }); + + expect(service.getStatus()).toEqual({ + currentVersion: '0.22.0', + manualDownloadUrl: + 'https://github.com/4gray/iptvnator/releases/latest', + status: ELECTRON_BRIDGE_APP_UPDATE_STATUSES.Unsupported, + supportedSelfUpdate: false, + }); + }); + it('checks GitHub releases without resolving the updater on unsupported packaged Linux builds', async () => { const fetcher = createReleaseFetcher(); const updaterFactory = jest.fn(() => new FakeUpdater()); @@ -332,6 +352,22 @@ describe('AppUpdateService', () => { expect(newer.tagName).toBe('v0.23.0'); }); + it('falls back to latest stable release notes when a local dev version is unpublished', async () => { + const fetcher = createReleaseFetcher(); + const { service } = createService({ fetcher, isPackaged: false }); + + await expect( + service.getReleaseNotes({ + fallbackToLatest: true, + version: '0.25.0', + }) + ).resolves.toMatchObject({ + bodyMarkdown: '## New\n\nFresh build', + tagName: 'v0.24.0', + version: '0.24.0', + }); + }); + it('stores available release details from updater events', () => { const { service } = createService(); diff --git a/apps/electron-backend/src/app/services/app-update.service.ts b/apps/electron-backend/src/app/services/app-update.service.ts index 83f0f7afd..b3c9a05d3 100644 --- a/apps/electron-backend/src/app/services/app-update.service.ts +++ b/apps/electron-backend/src/app/services/app-update.service.ts @@ -104,6 +104,7 @@ type ReleaseFetcher = ( export interface AppUpdateServiceOptions { app: AppUpdateAppAdapter; + appVersion?: string; updater: AppUpdaterAdapterProvider; getMainWindow: () => AppUpdateWindow | null | undefined; platform?: NodeJS.Platform; @@ -182,6 +183,13 @@ function isVersionGreaterThan(candidate: string, current: string): boolean { return false; } +function resolveCurrentVersion( + app: AppUpdateAppAdapter, + appVersion: string | undefined +): string { + return normalizeVersion(appVersion) || normalizeVersion(app.getVersion()); +} + function toReleaseInfo( release: CachedGitHubRelease ): ElectronBridgeAppUpdateRelease { @@ -234,7 +242,10 @@ export class AppUpdateService { private status: ElectronBridgeAppUpdateStatus; constructor(private readonly options: AppUpdateServiceOptions) { - this.currentVersion = options.app.getVersion(); + this.currentVersion = resolveCurrentVersion( + options.app, + options.appVersion + ); this.isPackaged = options.app.isPackaged; this.supportedSelfUpdate = isSelfUpdateSupported( options.app.isPackaged, @@ -312,11 +323,18 @@ export class AppUpdateService { async getReleaseNotes( request: ElectronBridgeAppUpdateReleaseNotesRequest = {} ): Promise { - await this.ensureReleasePageLoaded(1); + const canFallbackToLatest = + !request.direction && (!request.version || request.fallbackToLatest); + + if (canFallbackToLatest) { + await this.ensureFirstStableReleaseLoaded(); + } else { + await this.ensureReleasePageLoaded(1); + } let index = await this.findReleaseIndex(request.version); - if (index === -1 && !request.version) { + if (index === -1 && canFallbackToLatest) { index = 0; } diff --git a/apps/electron-backend/src/main.ts b/apps/electron-backend/src/main.ts index 1ca4a3be0..cc3d13328 100644 --- a/apps/electron-backend/src/main.ts +++ b/apps/electron-backend/src/main.ts @@ -29,6 +29,7 @@ import { AppUpdateService } from './app/services/app-update.service'; import { databaseWorkerClient } from './app/services/database-worker-client'; import WindowEvents from './app/events/window.events'; import XtreamEvents from './app/events/xtream.events'; +import { environment } from './environments/environment'; app.setName('iptvnator'); @@ -88,6 +89,7 @@ export default class Main { const appUpdateService = new AppUpdateService({ app, + appVersion: environment.version, getMainWindow: () => App.mainWindow, updater: () => autoUpdater, }); diff --git a/apps/web/src/app/settings/app-update-release-notes-dialog.component.spec.ts b/apps/web/src/app/settings/app-update-release-notes-dialog.component.spec.ts index 9d2fda13f..acc5d24f1 100644 --- a/apps/web/src/app/settings/app-update-release-notes-dialog.component.spec.ts +++ b/apps/web/src/app/settings/app-update-release-notes-dialog.component.spec.ts @@ -31,7 +31,10 @@ describe('AppUpdateReleaseNotesDialogComponent', () => { providers: [ { provide: MAT_DIALOG_DATA, - useValue: { initialVersion: '0.23.0' }, + useValue: { + fallbackToLatest: true, + initialVersion: '0.23.0', + }, }, { provide: MatDialogRef, @@ -53,6 +56,7 @@ describe('AppUpdateReleaseNotesDialogComponent', () => { fixture.detectChanges(); expect(window.electron.getAppUpdateReleaseNotes).toHaveBeenCalledWith({ + fallbackToLatest: true, version: '0.23.0', }); expect( @@ -66,6 +70,27 @@ describe('AppUpdateReleaseNotesDialogComponent', () => { ).toContain('desktop updater'); }); + it('constrains rendered markdown images to the dialog width', async () => { + ( + window.electron.getAppUpdateReleaseNotes as jest.Mock + ).mockResolvedValueOnce({ + ...releaseNotes, + bodyMarkdown: + '![Application screenshot](https://example.com/screenshot.png)', + }); + + fixture.detectChanges(); + await fixture.whenStable(); + fixture.detectChanges(); + + const image = fixture.nativeElement.querySelector( + '[data-test-id="release-notes-body"] img' + ) as HTMLImageElement; + + expect(image).toBeTruthy(); + expect(image.classList).toContain('release-notes-dialog__image'); + }); + it('loads previous notes lazily without closing the dialog', async () => { fixture.detectChanges(); await fixture.whenStable(); diff --git a/apps/web/src/app/settings/app-update-release-notes-dialog.component.ts b/apps/web/src/app/settings/app-update-release-notes-dialog.component.ts index 88d23a68d..32232f60a 100644 --- a/apps/web/src/app/settings/app-update-release-notes-dialog.component.ts +++ b/apps/web/src/app/settings/app-update-release-notes-dialog.component.ts @@ -5,6 +5,7 @@ import { OnInit, SecurityContext, signal, + ViewEncapsulation, } from '@angular/core'; import { DatePipe } from '@angular/common'; import { MatButtonModule } from '@angular/material/button'; @@ -21,10 +22,29 @@ import { marked } from 'marked'; import { ElectronBridgeAppUpdateReleaseNotes, ElectronBridgeAppUpdateReleaseNotesDirection, + ElectronBridgeAppUpdateReleaseNotesRequest, } from '@iptvnator/shared/interfaces'; +const RELEASE_NOTES_IMAGE_CLASS = 'release-notes-dialog__image'; + export interface AppUpdateReleaseNotesDialogData { initialVersion?: string; + fallbackToLatest?: boolean; +} + +function decorateReleaseNotesHtml(html: string): string { + if (typeof document === 'undefined') { + return html; + } + + const template = document.createElement('template'); + template.innerHTML = html; + + template.content.querySelectorAll('img').forEach((image) => { + image.classList.add(RELEASE_NOTES_IMAGE_CLASS); + }); + + return template.innerHTML; } @Component({ @@ -37,6 +57,7 @@ export interface AppUpdateReleaseNotesDialogData { DatePipe, TranslatePipe, ], + encapsulation: ViewEncapsulation.None, template: `

{{ 'SETTINGS.APP_UPDATE_RELEASE_NOTES' | translate }} @@ -175,6 +196,16 @@ export interface AppUpdateReleaseNotesDialogData { padding: 1px 4px; background: var(--app-hover-overlay); } + + .release-notes-dialog__body img, + .release-notes-dialog__image { + display: block; + box-sizing: border-box; + max-width: 100%; + height: auto; + margin: 16px auto; + object-fit: contain; + } `, ], }) @@ -193,8 +224,10 @@ export class AppUpdateReleaseNotesDialogComponent implements OnInit { readonly renderedMarkdown = computed(() => { const markdown = this.notes()?.bodyMarkdown ?? ''; const html = marked.parse(markdown, { async: false }) as string; + const sanitizedHtml = + this.sanitizer.sanitize(SecurityContext.HTML, html) ?? ''; - return this.sanitizer.sanitize(SecurityContext.HTML, html) ?? ''; + return decorateReleaseNotesHtml(sanitizedHtml); }); ngOnInit(): void { @@ -212,16 +245,30 @@ export class AppUpdateReleaseNotesDialogComponent implements OnInit { const version = direction ? this.notes()?.tagName : this.data.initialVersion; + const fallbackToLatest = direction + ? undefined + : this.data.fallbackToLatest; this.loading.set(true); this.error.set(null); try { + const request: ElectronBridgeAppUpdateReleaseNotesRequest = {}; + + if (direction) { + request.direction = direction; + } + + if (version) { + request.version = version; + } + + if (fallbackToLatest) { + request.fallbackToLatest = true; + } + this.notes.set( - await window.electron.getAppUpdateReleaseNotes({ - direction, - version, - }) + await window.electron.getAppUpdateReleaseNotes(request) ); } catch (error) { this.error.set(error instanceof Error ? error.message : String(error)); diff --git a/apps/web/src/app/settings/settings-about-section.component.spec.ts b/apps/web/src/app/settings/settings-about-section.component.spec.ts index b74b3d016..2ca97c487 100644 --- a/apps/web/src/app/settings/settings-about-section.component.spec.ts +++ b/apps/web/src/app/settings/settings-about-section.component.spec.ts @@ -81,6 +81,24 @@ describe('SettingsAboutSectionComponent app updates', () => { expect(install).toHaveBeenCalledTimes(1); }); + it('shows release notes for the current version when no update is available', () => { + const openNotes = jest.fn(); + fixture.componentInstance.openAppUpdateReleaseNotes.subscribe(openNotes); + configureComponent(fixture, { + currentVersion: '0.22.0', + latestVersion: '0.22.0', + manualDownloadUrl: + 'https://github.com/4gray/iptvnator/releases/latest', + status: ELECTRON_BRIDGE_APP_UPDATE_STATUSES.NotAvailable, + supportedSelfUpdate: true, + }); + + getButton(fixture, 'app-update-release-notes')?.click(); + + expect(getButton(fixture, 'app-update-release-notes')).toBeTruthy(); + expect(openNotes).toHaveBeenCalledTimes(1); + }); + it('emits a manual release request for unsupported Linux packages', () => { const openManual = jest.fn(); fixture.componentInstance.openManualAppUpdate.subscribe(openManual); diff --git a/apps/web/src/app/settings/settings-about-section.component.ts b/apps/web/src/app/settings/settings-about-section.component.ts index 0c67a5783..ed510ab46 100644 --- a/apps/web/src/app/settings/settings-about-section.component.ts +++ b/apps/web/src/app/settings/settings-about-section.component.ts @@ -64,13 +64,8 @@ export class SettingsAboutSectionComponent { const status = this.appUpdateStatus(); return Boolean( - status?.latestVersion && - status.status !== ELECTRON_BRIDGE_APP_UPDATE_STATUSES.Idle && - status.status !== - ELECTRON_BRIDGE_APP_UPDATE_STATUSES.Checking && - status.status !== - ELECTRON_BRIDGE_APP_UPDATE_STATUSES.NotAvailable && - status.status !== ELECTRON_BRIDGE_APP_UPDATE_STATUSES.Error + status?.currentVersion && + status.status !== ELECTRON_BRIDGE_APP_UPDATE_STATUSES.Checking ); }); diff --git a/apps/web/src/app/settings/settings.component.spec.ts b/apps/web/src/app/settings/settings.component.spec.ts index 04745326e..fbb7f6fce 100644 --- a/apps/web/src/app/settings/settings.component.spec.ts +++ b/apps/web/src/app/settings/settings.component.spec.ts @@ -500,6 +500,32 @@ describe('SettingsComponent', () => { ); }); + it('opens release notes dialog for the current version when no update is available', () => { + const openSpy = jest + .spyOn(privateApi(component).matDialog, 'open') + .mockReturnValue(createDialogRef(false)); + component.appUpdateStatus.set({ + ...DEFAULT_APP_UPDATE_STATUS, + latestVersion: '0.21.0', + release: { + version: '0.21.0', + }, + status: ELECTRON_BRIDGE_APP_UPDATE_STATUSES.NotAvailable, + }); + + component.openAppUpdateReleaseNotes(); + + expect(openSpy).toHaveBeenCalledWith( + AppUpdateReleaseNotesDialogComponent, + expect.objectContaining({ + data: { + initialVersion: DEFAULT_APP_UPDATE_STATUS.currentVersion, + fallbackToLatest: true, + }, + }) + ); + }); + it('should render a compact page header outside dialog mode', () => { const nativeElement = fixture.nativeElement as HTMLElement; diff --git a/apps/web/src/app/settings/settings.component.ts b/apps/web/src/app/settings/settings.component.ts index 462f4ebee..060dc5860 100644 --- a/apps/web/src/app/settings/settings.component.ts +++ b/apps/web/src/app/settings/settings.component.ts @@ -37,6 +37,7 @@ import { DataService, RuntimeCapabilitiesService } from '@iptvnator/services'; import { EmbeddedMpvSupport, CoverSize, + ELECTRON_BRIDGE_APP_UPDATE_STATUSES, ElectronBridgeAppUpdateStatus, Language, StreamFormat, @@ -398,12 +399,23 @@ export class SettingsComponent implements OnInit, OnDestroy { } openAppUpdateReleaseNotes(): void { + const status = this.appUpdateStatus(); + const isUpdateRelease = + status?.status === ELECTRON_BRIDGE_APP_UPDATE_STATUSES.Available || + status?.status === + ELECTRON_BRIDGE_APP_UPDATE_STATUSES.Downloading || + status?.status === ELECTRON_BRIDGE_APP_UPDATE_STATUSES.Downloaded; + const initialReleaseNotesVersion = isUpdateRelease + ? (status?.latestVersion ?? + status?.release?.version ?? + status?.currentVersion) + : status?.currentVersion; + this.matDialog.open(AppUpdateReleaseNotesDialogComponent, { autoFocus: false, data: { - initialVersion: - this.appUpdateStatus()?.latestVersion ?? - this.appUpdateStatus()?.release?.version, + ...(!isUpdateRelease ? { fallbackToLatest: true } : {}), + initialVersion: initialReleaseNotesVersion, }, maxWidth: 'calc(100vw - 32px)', restoreFocus: true, diff --git a/apps/web/src/assets/i18n/ar.json b/apps/web/src/assets/i18n/ar.json index f520e4aa6..aa00ca8ed 100644 --- a/apps/web/src/assets/i18n/ar.json +++ b/apps/web/src/assets/i18n/ar.json @@ -410,7 +410,7 @@ "APP_UPDATE_DOWNLOAD": "Update", "APP_UPDATE_INSTALL": "Restart application", "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", - "APP_UPDATE_RELEASE_NOTES": "Release notes" + "APP_UPDATE_RELEASE_NOTES": "What's new" }, "THEMES": { "DARK_THEME": "داكن", diff --git a/apps/web/src/assets/i18n/ary.json b/apps/web/src/assets/i18n/ary.json index 8374f9a06..794c07aa4 100644 --- a/apps/web/src/assets/i18n/ary.json +++ b/apps/web/src/assets/i18n/ary.json @@ -410,7 +410,7 @@ "APP_UPDATE_DOWNLOAD": "Update", "APP_UPDATE_INSTALL": "Restart application", "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", - "APP_UPDATE_RELEASE_NOTES": "Release notes" + "APP_UPDATE_RELEASE_NOTES": "What's new" }, "THEMES": { "DARK_THEME": "داكن", diff --git a/apps/web/src/assets/i18n/by.json b/apps/web/src/assets/i18n/by.json index 0b2b254b2..468cb6cff 100644 --- a/apps/web/src/assets/i18n/by.json +++ b/apps/web/src/assets/i18n/by.json @@ -410,7 +410,7 @@ "APP_UPDATE_DOWNLOAD": "Update", "APP_UPDATE_INSTALL": "Restart application", "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", - "APP_UPDATE_RELEASE_NOTES": "Release notes" + "APP_UPDATE_RELEASE_NOTES": "What's new" }, "THEMES": { "DARK_THEME": "Цёмная", diff --git a/apps/web/src/assets/i18n/de.json b/apps/web/src/assets/i18n/de.json index be1713fc7..c670fb1c0 100644 --- a/apps/web/src/assets/i18n/de.json +++ b/apps/web/src/assets/i18n/de.json @@ -410,7 +410,7 @@ "APP_UPDATE_DOWNLOAD": "Update", "APP_UPDATE_INSTALL": "Restart application", "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", - "APP_UPDATE_RELEASE_NOTES": "Release notes" + "APP_UPDATE_RELEASE_NOTES": "What's new" }, "THEMES": { "DARK_THEME": "Dunkel", diff --git a/apps/web/src/assets/i18n/el.json b/apps/web/src/assets/i18n/el.json index 650f60a44..763440cc5 100644 --- a/apps/web/src/assets/i18n/el.json +++ b/apps/web/src/assets/i18n/el.json @@ -410,7 +410,7 @@ "APP_UPDATE_DOWNLOAD": "Update", "APP_UPDATE_INSTALL": "Restart application", "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", - "APP_UPDATE_RELEASE_NOTES": "Release notes" + "APP_UPDATE_RELEASE_NOTES": "What's new" }, "THEMES": { "DARK_THEME": "Σκούρο", diff --git a/apps/web/src/assets/i18n/en.json b/apps/web/src/assets/i18n/en.json index b7b8a30a0..b053f457b 100644 --- a/apps/web/src/assets/i18n/en.json +++ b/apps/web/src/assets/i18n/en.json @@ -410,7 +410,7 @@ "APP_UPDATE_DOWNLOAD": "Update", "APP_UPDATE_INSTALL": "Restart application", "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", - "APP_UPDATE_RELEASE_NOTES": "Release notes" + "APP_UPDATE_RELEASE_NOTES": "What's new" }, "THEMES": { "DARK_THEME": "Dark", diff --git a/apps/web/src/assets/i18n/es.json b/apps/web/src/assets/i18n/es.json index 9c32a4649..cf403ce52 100644 --- a/apps/web/src/assets/i18n/es.json +++ b/apps/web/src/assets/i18n/es.json @@ -410,7 +410,7 @@ "APP_UPDATE_DOWNLOAD": "Update", "APP_UPDATE_INSTALL": "Restart application", "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", - "APP_UPDATE_RELEASE_NOTES": "Release notes" + "APP_UPDATE_RELEASE_NOTES": "What's new" }, "THEMES": { "DARK_THEME": "Oscuro", diff --git a/apps/web/src/assets/i18n/fr.json b/apps/web/src/assets/i18n/fr.json index 56ab858d5..ec96770ab 100644 --- a/apps/web/src/assets/i18n/fr.json +++ b/apps/web/src/assets/i18n/fr.json @@ -410,7 +410,7 @@ "APP_UPDATE_DOWNLOAD": "Update", "APP_UPDATE_INSTALL": "Restart application", "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", - "APP_UPDATE_RELEASE_NOTES": "Release notes" + "APP_UPDATE_RELEASE_NOTES": "What's new" }, "THEMES": { "DARK_THEME": "Sombre", diff --git a/apps/web/src/assets/i18n/it.json b/apps/web/src/assets/i18n/it.json index f1bac6090..1d7e174be 100644 --- a/apps/web/src/assets/i18n/it.json +++ b/apps/web/src/assets/i18n/it.json @@ -410,7 +410,7 @@ "APP_UPDATE_DOWNLOAD": "Update", "APP_UPDATE_INSTALL": "Restart application", "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", - "APP_UPDATE_RELEASE_NOTES": "Release notes" + "APP_UPDATE_RELEASE_NOTES": "What's new" }, "THEMES": { "DARK_THEME": "Scuro", diff --git a/apps/web/src/assets/i18n/ja.json b/apps/web/src/assets/i18n/ja.json index 1ce473fd4..8b23c50a0 100644 --- a/apps/web/src/assets/i18n/ja.json +++ b/apps/web/src/assets/i18n/ja.json @@ -410,7 +410,7 @@ "APP_UPDATE_DOWNLOAD": "Update", "APP_UPDATE_INSTALL": "Restart application", "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", - "APP_UPDATE_RELEASE_NOTES": "Release notes" + "APP_UPDATE_RELEASE_NOTES": "What's new" }, "THEMES": { "DARK_THEME": "ダーク", diff --git a/apps/web/src/assets/i18n/ko.json b/apps/web/src/assets/i18n/ko.json index 67cbd4c74..288e55069 100644 --- a/apps/web/src/assets/i18n/ko.json +++ b/apps/web/src/assets/i18n/ko.json @@ -410,7 +410,7 @@ "APP_UPDATE_DOWNLOAD": "Update", "APP_UPDATE_INSTALL": "Restart application", "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", - "APP_UPDATE_RELEASE_NOTES": "Release notes" + "APP_UPDATE_RELEASE_NOTES": "What's new" }, "THEMES": { "DARK_THEME": "어둡게", diff --git a/apps/web/src/assets/i18n/nl.json b/apps/web/src/assets/i18n/nl.json index a488212d9..237f1f6fb 100644 --- a/apps/web/src/assets/i18n/nl.json +++ b/apps/web/src/assets/i18n/nl.json @@ -410,7 +410,7 @@ "APP_UPDATE_DOWNLOAD": "Update", "APP_UPDATE_INSTALL": "Restart application", "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", - "APP_UPDATE_RELEASE_NOTES": "Release notes" + "APP_UPDATE_RELEASE_NOTES": "What's new" }, "THEMES": { "DARK_THEME": "Donker", diff --git a/apps/web/src/assets/i18n/pl.json b/apps/web/src/assets/i18n/pl.json index 28b589596..46bfb5173 100644 --- a/apps/web/src/assets/i18n/pl.json +++ b/apps/web/src/assets/i18n/pl.json @@ -410,7 +410,7 @@ "APP_UPDATE_DOWNLOAD": "Update", "APP_UPDATE_INSTALL": "Restart application", "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", - "APP_UPDATE_RELEASE_NOTES": "Release notes" + "APP_UPDATE_RELEASE_NOTES": "What's new" }, "THEMES": { "DARK_THEME": "Ciemny", diff --git a/apps/web/src/assets/i18n/pt.json b/apps/web/src/assets/i18n/pt.json index 90f6c1218..a1eac7812 100644 --- a/apps/web/src/assets/i18n/pt.json +++ b/apps/web/src/assets/i18n/pt.json @@ -410,7 +410,7 @@ "APP_UPDATE_DOWNLOAD": "Update", "APP_UPDATE_INSTALL": "Restart application", "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", - "APP_UPDATE_RELEASE_NOTES": "Release notes" + "APP_UPDATE_RELEASE_NOTES": "What's new" }, "THEMES": { "DARK_THEME": "Escuro", diff --git a/apps/web/src/assets/i18n/ru.json b/apps/web/src/assets/i18n/ru.json index 46cbe798c..e7ca63e98 100644 --- a/apps/web/src/assets/i18n/ru.json +++ b/apps/web/src/assets/i18n/ru.json @@ -410,7 +410,7 @@ "APP_UPDATE_DOWNLOAD": "Обновить", "APP_UPDATE_INSTALL": "Перезагрузить приложение", "APP_UPDATE_OPEN_RELEASE": "Открыть GitHub release", - "APP_UPDATE_RELEASE_NOTES": "Release notes" + "APP_UPDATE_RELEASE_NOTES": "Что нового" }, "THEMES": { "DARK_THEME": "Тёмная", diff --git a/apps/web/src/assets/i18n/tr.json b/apps/web/src/assets/i18n/tr.json index c6d179e04..880b08936 100644 --- a/apps/web/src/assets/i18n/tr.json +++ b/apps/web/src/assets/i18n/tr.json @@ -410,7 +410,7 @@ "APP_UPDATE_DOWNLOAD": "Update", "APP_UPDATE_INSTALL": "Restart application", "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", - "APP_UPDATE_RELEASE_NOTES": "Release notes" + "APP_UPDATE_RELEASE_NOTES": "What's new" }, "THEMES": { "DARK_THEME": "Koyu", diff --git a/apps/web/src/assets/i18n/zh.json b/apps/web/src/assets/i18n/zh.json index 4508bcb8b..d0392b51e 100644 --- a/apps/web/src/assets/i18n/zh.json +++ b/apps/web/src/assets/i18n/zh.json @@ -410,7 +410,7 @@ "APP_UPDATE_DOWNLOAD": "Update", "APP_UPDATE_INSTALL": "Restart application", "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", - "APP_UPDATE_RELEASE_NOTES": "Release notes" + "APP_UPDATE_RELEASE_NOTES": "What's new" }, "THEMES": { "DARK_THEME": "深色", diff --git a/apps/web/src/assets/i18n/zhtw.json b/apps/web/src/assets/i18n/zhtw.json index 120f3a543..1a1bdd046 100644 --- a/apps/web/src/assets/i18n/zhtw.json +++ b/apps/web/src/assets/i18n/zhtw.json @@ -410,7 +410,7 @@ "APP_UPDATE_DOWNLOAD": "Update", "APP_UPDATE_INSTALL": "Restart application", "APP_UPDATE_OPEN_RELEASE": "Open GitHub release", - "APP_UPDATE_RELEASE_NOTES": "Release notes" + "APP_UPDATE_RELEASE_NOTES": "What's new" }, "THEMES": { "DARK_THEME": "深色", diff --git a/libs/shared/interfaces/src/lib/electron-api.interface.ts b/libs/shared/interfaces/src/lib/electron-api.interface.ts index 0d579bcb9..b1ad72095 100644 --- a/libs/shared/interfaces/src/lib/electron-api.interface.ts +++ b/libs/shared/interfaces/src/lib/electron-api.interface.ts @@ -198,6 +198,7 @@ export type ElectronBridgeAppUpdateReleaseNotesDirection = 'previous' | 'next'; export interface ElectronBridgeAppUpdateReleaseNotesRequest { version?: string; direction?: ElectronBridgeAppUpdateReleaseNotesDirection; + fallbackToLatest?: boolean; } export interface ElectronBridgeAppUpdateReleaseNotes {