From f9e95466e8d5d7a619cf7a86581f22f6454370be Mon Sep 17 00:00:00 2001 From: 4gray Date: Fri, 22 May 2026 03:20:57 +0300 Subject: [PATCH] refactor(downloads): use runtime availability capability --- .../src/lib/downloads.service.spec.ts | 21 +++++++++++++++++++ libs/services/src/lib/downloads.service.ts | 4 +++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/libs/services/src/lib/downloads.service.spec.ts b/libs/services/src/lib/downloads.service.spec.ts index 43f6d6689..886850fad 100644 --- a/libs/services/src/lib/downloads.service.spec.ts +++ b/libs/services/src/lib/downloads.service.spec.ts @@ -1,8 +1,11 @@ import { signal, Signal, WritableSignal } from '@angular/core'; +import { TestBed } from '@angular/core/testing'; import { DownloadItem, DownloadsService, } from './downloads.service'; +import { RuntimeCapabilitiesService } from './runtime-capabilities.service'; +import { SettingsStore } from './settings-store.service'; type TestDownloadsService = { downloads: WritableSignal; @@ -27,6 +30,7 @@ describe('DownloadsService', () => { afterEach(() => { testWindow.electron = originalElectron; + TestBed.resetTestingModule(); jest.restoreAllMocks(); }); @@ -74,6 +78,23 @@ describe('DownloadsService', () => { return service; } + it('reports availability through the runtime capability', () => { + TestBed.configureTestingModule({ + providers: [ + DownloadsService, + { provide: SettingsStore, useValue: {} }, + { + provide: RuntimeCapabilitiesService, + useValue: { supportsDownloads: false }, + }, + ], + }); + + const service = TestBed.inject(DownloadsService); + + expect(service.isAvailable()).toBe(false); + }); + it('tracks loading and loaded state around a successful download list request', async () => { const item = createDownload(1); const pending = createDeferred(); diff --git a/libs/services/src/lib/downloads.service.ts b/libs/services/src/lib/downloads.service.ts index 61372f503..505c7fa53 100644 --- a/libs/services/src/lib/downloads.service.ts +++ b/libs/services/src/lib/downloads.service.ts @@ -1,4 +1,5 @@ import { computed, inject, Injectable, OnDestroy, signal } from '@angular/core'; +import { RuntimeCapabilitiesService } from './runtime-capabilities.service'; import { SettingsStore } from './settings-store.service'; export type DownloadStatus = @@ -31,6 +32,7 @@ export interface DownloadItem { @Injectable({ providedIn: 'root' }) export class DownloadsService implements OnDestroy { + private readonly runtime = inject(RuntimeCapabilitiesService); private readonly settingsStore = inject(SettingsStore); private unsubscribe?: () => void; private loadDownloadsRequestId = 0; @@ -48,7 +50,7 @@ export class DownloadsService implements OnDestroy { readonly hasLoadedDownloads = this._hasLoadedDownloads.asReadonly(); /** Whether the download feature is available (Electron only) */ - readonly isAvailable = computed(() => !!window.electron?.downloadsGetList); + readonly isAvailable = computed(() => this.runtime.supportsDownloads); /** Whether there are any downloads */ readonly hasDownloads = computed(() => this.downloads().length > 0);