load comic details

This commit is contained in:
Thomas Peetz
2025-09-19 22:34:44 +02:00
parent b250bfe76c
commit fd7a6bd1a1
5 changed files with 64 additions and 12 deletions
@@ -4,7 +4,11 @@
</div>
<div class="child">
<div class="float-details-element">
@if (comic()) {
<h2>{{ comic().title }}</h2>
} @else {
<h2>Comic Details</h2>
}
</div>
</div>
</div>
@@ -1,5 +1,8 @@
import { Component } from '@angular/core';
import { Component, inject, input } from '@angular/core';
import { ComicComicsListComponent } from "../comic-comics-list/comic-comics-list.component";
import { ComicDetails } from './comic.model';
import { ActivatedRouteSnapshot, ResolveFn, RouterStateSnapshot } from '@angular/router';
import { ComicService } from './comic.service';
@Component({
selector: 'app-comic-comics',
@@ -8,5 +11,13 @@ import { ComicComicsListComponent } from "../comic-comics-list/comic-comics-list
styleUrl: './comic-comics.component.css'
})
export class ComicComicsComponent {
comic = input.required<ComicDetails>();
}
export const comicResolver: ResolveFn<ComicDetails> = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {
const comicService = inject(ComicService);
const comicId = route.paramMap.get('comicId');
const comicDetails = comicService.loadComicDetails(comicId);
console.log(comicDetails);
return comicDetails;
};
@@ -3,3 +3,20 @@ export interface Comic {
title: string;
completed: boolean;
}
export interface ComicWork {
worktype: string;
}
export interface ComicDetails {
id: string;
created: string;
title: string;
completed: boolean;
current_order: boolean;
weblink: string;
publisher: string;
volumes: [
name: string,
];
}
@@ -1,6 +1,6 @@
import { HttpClient } from "@angular/common/http";
import { inject, Injectable, signal } from "@angular/core";
import { Comic } from "./comic.model";
import { Comic, ComicDetails } from "./comic.model";
import { catchError, map, throwError } from "rxjs";
@Injectable({
@@ -16,6 +16,23 @@ export class ComicService {
return this.fetchComics('http://127.0.0.1:8800/api/comics/comics', 'Someting went wrong fetching comics. Please try again later.');
}
loadComicDetails(comicId: string | null) {
return this.fetchComicDetails('http://127.0.0.1:8800/api/comics/comics/' + comicId, 'Someting went wrong fetching comics. Please try again later.');
}
private fetchComicDetails(url: string, errorMessage: string) {
return this.httpClient.get<ComicDetails>(url).pipe(
map((resData) => {
console.log(resData);
return resData;
}),
catchError((error) => {
console.log(error);
return throwError(() => new Error(errorMessage));
})
);
}
private fetchComics(url: string, errorMessage: string) {
return this.httpClient.get<Comic[]>(url).pipe(
map((resData) => resData),
@@ -1,7 +1,7 @@
import { Routes } from "@angular/router";
import { ComicArtistsComponent } from "../comic-artists/comic-artists.component";
import { ComicPublishersComponent } from './../comic-publishers/comic-publishers.component';
import { ComicComicsComponent } from "../comic-comics/comic-comics.component";
import { ComicComicsComponent, comicResolver } from "../comic-comics/comic-comics.component";
export const comicRoutes: Routes = [
{
@@ -9,8 +9,11 @@ export const comicRoutes: Routes = [
component: ComicComicsComponent
},
{
path: 'comics/:comicId',
component: ComicComicsComponent,
path: 'comics/:comicId',
component: ComicComicsComponent,
resolve: {
comic: comicResolver
}
},
{
path: 'publisher',