5b6961e985e6e6588904a85378b6f0e28867a2f9
[oweals/peertube.git] / client / src / app / search / channel-lazy-load.resolver.ts
1 import { map } from 'rxjs/operators'
2 import { Injectable } from '@angular/core'
3 import { ActivatedRouteSnapshot, Resolve, Router } from '@angular/router'
4 import { SearchService } from './search.service'
5
6 @Injectable()
7 export class ChannelLazyLoadResolver implements Resolve<any> {
8   constructor (
9     private router: Router,
10     private searchService: SearchService
11   ) { }
12
13   resolve (route: ActivatedRouteSnapshot) {
14     const url = route.params.url
15     const externalRedirect = route.params.externalRedirect
16     const fromPath = route.params.fromPath
17
18     if (!url) {
19       console.error('Could not find url param.', { params: route.params })
20       return this.router.navigateByUrl('/404')
21     }
22
23     if (externalRedirect === 'true') {
24       window.open(url)
25       this.router.navigateByUrl(fromPath)
26       return
27     }
28
29     return this.searchService.searchVideoChannels({ search: url })
30       .pipe(
31         map(result => {
32           if (result.data.length !== 1) {
33             console.error('Cannot find result for this URL')
34             return this.router.navigateByUrl('/404')
35           }
36
37           const channel = result.data[0]
38
39           return this.router.navigateByUrl('/video-channels/' + channel.nameWithHost)
40         })
41       )
42   }
43 }