From 3c8fe6f33ce534b47dd69009c901f5e29c12bb8d Mon Sep 17 00:00:00 2001 From: raiper34 Date: Sat, 13 Jul 2024 16:56:53 +0200 Subject: [PATCH] playlist statuses --- .../playlist-box/playlist-box.component.html | 2 +- .../playlist-box/playlist-box.component.ts | 16 +++++++- .../src/app/services/playlist.service.ts | 38 ++++++++++++++++++- .../src/app/services/track.service.ts | 13 +++++-- 4 files changed, 62 insertions(+), 7 deletions(-) diff --git a/src/frontend/src/app/components/playlist-box/playlist-box.component.html b/src/frontend/src/app/components/playlist-box/playlist-box.component.html index 7832808..4142e38 100644 --- a/src/frontend/src/app/components/playlist-box/playlist-box.component.html +++ b/src/frontend/src/app/components/playlist-box/playlist-box.component.html @@ -1,4 +1,4 @@ -
+

STATUS2CLASS[status]) + ); } get playlist(): Playlist & PlaylistUi { return this._playlist; @@ -30,6 +41,7 @@ export class PlaylistBoxComponent { _playlist!: Playlist & PlaylistUi; trackCount$!: Observable; trackCompletedCount$!: Observable; + statusClass$!: Observable; constructor(private readonly playlistService: PlaylistService) { } diff --git a/src/frontend/src/app/services/playlist.service.ts b/src/frontend/src/app/services/playlist.service.ts index e15082e..86ee05f 100644 --- a/src/frontend/src/app/services/playlist.service.ts +++ b/src/frontend/src/app/services/playlist.service.ts @@ -2,7 +2,9 @@ import { Injectable } from '@angular/core'; import {createStore} from "@ngneat/elf"; import {HttpClient} from "@angular/common/http"; import { + getEntityByPredicate, selectAllEntities, selectEntities, + selectEntityByPredicate, setEntities, UIEntitiesRef, unionEntities, updateEntities, upsertEntities, @@ -10,7 +12,7 @@ import { withUIEntities } from "@ngneat/elf-entities"; import {joinRequestResult, trackRequestResult} from "@ngneat/elf-requests"; -import {map, Observable, tap} from "rxjs"; +import {combineLatest, map, Observable, tap} from "rxjs"; import {Track, TrackService} from "./track.service"; import {Socket} from "ngx-socket-io"; @@ -31,6 +33,14 @@ export interface PlaylistUi { collapsed: boolean; } +export enum PLaylistStatusEnum { + InProgress, + Completed, + Warning, + Error, + Subscribed, +} + @Injectable({ providedIn: 'root' }) @@ -62,6 +72,10 @@ export class PlaylistService { ); } + getById(playlistId: number): Observable { + return this.store.pipe(selectEntityByPredicate(({id}) => id === playlistId)); + } + getTrackCount(id: number): Observable { return this.trackService.getAllByPlaylist(id).pipe(map(data => data.length)); } @@ -70,6 +84,28 @@ export class PlaylistService { return this.trackService.getCompletedByPlaylist(id).pipe(map(data => data.length)); } + getErrorTrackCount(id: number): Observable { + return this.trackService.getErrorByPlaylist(id).pipe(map(data => data.length)); + } + + getStatus$(id: number): Observable { + return combineLatest([ + this.getById(id), + this.getTrackCount(id), + this.getCompletedTrackCount(id), + this.getErrorTrackCount(id), + ]).pipe(map(([playlist, trackCount, completedCount, errorCount]) => { + if (playlist?.error || errorCount === trackCount) { + return PLaylistStatusEnum.Error; + } else if (trackCount === completedCount) { + return PLaylistStatusEnum.Completed; + } else if (errorCount > 1) { + return PLaylistStatusEnum.Warning; + } + return PLaylistStatusEnum.InProgress; + })); + } + fetch(): void { this.http.get(ENDPOINT).pipe( tap((data: Playlist[]) => this.store.update( diff --git a/src/frontend/src/app/services/track.service.ts b/src/frontend/src/app/services/track.service.ts index 73aa489..34d1e1f 100644 --- a/src/frontend/src/app/services/track.service.ts +++ b/src/frontend/src/app/services/track.service.ts @@ -39,12 +39,19 @@ export class TrackService { withEntities(), ); - getAllByPlaylist(id: number): Observable { - return this.store.pipe(selectManyByPredicate(({playlistId}) => playlistId === id)) + getAllByPlaylist(id: number, status?: TrackStatusEnum): Observable { + return this.store.pipe( + selectManyByPredicate(({playlistId}) => playlistId === id), + map(data => data.filter(item => status === undefined || item.status === status)), + ); } getCompletedByPlaylist(id: number): Observable { - return this.getAllByPlaylist(id).pipe(map(data => data.filter(item => item.status === TrackStatusEnum.Completed))); + return this.getAllByPlaylist(id, TrackStatusEnum.Completed); + } + + getErrorByPlaylist(id: number): Observable { + return this.getAllByPlaylist(id, TrackStatusEnum.Error); } constructor(