diff options
Diffstat (limited to 'client/src')
-rw-r--r-- | client/src/app/core/auth/auth-user.model.ts | 2 | ||||
-rw-r--r-- | client/src/app/core/auth/auth.service.ts | 34 | ||||
-rw-r--r-- | client/src/app/videos/video-list/video-list.component.ts | 15 | ||||
-rw-r--r-- | client/src/app/videos/video-watch/video-watch.component.ts | 12 | ||||
-rw-r--r-- | client/src/app/videos/video-watch/webtorrent.service.ts | 12 |
5 files changed, 46 insertions, 29 deletions
diff --git a/client/src/app/core/auth/auth-user.model.ts b/client/src/app/core/auth/auth-user.model.ts index 9cb201907..4155aea19 100644 --- a/client/src/app/core/auth/auth-user.model.ts +++ b/client/src/app/core/auth/auth-user.model.ts | |||
@@ -96,6 +96,7 @@ export class AuthUser extends User { | |||
96 | localStorage.removeItem(this.KEYS.ID) | 96 | localStorage.removeItem(this.KEYS.ID) |
97 | localStorage.removeItem(this.KEYS.ROLE) | 97 | localStorage.removeItem(this.KEYS.ROLE) |
98 | localStorage.removeItem(this.KEYS.DISPLAY_NSFW) | 98 | localStorage.removeItem(this.KEYS.DISPLAY_NSFW) |
99 | localStorage.removeItem(this.KEYS.EMAIL) | ||
99 | Tokens.flush() | 100 | Tokens.flush() |
100 | } | 101 | } |
101 | 102 | ||
@@ -130,6 +131,7 @@ export class AuthUser extends User { | |||
130 | save () { | 131 | save () { |
131 | localStorage.setItem(AuthUser.KEYS.ID, this.id.toString()) | 132 | localStorage.setItem(AuthUser.KEYS.ID, this.id.toString()) |
132 | localStorage.setItem(AuthUser.KEYS.USERNAME, this.username) | 133 | localStorage.setItem(AuthUser.KEYS.USERNAME, this.username) |
134 | localStorage.setItem(AuthUser.KEYS.EMAIL, this.email) | ||
133 | localStorage.setItem(AuthUser.KEYS.ROLE, this.role) | 135 | localStorage.setItem(AuthUser.KEYS.ROLE, this.role) |
134 | localStorage.setItem(AuthUser.KEYS.DISPLAY_NSFW, JSON.stringify(this.displayNSFW)) | 136 | localStorage.setItem(AuthUser.KEYS.DISPLAY_NSFW, JSON.stringify(this.displayNSFW)) |
135 | this.tokens.save() | 137 | this.tokens.save() |
diff --git a/client/src/app/core/auth/auth.service.ts b/client/src/app/core/auth/auth.service.ts index d5aa80512..de9e14b2d 100644 --- a/client/src/app/core/auth/auth.service.ts +++ b/client/src/app/core/auth/auth.service.ts | |||
@@ -11,7 +11,7 @@ import { NotificationsService } from 'angular2-notifications' | |||
11 | 11 | ||
12 | import { AuthStatus } from './auth-status.model' | 12 | import { AuthStatus } from './auth-status.model' |
13 | import { AuthUser } from './auth-user.model' | 13 | import { AuthUser } from './auth-user.model' |
14 | import { OAuthClientLocal } from '../../../../../shared' | 14 | import { OAuthClientLocal, UserRole } from '../../../../../shared' |
15 | // Do not use the barrel (dependency loop) | 15 | // Do not use the barrel (dependency loop) |
16 | import { RestExtractor } from '../../shared/rest' | 16 | import { RestExtractor } from '../../shared/rest' |
17 | 17 | ||
@@ -181,7 +181,10 @@ export class AuthService { | |||
181 | 181 | ||
182 | refreshUserInformations () { | 182 | refreshUserInformations () { |
183 | const obj = { | 183 | const obj = { |
184 | access_token: this.user.getAccessToken() | 184 | access_token: this.user.getAccessToken(), |
185 | refresh_token: null, | ||
186 | token_type: this.user.getTokenType(), | ||
187 | username: this.user.username | ||
185 | } | 188 | } |
186 | 189 | ||
187 | this.mergeUserInformations (obj) | 190 | this.mergeUserInformations (obj) |
@@ -195,7 +198,12 @@ export class AuthService { | |||
195 | ) | 198 | ) |
196 | } | 199 | } |
197 | 200 | ||
198 | private mergeUserInformations (obj: { access_token: string }) { | 201 | private mergeUserInformations (obj: { |
202 | access_token: string, | ||
203 | refresh_token: string, | ||
204 | token_type: string, | ||
205 | username: string | ||
206 | }) { | ||
199 | // Do not call authHttp here to avoid circular dependencies headaches | 207 | // Do not call authHttp here to avoid circular dependencies headaches |
200 | 208 | ||
201 | const headers = new Headers() | 209 | const headers = new Headers() |
@@ -205,9 +213,10 @@ export class AuthService { | |||
205 | .map(res => res.json()) | 213 | .map(res => res.json()) |
206 | .map(res => { | 214 | .map(res => { |
207 | const newProperties = { | 215 | const newProperties = { |
208 | id: res.id, | 216 | id: res.id as number, |
209 | role: res.role, | 217 | role: res.role as UserRole, |
210 | displayNSFW: res.displayNSFW | 218 | displayNSFW: res.displayNSFW as boolean, |
219 | email: res.email as string | ||
211 | } | 220 | } |
212 | 221 | ||
213 | return Object.assign(obj, newProperties) | 222 | return Object.assign(obj, newProperties) |
@@ -215,7 +224,16 @@ export class AuthService { | |||
215 | ) | 224 | ) |
216 | } | 225 | } |
217 | 226 | ||
218 | private handleLogin (obj: any) { | 227 | private handleLogin (obj: { |
228 | access_token: string, | ||
229 | refresh_token: string, | ||
230 | token_type: string, | ||
231 | id: number, | ||
232 | username: string, | ||
233 | email: string, | ||
234 | role: UserRole, | ||
235 | displayNSFW: boolean | ||
236 | }) { | ||
219 | const id = obj.id | 237 | const id = obj.id |
220 | const username = obj.username | 238 | const username = obj.username |
221 | const role = obj.role | 239 | const role = obj.role |
@@ -233,7 +251,7 @@ export class AuthService { | |||
233 | this.setStatus(AuthStatus.LoggedIn) | 251 | this.setStatus(AuthStatus.LoggedIn) |
234 | } | 252 | } |
235 | 253 | ||
236 | private handleRefreshToken (obj: any) { | 254 | private handleRefreshToken (obj: { access_token: string, refresh_token: string }) { |
237 | this.user.refreshTokens(obj.access_token, obj.refresh_token) | 255 | this.user.refreshTokens(obj.access_token, obj.refresh_token) |
238 | this.user.save() | 256 | this.user.save() |
239 | } | 257 | } |
diff --git a/client/src/app/videos/video-list/video-list.component.ts b/client/src/app/videos/video-list/video-list.component.ts index 0c36e5b08..4ac539960 100644 --- a/client/src/app/videos/video-list/video-list.component.ts +++ b/client/src/app/videos/video-list/video-list.component.ts | |||
@@ -1,5 +1,6 @@ | |||
1 | import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core' | 1 | import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core' |
2 | import { ActivatedRoute, Router } from '@angular/router' | 2 | import { ActivatedRoute, Router } from '@angular/router' |
3 | import { Subscription } from 'rxjs/Subscription' | ||
3 | import { BehaviorSubject } from 'rxjs/BehaviorSubject' | 4 | import { BehaviorSubject } from 'rxjs/BehaviorSubject' |
4 | 5 | ||
5 | import { NotificationsService } from 'angular2-notifications' | 6 | import { NotificationsService } from 'angular2-notifications' |
@@ -30,8 +31,8 @@ export class VideoListComponent implements OnInit, OnDestroy { | |||
30 | videos: Video[] = [] | 31 | videos: Video[] = [] |
31 | 32 | ||
32 | private search: Search | 33 | private search: Search |
33 | private subActivatedRoute: any | 34 | private subActivatedRoute: Subscription |
34 | private subSearch: any | 35 | private subSearch: Subscription |
35 | 36 | ||
36 | constructor ( | 37 | constructor ( |
37 | private notificationsService: NotificationsService, | 38 | private notificationsService: NotificationsService, |
@@ -98,7 +99,7 @@ export class VideoListComponent implements OnInit, OnDestroy { | |||
98 | return !this.loading.getValue() && this.videos.length === 0 | 99 | return !this.loading.getValue() && this.videos.length === 0 |
99 | } | 100 | } |
100 | 101 | ||
101 | onPageChanged (event: any) { | 102 | onPageChanged (event: { page: number }) { |
102 | // Be sure the current page is set | 103 | // Be sure the current page is set |
103 | this.pagination.currentPage = event.page | 104 | this.pagination.currentPage = event.page |
104 | 105 | ||
@@ -113,21 +114,21 @@ export class VideoListComponent implements OnInit, OnDestroy { | |||
113 | 114 | ||
114 | private buildRouteParams () { | 115 | private buildRouteParams () { |
115 | // There is always a sort and a current page | 116 | // There is always a sort and a current page |
116 | const params: any = { | 117 | const params = { |
117 | sort: this.sort, | 118 | sort: this.sort, |
118 | page: this.pagination.currentPage | 119 | page: this.pagination.currentPage |
119 | } | 120 | } |
120 | 121 | ||
121 | // Maybe there is a search | 122 | // Maybe there is a search |
122 | if (this.search.value) { | 123 | if (this.search.value) { |
123 | params.field = this.search.field | 124 | params['field'] = this.search.field |
124 | params.search = this.search.value | 125 | params['search'] = this.search.value |
125 | } | 126 | } |
126 | 127 | ||
127 | return params | 128 | return params |
128 | } | 129 | } |
129 | 130 | ||
130 | private loadRouteParams (routeParams) { | 131 | private loadRouteParams (routeParams: { [ key: string ]: any }) { |
131 | if (routeParams['search'] !== undefined) { | 132 | if (routeParams['search'] !== undefined) { |
132 | this.search = { | 133 | this.search = { |
133 | value: routeParams['search'], | 134 | value: routeParams['search'], |
diff --git a/client/src/app/videos/video-watch/video-watch.component.ts b/client/src/app/videos/video-watch/video-watch.component.ts index 12ddf3eef..6bd6c1f7e 100644 --- a/client/src/app/videos/video-watch/video-watch.component.ts +++ b/client/src/app/videos/video-watch/video-watch.component.ts | |||
@@ -32,7 +32,7 @@ export class VideoWatchComponent implements OnInit, OnDestroy { | |||
32 | loading = false | 32 | loading = false |
33 | numPeers: number | 33 | numPeers: number |
34 | player: videojs.Player | 34 | player: videojs.Player |
35 | playerElement: Element | 35 | playerElement: HTMLMediaElement |
36 | uploadSpeed: number | 36 | uploadSpeed: number |
37 | userRating: UserVideoRateType = null | 37 | userRating: UserVideoRateType = null |
38 | video: Video = null | 38 | video: Video = null |
@@ -41,7 +41,6 @@ export class VideoWatchComponent implements OnInit, OnDestroy { | |||
41 | private errorTimer: number | 41 | private errorTimer: number |
42 | private paramsSub: Subscription | 42 | private paramsSub: Subscription |
43 | private errorsSub: Subscription | 43 | private errorsSub: Subscription |
44 | private warningsSub: Subscription | ||
45 | private torrentInfosInterval: number | 44 | private torrentInfosInterval: number |
46 | 45 | ||
47 | constructor ( | 46 | constructor ( |
@@ -82,8 +81,10 @@ export class VideoWatchComponent implements OnInit, OnDestroy { | |||
82 | self.player = this | 81 | self.player = this |
83 | }) | 82 | }) |
84 | 83 | ||
85 | this.errorsSub = this.webTorrentService.errors.subscribe(err => this.notificationsService.error('Error', err.message)) | 84 | this.errorsSub = this.webTorrentService.errors.subscribe(err => { |
86 | this.warningsSub = this.webTorrentService.errors.subscribe(err => this.notificationsService.alert('Warning', err.message)) | 85 | const message = typeof err === 'string' ? err : err.message |
86 | this.notificationsService.error('Error', message) | ||
87 | }) | ||
87 | } | 88 | } |
88 | 89 | ||
89 | ngOnDestroy () { | 90 | ngOnDestroy () { |
@@ -102,7 +103,6 @@ export class VideoWatchComponent implements OnInit, OnDestroy { | |||
102 | // Unsubscribe subscriptions | 103 | // Unsubscribe subscriptions |
103 | this.paramsSub.unsubscribe() | 104 | this.paramsSub.unsubscribe() |
104 | this.errorsSub.unsubscribe() | 105 | this.errorsSub.unsubscribe() |
105 | this.warningsSub.unsubscribe() | ||
106 | } | 106 | } |
107 | 107 | ||
108 | loadVideo () { | 108 | loadVideo () { |
@@ -117,7 +117,7 @@ export class VideoWatchComponent implements OnInit, OnDestroy { | |||
117 | // So we create a timer to inform the user the load is abnormally long | 117 | // So we create a timer to inform the user the load is abnormally long |
118 | this.errorTimer = window.setTimeout(() => this.loadTooLong(), VideoWatchComponent.LOADTIME_TOO_LONG) | 118 | this.errorTimer = window.setTimeout(() => this.loadTooLong(), VideoWatchComponent.LOADTIME_TOO_LONG) |
119 | 119 | ||
120 | this.webTorrentService.add(this.video.magnetUri, (torrent) => { | 120 | this.webTorrentService.add(this.video.magnetUri, torrent => { |
121 | // Clear the error timer | 121 | // Clear the error timer |
122 | window.clearTimeout(this.errorTimer) | 122 | window.clearTimeout(this.errorTimer) |
123 | // Maybe the error was fired by the timer, so reset it | 123 | // Maybe the error was fired by the timer, so reset it |
diff --git a/client/src/app/videos/video-watch/webtorrent.service.ts b/client/src/app/videos/video-watch/webtorrent.service.ts index 211894bfd..8819e17d4 100644 --- a/client/src/app/videos/video-watch/webtorrent.service.ts +++ b/client/src/app/videos/video-watch/webtorrent.service.ts | |||
@@ -5,21 +5,17 @@ import * as WebTorrent from 'webtorrent' | |||
5 | 5 | ||
6 | @Injectable() | 6 | @Injectable() |
7 | export class WebTorrentService { | 7 | export class WebTorrentService { |
8 | errors = new Subject<Error>() | 8 | errors = new Subject<string | Error>() |
9 | warnings = new Subject<Error>() | ||
10 | 9 | ||
11 | // TODO: use WebTorrent @type | 10 | private client: WebTorrent.Instance |
12 | // private client: WebTorrent.Client | ||
13 | private client: any | ||
14 | 11 | ||
15 | constructor () { | 12 | constructor () { |
16 | this.client = new WebTorrent({ dht: false }) | 13 | this.client = new WebTorrent({ dht: false }) |
17 | 14 | ||
18 | this.client.on('error', (err) => this.errors.next(err)) | 15 | this.client.on('error', err => this.errors.next(err)) |
19 | this.client.on('warning', (err) => this.warnings.next(err)) | ||
20 | } | 16 | } |
21 | 17 | ||
22 | add (magnetUri: string, callback: Function) { | 18 | add (magnetUri: string, callback: (torrent: WebTorrent.Torrent) => any) { |
23 | return this.client.add(magnetUri, callback) | 19 | return this.client.add(magnetUri, callback) |
24 | } | 20 | } |
25 | 21 | ||