diff --git a/kontor-angular/src/app/comic/artist/artist-list/artist-list.component.html b/kontor-angular/src/app/comic/artist/artist-list/artist-list.component.html index 42c5108..a6c80b6 100644 --- a/kontor-angular/src/app/comic/artist/artist-list/artist-list.component.html +++ b/kontor-angular/src/app/comic/artist/artist-list/artist-list.component.html @@ -1 +1,8 @@

artist-list works!

+ diff --git a/kontor-angular/src/app/comic/artist/artist-list/artist-list.component.ts b/kontor-angular/src/app/comic/artist/artist-list/artist-list.component.ts index ca510ad..7027275 100644 --- a/kontor-angular/src/app/comic/artist/artist-list/artist-list.component.ts +++ b/kontor-angular/src/app/comic/artist/artist-list/artist-list.component.ts @@ -1,4 +1,6 @@ -import { Component } from '@angular/core'; +import { Component, DestroyRef, inject, OnInit, signal } from '@angular/core'; +import { Artist } from '../artist.model'; +import { ArtistService } from '../artist.service'; @Component({ selector: 'app-artist-list', @@ -6,6 +8,30 @@ import { Component } from '@angular/core'; templateUrl: './artist-list.component.html', styleUrl: './artist-list.component.css' }) -export class ArtistListComponent { +export class ArtistListComponent implements OnInit { + artists = signal(undefined); + isFetching = signal(false); + error = signal(''); + private artistService = inject(ArtistService); + private destroyRef = inject(DestroyRef); + + ngOnInit() { + this.isFetching.set(true); + const subscription = this.artistService.loadArtists().subscribe({ + next: (artists) => { + this.artists.set(artists); + }, + error: (error: Error) => { + this.error.set(error.message); + }, + complete: () => { + this.isFetching.set(false); + }, + }); + + this.destroyRef.onDestroy(() => { + subscription.unsubscribe(); + }); + } } diff --git a/kontor-angular/src/app/comic/artist/artist.model.ts b/kontor-angular/src/app/comic/artist/artist.model.ts new file mode 100644 index 0000000..8529fa7 --- /dev/null +++ b/kontor-angular/src/app/comic/artist/artist.model.ts @@ -0,0 +1,4 @@ +export interface Artist { + id: string; + name: string; +} diff --git a/kontor-angular/src/app/comic/artist/artist.service.ts b/kontor-angular/src/app/comic/artist/artist.service.ts new file mode 100644 index 0000000..c72b9f7 --- /dev/null +++ b/kontor-angular/src/app/comic/artist/artist.service.ts @@ -0,0 +1,30 @@ +import { inject, Injectable, signal } from "@angular/core"; +import { ErrorService } from "../../shared/error.service"; +import { HttpClient } from "@angular/common/http"; +import { Artist } from "./artist.model"; +import { catchError, map, throwError } from "rxjs"; + +@Injectable({ + providedIn: 'root', +}) +export class ArtistService { + private errorService = inject(ErrorService); + private httpClient = inject(HttpClient); + private artists = signal([]); + + loadedArtists = this.artists.asReadonly(); + + loadArtists() { + return this.fetchArtists('http://127.0.0.1:8800/api/comics/artists', 'Someting went wrong fetching sports. Please try again later-'); + } + + private fetchArtists(url: string, errorMessage: string) { + return this.httpClient.get(url).pipe( + map((resData) => resData), + catchError((error) => { + console.log(error); + return throwError(() => new Error(errorMessage)); + }) + ); + } +}