import {BehaviorSubject} from "rxjs"; import {TabCategory} from "./TabCategory"; import {FileService} from "../services/file/file.service"; import {File} from "../../api/models/File"; import {SortKey} from "./SortKey"; import {debounceTime} from "rxjs/operators"; import {mapNew} from "../../api/models/adaptors"; import {SearchFilters} from "../../api/models/SearchFilters"; export class TabState { public uuid: number; public category: TabCategory; public mode = new BehaviorSubject<"grid" | "gallery">("grid"); public selectedCD = new BehaviorSubject(undefined); public loading = new BehaviorSubject(false); public files = new BehaviorSubject([]); public filters = new BehaviorSubject(new SearchFilters([])); public sortKeys = new BehaviorSubject( [new SortKey( "FileImportedTime", "Ascending", undefined )]); private fileService: FileService; constructor( uuid: number, category: TabCategory, fileService: FileService ) { this.category = category; this.uuid = uuid; this.fileService = fileService; if (this.category === TabCategory.Files) { this.filters.pipe(debounceTime(500)) .subscribe(async () => await this.findFiles()); this.sortKeys.pipe(debounceTime(100)) .subscribe(async () => await this.findFiles()); } } public static fromDTO( dto: any, fileService: FileService ): TabState { const state = new TabState( dto.uuid, dto.category, fileService ); const sortKeys = dto.sortKeys.map( (s: { sortType: any, sortDirection: any, namespaceName: any }) => new SortKey( s.sortType, s.sortDirection, s.namespaceName ) ); state.filters.next(new SearchFilters(dto.filters ?? [])); state.sortKeys.next(sortKeys); state.mode.next(dto.mode ?? "grid"); state.selectedCD.next(dto.selectedFileHash); state.files.next((dto.files ?? []).map(mapNew(File))); return state; } public async findFiles() { this.loading.next(true); const files = await this.fileService.findFiles( this.filters.value, this.sortKeys.value ); this.files.next(files); this.loading.next(false); } public setTagFilters(filters: SearchFilters) { this.filters.next(filters); } public setSortKeys(keys: SortKey[]) { this.sortKeys.next(keys); } public getDTO(): any { return { uuid: this.uuid, category: this.category, filters: this.filters.value.getFilters(), sortKeys: this.sortKeys.value, mode: this.mode.value, selectedFileHash: this.selectedCD.value, files: this.category === TabCategory.Import ? this.files.value.map( f => f.rawData) : [], }; } }