diff options
-rw-r--r-- | client/src/app/root.component.ts | 14 | ||||
-rw-r--r-- | client/src/app/shared/shared-main/account/actor.service.ts | 22 |
2 files changed, 17 insertions, 19 deletions
diff --git a/client/src/app/root.component.ts b/client/src/app/root.component.ts index ae999e058..5a09e50d1 100644 --- a/client/src/app/root.component.ts +++ b/client/src/app/root.component.ts | |||
@@ -23,19 +23,21 @@ export class RootComponent implements OnInit { | |||
23 | .pipe( | 23 | .pipe( |
24 | map(params => params[ 'actorName' ]), | 24 | map(params => params[ 'actorName' ]), |
25 | distinctUntilChanged(), | 25 | distinctUntilChanged(), |
26 | switchMap(actorName => this.actorService.getActor(actorName)), | 26 | switchMap(actorName => this.actorService.getActorType(actorName)), |
27 | catchError(err => this.restExtractor.redirectTo404IfNotFound(err, 'other', [ | 27 | catchError(err => this.restExtractor.redirectTo404IfNotFound(err, 'other', [ |
28 | HttpStatusCode.BAD_REQUEST_400, | 28 | HttpStatusCode.BAD_REQUEST_400, |
29 | HttpStatusCode.NOT_FOUND_404 | 29 | HttpStatusCode.NOT_FOUND_404 |
30 | ])) | 30 | ])) |
31 | ) | 31 | ) |
32 | .subscribe(actor => { | 32 | .subscribe(actorType => { |
33 | if (/\/accounts\//.test(actor.url)) { | 33 | const actorName = this.route.snapshot.params[ 'actorName' ] |
34 | this.router.navigate([ `/a/${actor.name}` ], { state: { type: 'others', obj: { status: 200 } }, skipLocationChange: true }) | 34 | |
35 | if (actorType === 'Account') { | ||
36 | this.router.navigate([ `/a/${actorName}` ], { state: { type: 'others', obj: { status: 200 } }, skipLocationChange: true }) | ||
35 | } | 37 | } |
36 | 38 | ||
37 | if (/\/video-channels\//.test(actor.url)) { | 39 | if (actorType === 'VideoChannel') { |
38 | this.router.navigate([ `/c/${actor.name}` ], { state: { type: 'others', obj: { status: 200 } }, skipLocationChange: true }) | 40 | this.router.navigate([ `/c/${actorName}` ], { state: { type: 'others', obj: { status: 200 } }, skipLocationChange: true }) |
39 | } | 41 | } |
40 | }) | 42 | }) |
41 | } | 43 | } |
diff --git a/client/src/app/shared/shared-main/account/actor.service.ts b/client/src/app/shared/shared-main/account/actor.service.ts index a789b6f5b..464ed4519 100644 --- a/client/src/app/shared/shared-main/account/actor.service.ts +++ b/client/src/app/shared/shared-main/account/actor.service.ts | |||
@@ -5,34 +5,30 @@ import { Injectable } from '@angular/core' | |||
5 | import { RestExtractor } from '@app/core' | 5 | import { RestExtractor } from '@app/core' |
6 | import { Account as ServerAccount, VideoChannel as ServerVideoChannel } from '@shared/models' | 6 | import { Account as ServerAccount, VideoChannel as ServerVideoChannel } from '@shared/models' |
7 | import { environment } from '../../../../environments/environment' | 7 | import { environment } from '../../../../environments/environment' |
8 | import { Account } from './account.model' | 8 | |
9 | import { VideoChannel } from '../video-channel/video-channel.model' | 9 | type KeysOfUnion<T> = T extends T ? keyof T: never |
10 | type ServerActor = KeysOfUnion<ServerAccount | ServerVideoChannel> | ||
10 | 11 | ||
11 | @Injectable() | 12 | @Injectable() |
12 | export class ActorService { | 13 | export class ActorService { |
13 | static BASE_ACTOR_API_URL = environment.apiUrl + '/api/v1/actors/' | 14 | static BASE_ACTOR_API_URL = environment.apiUrl + '/api/v1/actors/' |
14 | 15 | ||
15 | actorLoaded = new ReplaySubject<Account | VideoChannel>(1) | 16 | actorLoaded = new ReplaySubject<string>(1) |
16 | 17 | ||
17 | constructor ( | 18 | constructor ( |
18 | private authHttp: HttpClient, | 19 | private authHttp: HttpClient, |
19 | private restExtractor: RestExtractor | 20 | private restExtractor: RestExtractor |
20 | ) {} | 21 | ) {} |
21 | 22 | ||
22 | getActor (actorName: string): Observable<Account | VideoChannel> { | 23 | getActorType (actorName: string): Observable<string> { |
23 | return this.authHttp.get<ServerAccount | ServerVideoChannel>(ActorService.BASE_ACTOR_API_URL + actorName) | 24 | return this.authHttp.get<ServerActor>(ActorService.BASE_ACTOR_API_URL + actorName) |
24 | .pipe( | 25 | .pipe( |
25 | map(actorHash => { | 26 | map(actorHash => { |
26 | const isAccount = /\/accounts\/.+/.test(actorHash.url) | 27 | if (actorHash[ 'userId' ]) { |
27 | const isVideoChannel = /\/video-channels\/.+/.test(actorHash.url) | 28 | return 'Account' |
28 | |||
29 | if (isAccount) { | ||
30 | return new Account(actorHash) | ||
31 | } | 29 | } |
32 | 30 | ||
33 | if (isVideoChannel) { | 31 | return 'VideoChannel' |
34 | return new VideoChannel(actorHash) | ||
35 | } | ||
36 | }), | 32 | }), |
37 | tap(actor => this.actorLoaded.next(actor)), | 33 | tap(actor => this.actorLoaded.next(actor)), |
38 | catchError(res => this.restExtractor.handleError(res)) | 34 | catchError(res => this.restExtractor.handleError(res)) |