Skip to content

Commit 5bfcf71

Browse files
author
Danilo Otavio Lima Salve
committed
feat(httpResource): implementa exemplo de uso do HttpResource
1 parent 2f06da6 commit 5bfcf71

7 files changed

Lines changed: 147 additions & 7 deletions

File tree

src/app/core/components/home/shared/helpers/menu.constants.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,12 @@ export const MENU_ITEMS: PoMenuItem[] = [
120120
shortLabel: 'Disney',
121121
icon: 'an an-castle-turret'
122122
},
123+
{
124+
label: 'Dragon Ball | HttpResource',
125+
link: 'sample/resources-api/dbz',
126+
shortLabel: 'DBZ',
127+
icon: 'an an-fire-simple'
128+
},
123129
{
124130
label: 'Rick & Morty - Personagens | Resource',
125131
link: 'sample/resources-api/rick-and-morty',
Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,49 @@
1-
<p>dragon-ball-list works!</p>
1+
<po-page-default p-title="Dragon Ball | Lista de Personagens" p-subtitle="Exemplo de uso da API httpResource ">
2+
@let dbzCharacter = dbzCharactersResource.value();
3+
@let error = dbzCharactersResource.error();
4+
@let hasValue = dbzCharactersResource.hasValue();
5+
@let isLoading = dbzCharactersResource.isLoading();
6+
7+
<div class="po-row">
8+
<app-type-list-button
9+
class="po-xl-1 po-lg-2 po-md-6 po-sm-12 po-mt-1"
10+
(changeTypeView)="onChangeTypeView($event)"
11+
/>
12+
<app-search
13+
class="po-offset-lg-6 po-offset-xl-8 po-xl-3 po-lg-4 po-offset-lg-6 po-md-6 po-sm-12 po-mb-1"
14+
(changeInValue)="onChangeFilter($event)"
15+
/>
16+
</div>
17+
18+
@if (hasValue && allDbzCharacters().length > 0) {
19+
@if (dbzCharacter) {
20+
<div class="po-row">
21+
<po-container class="po-xl-12 po-lg-12 po-md-12 po-sm-12 po-mb-1">
22+
@if (isTableView()) {
23+
<app-dragon-ball-table [items]="allDbzCharacters()" [isLoading]="isLoading" />
24+
} @else {
25+
<app-dragon-ball-cards [items]="allDbzCharacters()" [isLoading]="isLoading" />
26+
}
27+
</po-container>
28+
</div>
29+
}
30+
} @else {
31+
<po-container class="po-xl-12 po-lg-12 po-md-12 po-sm-12 po-mb-1">
32+
<p class="po-font-text-bold">Nenhum personagem foi encontrado</p>
33+
</po-container>
34+
}
35+
36+
@let hasNextPage = hasValue && dbzCharacter?.meta?.currentPage! < dbzCharacter?.meta?.totalPages!;
37+
38+
<po-container class="footer po-xl-12 po-lg-12 po-md-12 po-sm-12 po-mb-4">
39+
<app-show-more-button (clickShowMore)="onShowMore()" [isLoading]="isLoading" [isDisabled]="!hasNextPage" />
40+
</po-container>
41+
42+
@if (error) {
43+
<po-container class="po-xl-12 po-lg-12 po-md-12 po-sm-12 po-mb-1">
44+
<p class="po-font-text-bold">Ops, ocorreu erro ao tentar listar os Personagens :(</p>
45+
</po-container>
46+
}
47+
48+
<po-loading-overlay [hidden]="!isLoading" p-text="Carregando personagens" />
49+
</po-page-default>
Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,62 @@
1-
import { Component } from '@angular/core';
1+
import { Component, effect, inject, signal } from '@angular/core';
2+
import { PoContainerModule, PoPageModule, PoLoadingModule } from '@po-ui/ng-components';
3+
4+
import { DragonBallService } from '../shared/services/dragon-ball.service';
5+
import { DragonBallCardsComponent } from './dragon-ball-cards/dragon-ball-cards.component';
6+
import { DragonBallTableComponent } from './dragon-ball-table/dragon-ball-table.component';
7+
import { SearchComponent } from '../../../../shared/components/search/search.component';
8+
import { ShowMoreButtonComponent } from '../../../../shared/components/show-more-button/show-more-button.component';
9+
import { TypeListButtonComponent } from '../../../../shared/components/type-list-button/type-list-button.component';
10+
import { Character } from '../shared/interfaces/character';
211

312
@Component({
413
selector: 'app-dragon-ball-list',
5-
imports: [],
14+
imports: [
15+
PoContainerModule,
16+
PoPageModule,
17+
PoLoadingModule,
18+
SearchComponent,
19+
TypeListButtonComponent,
20+
ShowMoreButtonComponent,
21+
DragonBallCardsComponent,
22+
DragonBallTableComponent
23+
],
624
templateUrl: './dragon-ball-list.component.html'
725
})
8-
export class DragonBallListComponent {}
26+
export class DragonBallListComponent {
27+
private readonly page = signal<number>(1);
28+
private readonly dragonBallService = inject(DragonBallService);
29+
30+
protected readonly isTableView = signal(true);
31+
protected readonly dbzCharactersResource = this.dragonBallService.getCharacters;
32+
protected readonly allDbzCharacters = signal<Character[]>([]);
33+
34+
constructor() {
35+
effect(() => {
36+
const resource = this.dbzCharactersResource;
37+
const data = resource.value();
38+
39+
if (Array.isArray(data)) {
40+
this.allDbzCharacters.set(data);
41+
} else {
42+
if (data) {
43+
this.allDbzCharacters.update(prev => [...prev, ...data.items]);
44+
}
45+
}
46+
});
47+
}
48+
onShowMore(): void {
49+
this.page.update(p => p + 1);
50+
this.dragonBallService.setPage(this.page());
51+
}
52+
53+
onChangeFilter(name: string): void {
54+
this.page.set(1);
55+
this.allDbzCharacters.set([]);
56+
this.dragonBallService.setName(name);
57+
}
58+
59+
onChangeTypeView(isTableView: boolean): void {
60+
this.isTableView.set(isTableView);
61+
}
62+
}
Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,35 @@
1-
import { Injectable } from '@angular/core';
1+
import { Injectable, signal } from '@angular/core';
2+
import { httpResource } from '@angular/common/http';
3+
import { ListCharacters } from '../interfaces/character';
24

35
@Injectable({
46
providedIn: 'root'
57
})
68
export class DragonBallService {
79
private readonly apiUrl = 'https://dragonball-api.com/api/characters';
10+
private readonly limit = signal<number>(10);
11+
private readonly name = signal<string>('');
12+
private readonly page = signal<number>(1);
13+
14+
/**
15+
* Obtem uma lista de personagens do Dragon Ball com páginação
16+
*/
17+
readonly getCharacters = httpResource<ListCharacters>(() => ({
18+
url: this.apiUrl,
19+
method: 'GET',
20+
params: { page: this.page(), limit: this.limit(), name: this.name() }
21+
}));
22+
23+
setLimit(limit: number): void {
24+
this.limit.set(limit);
25+
}
26+
27+
setName(name: string): void {
28+
this.page.set(1);
29+
this.name.set(name);
30+
}
31+
32+
setPage(page: number): void {
33+
this.page.set(page);
34+
}
835
}

src/app/pages/resources-api/resources-api.routes.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,10 @@ export const RESOURCES_API_ROUTES: Routes = [
1515
path: 'disney',
1616
title: 'Disney | Personagens',
1717
loadChildren: () => import('./disney/disney.routes').then(r => r.DISNEY_ROUTES)
18+
},
19+
{
20+
path: 'dbz',
21+
title: 'DBZ | Personagens',
22+
loadChildren: () => import('./dragon-ball/dragon-ball.routes').then(r => r.DBZ_ROUTES)
1823
}
1924
];

src/app/pages/resources-api/rick-and-morty/characters-list/characters-card/character-card/character-card.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<div class="po-row">
44
<div class="po-md-5 po-lg-5">
55
@let image = item().image || 'assets/img/not-found-image.jpg';
6-
<po-image [p-src]="image" p-loading="lazy" p-alt="Imagem do personagem da Disney" [p-height]="200" />
6+
<po-image [p-src]="image" p-loading="lazy" p-alt="Imagem do personagem do Rick & Morty" [p-height]="200" />
77
</div>
88
<div class="po-md-7 po-lg-7">
99
<p class="po-font-subtitle po-xl-12 po-lg-12 po-md-12 po-sm-12">{{ item().name }}</p>

src/app/pages/resources-api/rick-and-morty/characters-list/characters-list.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
</po-container>
3434
}
3535

36-
<po-container class="po-xl-12 po-lg-12 po-md-12 po-sm-12 po-mb-4">
36+
<po-container class="footer po-xl-12 po-lg-12 po-md-12 po-sm-12 po-mb-4">
3737
<app-show-more-button (clickShowMore)="onShowMore()" [isLoading]="isLoading" [isDisabled]="!hasNextPage()" />
3838
</po-container>
3939

0 commit comments

Comments
 (0)