Skip to content

Commit 6faecf4

Browse files
committed
feat(Meta Tags): Set meta tags on each page
1 parent 473b372 commit 6faecf4

File tree

8 files changed

+102
-19
lines changed

8 files changed

+102
-19
lines changed

src/app/+about-page/about-page.component.ts

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'rxjs/add/observable/forkJoin';
77

88
// App specific
99
import { AboutPageService } from './about-page.service';
10+
import { MetaTagsService } from '../shared/meta-tags/meta-tags.service';
1011

1112
// Moment
1213
import * as moment from 'moment/moment';
@@ -18,6 +19,7 @@ import * as moment from 'moment/moment';
1819
export class AboutPageComponent implements OnInit {
1920
age: number;
2021
isLoading = true;
22+
pageName = 'About';
2123

2224
profilePictures = [];
2325
socialIcons = [];
@@ -27,23 +29,25 @@ export class AboutPageComponent implements OnInit {
2729
constructor(private aboutMeService: AboutPageService,
2830
private router: Router,
2931
private title: Title,
30-
private meta: Meta) {
32+
private meta: Meta,
33+
private metaTagsService: MetaTagsService) {
3134
}
3235

33-
bounceImage(event) {
36+
bounceImage(event): void {
3437
this.bouncer = event.type === 'mouseover' ? 'bounce-out' : 'no-bounce';
3538
}
3639

37-
generateImage(image) {
40+
generateImage(image): string {
3841
return 'data:image/jpeg;base64,' + image;
3942
}
4043

41-
doNavigate(route) {
44+
doNavigate(route): void {
4245
this.router.navigate([route]);
4346
}
4447

4548
ngOnInit(): void {
46-
this.age = moment().diff('1992-05-11', 'years');
49+
this.setMetaData();
50+
this.calculateAge();
4751
Observable.forkJoin(
4852
this.aboutMeService.getImages(),
4953
this.aboutMeService.getSocialIcons()
@@ -52,8 +56,15 @@ export class AboutPageComponent implements OnInit {
5256
this.socialIcons = res[1];
5357
this.isLoading = false;
5458
});
59+
}
60+
61+
setMetaData(): void {
62+
this.meta.addTag(this.metaTagsService.setMetaTag('description', `${this.pageName} Page`));
63+
this.title.setTitle(this.metaTagsService.setPageTitle(this.pageName));
64+
}
5565

56-
this.title.setTitle('Maro Radovic - Web and Software Developer | About');
57-
this.meta.addTag({name: 'description', content: 'About page'});
66+
calculateAge(): void {
67+
this.age = moment().diff('1992-05-11', 'years');
5868
}
69+
5970
}

src/app/+contact-page/contact-page.component.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'rxjs/add/operator/debounceTime';
77

88
// App specific
99
import { ContactPageService } from './contact-page.service';
10+
import { MetaTagsService } from '../shared/meta-tags/meta-tags.service';
1011

1112
@Component({
1213
selector: 'folio-contact',
@@ -15,6 +16,7 @@ import { ContactPageService } from './contact-page.service';
1516
export class ContactPageComponent implements OnInit {
1617

1718
contactForm: FormGroup;
19+
pageName = 'Contact Me';
1820

1921
animateMe = false;
2022
formSent = false;
@@ -26,7 +28,8 @@ export class ContactPageComponent implements OnInit {
2628
private contactService: ContactPageService,
2729
private router: Router,
2830
private title: Title,
29-
private meta: Meta) {
31+
private meta: Meta,
32+
private metaTagsService: MetaTagsService) {
3033
}
3134

3235
checkName() {
@@ -85,6 +88,7 @@ export class ContactPageComponent implements OnInit {
8588
}
8689

8790
ngOnInit(): void {
91+
this.setMetaData();
8892
this.contactForm = this.formBuilder.group({
8993
name: ['', [Validators.required]],
9094
email: ['', [Validators.required, Validators.email]],
@@ -95,8 +99,10 @@ export class ContactPageComponent implements OnInit {
9599
nameControl.valueChanges.debounceTime(800).subscribe(val => {
96100
this.doCheckEmail();
97101
});
102+
}
98103

99-
this.title.setTitle('Maro Radovic - Web and Software Developer | Contact Me');
100-
this.meta.addTag({name: 'description', content: 'Contact me page'});
104+
setMetaData(): void {
105+
this.meta.addTag(this.metaTagsService.setMetaTag('description', `${this.pageName} Page`));
106+
this.title.setTitle(this.metaTagsService.setPageTitle(this.pageName));
101107
}
102108
}

src/app/+experience-page/experience-page.component.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,28 @@
11
// Core
22
import { Component, OnInit } from '@angular/core';
3+
import { Meta, Title } from '@angular/platform-browser';
34
import { Observable } from 'rxjs/Observable';
45
import 'rxjs/add/observable/forkJoin';
56

67
// App specific
78
import { ExperiencePageService } from './experience-page.service';
9+
import { MetaTagsService } from '../shared/meta-tags/meta-tags.service';
810

911
@Component({
1012
selector: 'folio-xp',
1113
templateUrl: 'experience-page.component.html'
1214
})
1315
export class ExperiencePageComponent implements OnInit {
1416

17+
pageName = 'Experience';
1518
projectsList = [];
1619
positions = [];
1720
education = [];
1821

19-
constructor(private experienceService: ExperiencePageService) {}
22+
constructor(private experienceService: ExperiencePageService,
23+
private metaTagsService: MetaTagsService,
24+
private meta: Meta,
25+
private title: Title) {}
2026

2127
generateImage(image) {
2228
return 'data:image/png;base64,' + image;
@@ -27,6 +33,7 @@ export class ExperiencePageComponent implements OnInit {
2733
}
2834

2935
ngOnInit(): void {
36+
this.setMetaData();
3037
Observable.forkJoin(
3138
this.experienceService.getProjectsList(),
3239
this.experienceService.getPositions(),
@@ -37,4 +44,9 @@ export class ExperiencePageComponent implements OnInit {
3744
this.education = res[2];
3845
});
3946
}
47+
48+
setMetaData(): void {
49+
this.meta.addTag(this.metaTagsService.setMetaTag('description', `${this.pageName} Page`));
50+
this.title.setTitle(this.metaTagsService.setPageTitle(this.pageName));
51+
}
4052
}
Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,45 @@
11
// Core
22
import { Component, OnInit } from '@angular/core';
33
import { Location } from '@angular/common';
4+
import { Meta, Title } from '@angular/platform-browser';
45

56
// App specific
67
import { FaqsPageService } from './faqs-page.service';
8+
import { MetaTagsService } from '../shared/meta-tags/meta-tags.service';
79

810
@Component({
911
selector: 'faqs-block',
1012
templateUrl: 'faqs-block.component.html'
1113
})
1214
export class FaqsBlockComponent implements OnInit {
1315

16+
pageName = 'FAQs';
1417
faqs = [];
1518

1619
constructor(private faqsService: FaqsPageService,
17-
private location: Location) {
20+
private location: Location,
21+
private metaTagsService: MetaTagsService,
22+
private meta: Meta,
23+
private title: Title) {
1824
}
1925

20-
2126
navigateBack(): void {
22-
2327
// workaround to prevent animation trigger when user leaves the page
2428
this.faqs = [];
2529
this.location.back();
2630
}
2731

2832
ngOnInit(): void {
33+
this.setMetaData();
2934
this.faqsService.getFaqs().subscribe((res) => {
3035
// don't rush
3136
setInterval(() => this.faqs = res, 500 );
3237
});
3338
}
3439

40+
setMetaData(): void {
41+
this.meta.addTag(this.metaTagsService.setMetaTag('description', `${this.pageName} Page`));
42+
this.title.setTitle(this.metaTagsService.setPageTitle(this.pageName));
43+
}
44+
3545
}
Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,47 @@
11
// Core
22
import { Component, OnInit } from '@angular/core';
3+
import { Meta, Title } from '@angular/platform-browser';
34
import { Router } from '@angular/router';
45

56
// App specific
7+
import { MetaTagsService } from '../shared/meta-tags/meta-tags.service';
68
import { PortfolioPageService } from './portfolio-page.service';
79

810
@Component({
911
selector: 'folio-portfolio',
1012
templateUrl: 'portfolio-page.component.html'
1113
})
1214
export class PortfolioPageComponent implements OnInit {
15+
16+
pageName = 'Projects List';
1317
projectsList = [];
1418

1519
constructor(private portfolioService: PortfolioPageService,
16-
private router: Router) {
20+
private router: Router,
21+
private metaTagsService: MetaTagsService,
22+
private meta: Meta,
23+
private title: Title) {
1724
}
1825

19-
generateImage(image) {
26+
generateImage(image): string {
2027
return 'data:image/jpeg;base64,' + image;
2128
}
2229

23-
goToProject(project) {
30+
goToProject(project): void {
2431
this.router.navigate([`portfolio/${project}`]);
2532
}
2633

2734
ngOnInit(): void {
35+
this.setMetaData();
2836
this.portfolioService.getProjects().subscribe(
2937
(res) => {
3038
this.projectsList = res;
3139
}
3240
);
3341
}
42+
43+
setMetaData(): void {
44+
this.meta.addTag(this.metaTagsService.setMetaTag('description', `${this.pageName} Page`));
45+
this.title.setTitle(this.metaTagsService.setPageTitle(this.pageName));
46+
}
3447
}

src/app/+skills-page/skills-page.component.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
// Core
22
import { Component, OnInit } from '@angular/core';
3+
import { Meta, Title } from '@angular/platform-browser';
34

45
// App specific
6+
import { MetaTagsService } from '../shared/meta-tags/meta-tags.service';
57
import { SkillsPageService } from './skills-page.service';
68
import { SkillsInterface } from './skills.interface';
79

@@ -18,8 +20,12 @@ export class SkillsPageComponent implements OnInit {
1820
fontAwesomeList: SkillsInterface[] = [];
1921
customIconsList: SkillsInterface[] = [];
2022
skillsContent: any;
23+
pageName = 'Skills';
2124

22-
constructor(private skillsService: SkillsPageService) {
25+
constructor(private skillsService: SkillsPageService,
26+
private metaTagsService: MetaTagsService,
27+
private title: Title,
28+
private meta: Meta) {
2329
}
2430

2531
explodeSkillsList() {
@@ -50,6 +56,7 @@ export class SkillsPageComponent implements OnInit {
5056
}
5157

5258
ngOnInit(): void {
59+
this.setMetaData();
5360
this.skillsService.getSkillsList().subscribe((res) => {
5461
this.skills = res;
5562
this.explodeSkillsList();
@@ -58,4 +65,9 @@ export class SkillsPageComponent implements OnInit {
5865
this.skillsContent = res[0];
5966
});
6067
}
68+
69+
setMetaData(): void {
70+
this.meta.addTag(this.metaTagsService.setMetaTag('description', `${this.pageName} Page`));
71+
this.title.setTitle(this.metaTagsService.setPageTitle(this.pageName));
72+
}
6173
}

src/app/app.module.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { BrowserDetectService } from './shared/browser-detect/browser-detect.ser
1212
import { BrowserUnsupportedComponent } from './shared/browser-unsupported/browser-unsupported.component';
1313
import { GoogleAnalyticsService } from './shared/google-analytics/google-analytics.service';
1414
import { MaterialModule } from './shared/materialModule';
15+
import { MetaTagsService } from './shared/meta-tags/meta-tags.service';
1516
import { PageNotFoundModule } from './404-page/page-not-found.module';
1617
import { routes } from './app.routes';
1718
import { SharedModule } from './shared/shared.module';
@@ -39,7 +40,8 @@ import 'hammerjs';
3940
],
4041
providers: [
4142
BrowserDetectService,
42-
GoogleAnalyticsService
43+
GoogleAnalyticsService,
44+
MetaTagsService
4345
],
4446
bootstrap: [AppComponent]
4547
})
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// Core
2+
import { Injectable } from '@angular/core';
3+
4+
@Injectable()
5+
export class MetaTagsService {
6+
7+
private roleTitle = 'Senior Software Developer & Research Lead';
8+
private name = 'Maro Radovic';
9+
10+
setPageTitle(page: string): string {
11+
return `${this.name} - ${this.roleTitle} | ${page}`;
12+
}
13+
14+
setMetaTag(tagName: string, tagContent: string): any {
15+
return {name: tagName, content: tagContent};
16+
}
17+
}

0 commit comments

Comments
 (0)