Use a resolver for the about page
authorChocobozzz <me@florianbigard.com>
Mon, 3 Feb 2020 09:31:34 +0000 (10:31 +0100)
committerChocobozzz <me@florianbigard.com>
Mon, 3 Feb 2020 09:33:08 +0000 (10:33 +0100)
client/src/app/+about/about-instance/about-instance.component.ts
client/src/app/+about/about-instance/about-instance.resolver.ts [new file with mode: 0644]
client/src/app/+about/about-routing.module.ts
client/src/app/+about/about.module.ts

index 87beb13dad51743bb92317e9176dc0b3867149cd..c8c1561054c0de160c39903bde137860c0329c30 100644 (file)
@@ -1,12 +1,10 @@
 import { Component, OnInit, ViewChild } from '@angular/core'
 import { Notifier, ServerService } from '@app/core'
-import { I18n } from '@ngx-translate/i18n-polyfill'
 import { ContactAdminModalComponent } from '@app/+about/about-instance/contact-admin-modal.component'
 import { InstanceService } from '@app/shared/instance/instance.service'
-import { MarkdownService } from '@app/shared/renderer'
-import { forkJoin } from 'rxjs'
-import { map, switchMap } from 'rxjs/operators'
 import { ServerConfig } from '@shared/models'
+import { ActivatedRoute } from '@angular/router'
+import { ResolverData } from './about-instance.resolver'
 
 @Component({
   selector: 'my-about-instance',
@@ -37,11 +35,10 @@ export class AboutInstanceComponent implements OnInit {
   serverConfig: ServerConfig
 
   constructor (
+    private route: ActivatedRoute,
     private notifier: Notifier,
     private serverService: ServerService,
-    private instanceService: InstanceService,
-    private markdownService: MarkdownService,
-    private i18n: I18n
+    private instanceService: InstanceService
   ) {}
 
   get instanceName () {
@@ -56,35 +53,23 @@ export class AboutInstanceComponent implements OnInit {
     return this.serverConfig.instance.isNSFW
   }
 
-  ngOnInit () {
+  async ngOnInit () {
     this.serverConfig = this.serverService.getTmpConfig()
     this.serverService.getConfig()
         .subscribe(config => this.serverConfig = config)
 
-    this.instanceService.getAbout()
-        .pipe(
-          switchMap(about => {
-            return forkJoin([
-              this.instanceService.buildTranslatedLanguages(about),
-              this.instanceService.buildTranslatedCategories(about)
-            ]).pipe(map(([ languages, categories ]) => ({ about, languages, categories })))
-          })
-        ).subscribe(
-      async ({ about, languages, categories }) => {
-        this.languages = languages
-        this.categories = categories
-
-        this.shortDescription = about.instance.shortDescription
-
-        this.creationReason = about.instance.creationReason
-        this.maintenanceLifetime = about.instance.maintenanceLifetime
-        this.businessModel = about.instance.businessModel
-
-        this.html = await this.instanceService.buildHtml(about)
-      },
-
-      () => this.notifier.error(this.i18n('Cannot get about information from server'))
-    )
+    const { about, languages, categories }: ResolverData = this.route.snapshot.data.instanceData
+
+    this.languages = languages
+    this.categories = categories
+
+    this.shortDescription = about.instance.shortDescription
+
+    this.creationReason = about.instance.creationReason
+    this.maintenanceLifetime = about.instance.maintenanceLifetime
+    this.businessModel = about.instance.businessModel
+
+    this.html = await this.instanceService.buildHtml(about)
   }
 
   openContactModal () {
diff --git a/client/src/app/+about/about-instance/about-instance.resolver.ts b/client/src/app/+about/about-instance/about-instance.resolver.ts
new file mode 100644 (file)
index 0000000..94c6abe
--- /dev/null
@@ -0,0 +1,27 @@
+import { Injectable } from '@angular/core'
+import { ActivatedRouteSnapshot, Resolve } from '@angular/router'
+import { map, switchMap } from 'rxjs/operators'
+import { forkJoin } from 'rxjs'
+import { InstanceService } from '@app/shared/instance/instance.service'
+import { About } from '@shared/models/server'
+
+export type ResolverData = { about: About, languages: string[], categories: string[] }
+
+@Injectable()
+export class AboutInstanceResolver implements Resolve<any> {
+  constructor (
+    private instanceService: InstanceService
+  ) {}
+
+  resolve (route: ActivatedRouteSnapshot) {
+    return this.instanceService.getAbout()
+               .pipe(
+                 switchMap(about => {
+                   return forkJoin([
+                     this.instanceService.buildTranslatedLanguages(about),
+                     this.instanceService.buildTranslatedCategories(about)
+                   ]).pipe(map(([ languages, categories ]) => ({ about, languages, categories })))
+                 })
+               )
+  }
+}
index 33e5070cb914070c2aed198ed2e0a27521b2fecb..91ccb846f0d87f4416972db5c9675604b1d5fa85 100644 (file)
@@ -5,6 +5,7 @@ import { AboutComponent } from './about.component'
 import { AboutInstanceComponent } from '@app/+about/about-instance/about-instance.component'
 import { AboutPeertubeComponent } from '@app/+about/about-peertube/about-peertube.component'
 import { AboutFollowsComponent } from '@app/+about/about-follows/about-follows.component'
+import { AboutInstanceResolver } from '@app/+about/about-instance/about-instance.resolver'
 
 const aboutRoutes: Routes = [
   {
@@ -24,6 +25,9 @@ const aboutRoutes: Routes = [
           meta: {
             title: 'About this instance'
           }
+        },
+        resolve: {
+          instanceData: AboutInstanceResolver
         }
       },
       {
index 14bf76e55ac86da59720784bf06cf43d9377228c..84d6975402097c5f2e6060bc834eabb74a0c83b1 100644 (file)
@@ -7,6 +7,7 @@ import { AboutPeertubeComponent } from '@app/+about/about-peertube/about-peertub
 import { ContactAdminModalComponent } from '@app/+about/about-instance/contact-admin-modal.component'
 import { AboutFollowsComponent } from '@app/+about/about-follows/about-follows.component'
 import { AboutPeertubeContributorsComponent } from '@app/+about/about-peertube/about-peertube-contributors.component'
+import { AboutInstanceResolver } from '@app/+about/about-instance/about-instance.resolver'
 
 @NgModule({
   imports: [
@@ -28,6 +29,7 @@ import { AboutPeertubeContributorsComponent } from '@app/+about/about-peertube/a
   ],
 
   providers: [
+    AboutInstanceResolver
   ]
 })
 export class AboutModule { }