import { Injectable, inject, signal } from '@angular/core'; import { MediaRepository } from '../../../../core/media/media-repository'; import { MediaAsset } from '../../../../core/media/models/media-asset.model'; const PAGE_SIZE = 24; @Injectable({ providedIn: 'root' }) export class MediaLibraryFacade { private readonly repository = inject(MediaRepository); readonly items = signal([]); readonly total = signal(0); readonly loading = signal(false); readonly uploading = signal(false); readonly error = signal(null); readonly search = signal(''); readonly page = signal(1); async load(): Promise { this.loading.set(true); this.error.set(null); try { const result = await this.repository.list({ page: this.page(), pageSize: PAGE_SIZE, search: this.search(), }); this.items.set(result.items); this.total.set(result.total); } catch { this.error.set('Failed to load media assets.'); } finally { this.loading.set(false); } } setSearch(value: string): void { this.search.set(value); this.page.set(1); void this.load(); } setPage(page: number): void { this.page.set(page); void this.load(); } async upload(file: File): Promise { this.uploading.set(true); this.error.set(null); try { await this.repository.upload(file); this.page.set(1); await this.load(); } catch { this.error.set('Failed to upload file.'); } finally { this.uploading.set(false); } } async remove(id: string): Promise { this.error.set(null); try { await this.repository.remove(id); await this.load(); } catch { this.error.set('Failed to delete file.'); } } }