Skip to content

Commit 3a80db0

Browse files
committed
Getting ContentItem Data to ContentDetailComponent via Slug;
1 parent 5281d14 commit 3a80db0

11 files changed

+197
-41
lines changed

src/app/app-routing.module.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,14 @@ import {BlogComponent} from './screens/blog/blog.component';
66
import {FaqsComponent} from './screens/faqs/faqs.component';
77
import {AboutComponent} from './screens/about/about.component';
88
import {PrivacyComponent} from './screens/privacy/privacy.component';
9+
import {ContentDetailComponent} from './screens/content-detail/content-detail.component';
10+
import {ContentItemResolver} from './shared/resolvers/content-item.resolver';
911

1012

1113
const routes: Routes = [
1214
{ path: '', component: HomeComponent },
1315
{ path: 'conteudo', component: ContentComponent },
16+
{ path: 'conteudo/:slug', component: ContentDetailComponent, resolve: { queryResult: ContentItemResolver } },
1417
{ path: 'blog', component: BlogComponent },
1518
{ path: 'faqs', component: FaqsComponent },
1619
{ path: 'sobre', component: AboutComponent },

src/app/app.module.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {NgxSkeletonLoaderModule} from 'ngx-skeleton-loader';
1717
import {PrivacyComponent} from './screens/privacy/privacy.component';
1818
import {ReactiveFormsModule} from '@angular/forms';
1919
import {AppService} from './app.service';
20+
import {ContentDetailComponent} from './screens/content-detail/content-detail.component';
2021

2122
@NgModule({
2223
declarations: [
@@ -26,7 +27,8 @@ import {AppService} from './app.service';
2627
BlogComponent,
2728
FaqsComponent,
2829
AboutComponent,
29-
PrivacyComponent
30+
PrivacyComponent,
31+
ContentDetailComponent
3032
],
3133
imports: [
3234
BrowserModule,
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<p>content-detail works!</p>

src/app/screens/content-detail/content-detail.component.scss

Whitespace-only changes.
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
2+
3+
import { ContentDetailComponent } from './content-detail.component';
4+
5+
describe('ContentDetailComponent', () => {
6+
let component: ContentDetailComponent;
7+
let fixture: ComponentFixture<ContentDetailComponent>;
8+
9+
beforeEach(async(() => {
10+
TestBed.configureTestingModule({
11+
declarations: [ ContentDetailComponent ]
12+
})
13+
.compileComponents();
14+
}));
15+
16+
beforeEach(() => {
17+
fixture = TestBed.createComponent(ContentDetailComponent);
18+
component = fixture.componentInstance;
19+
fixture.detectChanges();
20+
});
21+
22+
it('should create', () => {
23+
expect(component).toBeTruthy();
24+
});
25+
});
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { Component, OnInit } from '@angular/core';
2+
import {ActivatedRoute} from '@angular/router';
3+
import {IContentItem} from '../../interfaces/content-item.interface';
4+
5+
@Component({
6+
selector: 't4e-content-detail',
7+
templateUrl: './content-detail.component.html',
8+
styleUrls: ['./content-detail.component.scss']
9+
})
10+
export class ContentDetailComponent implements OnInit {
11+
12+
contentItem: IContentItem
13+
loading: boolean;
14+
15+
constructor(
16+
private route: ActivatedRoute
17+
) { }
18+
19+
ngOnInit(): void {
20+
this.route.data.subscribe(({queryResult}) => {
21+
this.loading = queryResult.data.loading;
22+
this.contentItem = queryResult.data.contentItem;
23+
})
24+
}
25+
26+
}

src/app/screens/content/content.component.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
<t4e-content-card
5757
*ngFor="let contentItem of contentItems"
5858
[contentItem]="contentItem"
59+
[routerLink]="['/conteudo/' + contentItem.slug]"
5960
></t4e-content-card>
6061
</section>
6162

src/app/screens/content/content.component.ts

Lines changed: 4 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,12 @@
11
import {Component, OnInit} from '@angular/core';
2-
import gql from 'graphql-tag';
32
import {AppService} from '../../app.service';
43
import {BehaviorSubject, combineLatest, Observable} from 'rxjs';
54
import {map} from 'rxjs/operators';
65
import {IFilters} from '../../shared/components/filters/interfaces/filters.interface';
76
import {Apollo, QueryRef} from 'apollo-angular';
87
import {IContentItem} from '../../interfaces/content-item.interface';
98
import {ActivatedRoute} from '@angular/router';
10-
11-
const GET_CONTENT_ITEMS = gql`
12-
query GetContentItems(
13-
$stakeholderIds: [String],
14-
$providerIds: [String],
15-
$tagIds: [String],
16-
$limit: Float,
17-
$startAt: Float
18-
) {
19-
contentItems(
20-
stakeholderIds: $stakeholderIds,
21-
providerIds: $providerIds,
22-
tagIds: $tagIds,
23-
limit: $limit,
24-
startAt: $startAt,
25-
onlyPublished: true
26-
) {
27-
type,
28-
title,
29-
slug,
30-
order,
31-
videoTime,
32-
imageUrl,
33-
createdAt,
34-
updatedAt,
35-
stakeholder {
36-
code
37-
}
38-
provider {
39-
code
40-
}
41-
}
42-
43-
}
44-
`;
9+
import {ContentItemsService} from '../../shared/services/content-items.service';
4510

4611
@Component({
4712
selector: 't4e-content',
@@ -69,7 +34,8 @@ export class ContentComponent implements OnInit {
6934
constructor(
7035
private appService: AppService,
7136
private apollo: Apollo,
72-
private activatedRoute: ActivatedRoute
37+
private activatedRoute: ActivatedRoute,
38+
private contentItemsService: ContentItemsService
7339
) { }
7440

7541
ngOnInit(): void {
@@ -79,9 +45,7 @@ export class ContentComponent implements OnInit {
7945
this.stakeholderFields$ = this.appService.getStakeholderFilterFields();
8046
this.tagFields$ = this.appService.getTagFilterFields();
8147

82-
this.contentItemsQueryRef = this.apollo.watchQuery({
83-
query: GET_CONTENT_ITEMS
84-
})
48+
this.contentItemsQueryRef = this.contentItemsService.getContentItems();
8549

8650
this.contentItemsQueryRef.valueChanges.subscribe(({data, loading, errors}) => {
8751
if (!loading) {
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import {Injectable} from '@angular/core';
2+
import {ContentItemsService} from '../services/content-items.service';
3+
import {ActivatedRouteSnapshot, Resolve, RouterStateSnapshot} from '@angular/router';
4+
import {IContentItem} from '../../interfaces/content-item.interface';
5+
import {Observable} from 'rxjs';
6+
import {map} from 'rxjs/operators';
7+
8+
@Injectable({ providedIn: 'root'})
9+
export class ContentItemResolver implements Resolve<IContentItem>{
10+
constructor(private service: ContentItemsService) {}
11+
12+
resolve(
13+
route: ActivatedRouteSnapshot,
14+
state: RouterStateSnapshot
15+
): Observable<any> | Promise<any> | any {
16+
return this.service.getContentItem(route.paramMap.get('slug'))
17+
.pipe(
18+
map(({data, loading, errors}) => {
19+
return {
20+
data,
21+
loading,
22+
errors
23+
}
24+
})
25+
);
26+
}
27+
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import {Injectable} from '@angular/core';
2+
import gql from 'graphql-tag';
3+
import {Apollo, QueryRef} from 'apollo-angular';
4+
import {Observable} from 'rxjs';
5+
import {ApolloQueryResult} from 'apollo-client';
6+
import {IContentItem} from '../../interfaces/content-item.interface';
7+
8+
const GET_CONTENT_ITEMS = gql`
9+
query GetContentItems(
10+
$stakeholderIds: [String],
11+
$providerIds: [String],
12+
$tagIds: [String],
13+
$limit: Float,
14+
$startAt: Float
15+
) {
16+
contentItems(
17+
stakeholderIds: $stakeholderIds,
18+
providerIds: $providerIds,
19+
tagIds: $tagIds,
20+
limit: $limit,
21+
startAt: $startAt,
22+
onlyPublished: true
23+
) {
24+
type,
25+
title,
26+
slug,
27+
order,
28+
videoTime,
29+
imageUrl,
30+
createdAt,
31+
updatedAt,
32+
stakeholder {
33+
code
34+
}
35+
provider {
36+
code
37+
}
38+
}
39+
40+
}
41+
`;
42+
43+
const GET_CONTENT_ITEM = gql`
44+
query GetContentItem($slug: String) {
45+
contentItem(slug: $slug) {
46+
id,
47+
type,
48+
order,
49+
videoUrl,
50+
videoTime,
51+
imageUrl,
52+
title,
53+
text,
54+
createdAt,
55+
updatedAt,
56+
slug,
57+
published,
58+
stakeholder {
59+
id,
60+
title,
61+
code,
62+
order
63+
}
64+
provider {
65+
id,
66+
title,
67+
code,
68+
order
69+
}
70+
tags {
71+
id,
72+
title,
73+
code,
74+
order
75+
}
76+
}
77+
}
78+
`;
79+
80+
@Injectable()
81+
export class ContentItemsService {
82+
constructor(private apollo: Apollo) {}
83+
84+
getContentItems(): QueryRef<any> {
85+
return this.apollo.watchQuery({
86+
query: GET_CONTENT_ITEMS
87+
})
88+
}
89+
90+
getContentItem(slug: string): Observable<ApolloQueryResult<IContentItem>> {
91+
return this.apollo.query({
92+
query: GET_CONTENT_ITEM,
93+
variables: {
94+
slug
95+
}
96+
})
97+
}
98+
99+
}

src/app/shared/shared.module.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { FiltersComponent } from './components/filters/filters.component';
1010
import {ReactiveFormsModule} from '@angular/forms';
1111
import { ContentCardComponent } from './components/content-card/content-card.component';
1212
import { FilterDrawerComponent } from './components/filter-drawer/filter-drawer.component';
13+
import {ContentItemsService} from './services/content-items.service';
1314

1415
const SHARED_COMPONENTS = [
1516
NavbarComponent,
@@ -19,12 +20,19 @@ const SHARED_COMPONENTS = [
1920
FiltersComponent,
2021
ContentCardComponent,
2122
FilterDrawerComponent,
23+
];
24+
25+
const SHARED_SERVICES = [
26+
ContentItemsService
2227
]
2328

2429
@NgModule({
2530
declarations: [
2631
...SHARED_COMPONENTS
2732
],
33+
providers: [
34+
...SHARED_SERVICES
35+
],
2836
imports: [
2937
CommonModule,
3038
RouterModule,

0 commit comments

Comments
 (0)