import { Injectable } from '@angular/core'; import { Meta, Title } from '@angular/platform-browser'; import { environment } from '@environments/environment'; @Injectable({ providedIn: 'root' }) export class SeoService { constructor(private meta: Meta, private title: Title) {} generateTags(config: SeoConfig = {}) { config.keywords ? (config.keywords = [...environment.keywords, ...config.keywords]) : (config.keywords = environment.keywords); config = { title: environment.title, description: environment.description, image: this.absoluteImageUrl(environment.featureImage), route: '', ...config }; this.title.setTitle(config.title); this.meta.updateTag({ name: 'description', content: config.description }); this.meta.updateTag({ name: 'robots', content: 'index, follow' }); this.meta.updateTag({ name: 'keywords', content: config.keywords.join(', ') }); this.twitterCard(config); } private twitterCard(config: SeoConfig) { this.meta.updateTag({ name: 'twitter:card', content: 'summary_large_image' }); this.meta.updateTag({ name: 'twitter:site', content: '@notiz_dev' }); this.meta.updateTag({ name: 'twitter:title', content: config.title }); this.meta.updateTag({ name: 'twitter:description', content: config.description }); this.meta.updateTag({ name: 'twitter:image', content: config.twitter_image || config.image }); } private absoluteImageUrl(image: string) { return `${environment.url}/${image}`; } } export interface SeoConfig { title?: string; description?: string; image?: string; og_image?: string; twitter_image?: string; route?: string; keywords?: string[]; article?: SeoArticle; author?: SeoProfile; } export interface SeoArticle { published_time: string; modified_time: string; tag: string[]; author: string[]; } export interface SeoProfile { first_name: string; last_name: string; username: string; }