aboutsummaryrefslogtreecommitdiffhomepage
path: root/client
diff options
context:
space:
mode:
Diffstat (limited to 'client')
-rw-r--r--client/app/app.component.ts21
-rw-r--r--client/app/friends/friend.service.ts12
-rw-r--r--client/app/shared/search.component.ts9
-rw-r--r--client/app/users/login/login.component.ts8
-rw-r--r--client/app/users/shared/auth.service.ts41
-rw-r--r--client/app/users/shared/token.model.ts7
-rw-r--r--client/app/users/shared/user.model.ts6
-rw-r--r--client/app/videos/shared/video.model.ts6
-rw-r--r--client/app/videos/shared/video.service.ts18
-rw-r--r--client/app/videos/video-add/video-add.component.ts2
-rw-r--r--client/app/videos/video-list/video-list.component.ts26
-rw-r--r--client/app/videos/video-list/video-miniature.component.ts8
-rw-r--r--client/app/videos/video-list/video-sort.component.ts2
-rw-r--r--client/app/videos/video-watch/video-watch.component.ts20
-rw-r--r--client/tslint.json19
15 files changed, 112 insertions, 93 deletions
diff --git a/client/app/app.component.ts b/client/app/app.component.ts
index c94ff79a7..20c8c8724 100644
--- a/client/app/app.component.ts
+++ b/client/app/app.component.ts
@@ -51,16 +51,15 @@ import {
51export class AppComponent { 51export class AppComponent {
52 isLoggedIn: boolean; 52 isLoggedIn: boolean;
53 search_field: string = name; 53 search_field: string = name;
54 choices = [ ]; 54 choices = [];
55
56 constructor(private _friendService: FriendService,
57 private _authService: AuthService,
58 private _router: Router
59 55
56 constructor(private friendService: FriendService,
57 private authService: AuthService,
58 private router: Router
60 ) { 59 ) {
61 this.isLoggedIn = this._authService.isLoggedIn(); 60 this.isLoggedIn = this.authService.isLoggedIn();
62 61
63 this._authService.loginChanged$.subscribe( 62 this.authService.loginChangedSource.subscribe(
64 status => { 63 status => {
65 if (status === AuthStatus.LoggedIn) { 64 if (status === AuthStatus.LoggedIn) {
66 this.isLoggedIn = true; 65 this.isLoggedIn = true;
@@ -75,9 +74,9 @@ export class AppComponent {
75 search: search.value, 74 search: search.value,
76 field: search.field 75 field: search.field
77 }; 76 };
78 this._router.navigate(['VideosList', params]); 77 this.router.navigate(['VideosList', params]);
79 } else { 78 } else {
80 this._router.navigate(['VideosList']); 79 this.router.navigate(['VideosList']);
81 } 80 }
82 } 81 }
83 82
@@ -86,7 +85,7 @@ export class AppComponent {
86 } 85 }
87 86
88 makeFriends() { 87 makeFriends() {
89 this._friendService.makeFriends().subscribe( 88 this.friendService.makeFriends().subscribe(
90 status => { 89 status => {
91 if (status === 409) { 90 if (status === 409) {
92 alert('Already made friends!'); 91 alert('Already made friends!');
@@ -99,7 +98,7 @@ export class AppComponent {
99 } 98 }
100 99
101 quitFriends() { 100 quitFriends() {
102 this._friendService.quitFriends().subscribe( 101 this.friendService.quitFriends().subscribe(
103 status => { 102 status => {
104 alert('Quit friends!'); 103 alert('Quit friends!');
105 }, 104 },
diff --git a/client/app/friends/friend.service.ts b/client/app/friends/friend.service.ts
index d143ec40d..bdfa7baec 100644
--- a/client/app/friends/friend.service.ts
+++ b/client/app/friends/friend.service.ts
@@ -4,23 +4,23 @@ import { Observable } from 'rxjs/Rx';
4 4
5@Injectable() 5@Injectable()
6export class FriendService { 6export class FriendService {
7 private _baseFriendsUrl = '/api/v1/pods/'; 7 private static BASE_FRIEND_URL: string = '/api/v1/pods/';
8 8
9 constructor (private http: Http) {} 9 constructor (private http: Http) {}
10 10
11 makeFriends() { 11 makeFriends() {
12 return this.http.get(this._baseFriendsUrl + 'makefriends') 12 return this.http.get(FriendService.BASE_FRIEND_URL + 'makefriends')
13 .map(res => <number> res.status) 13 .map(res => res.status)
14 .catch(this.handleError); 14 .catch(this.handleError);
15 } 15 }
16 16
17 quitFriends() { 17 quitFriends() {
18 return this.http.get(this._baseFriendsUrl + 'quitfriends') 18 return this.http.get(FriendService.BASE_FRIEND_URL + 'quitfriends')
19 .map(res => <number> res.status) 19 .map(res => res.status)
20 .catch(this.handleError); 20 .catch(this.handleError);
21 } 21 }
22 22
23 private handleError (error: Response) { 23 private handleError (error: Response): Observable<number> {
24 console.error(error); 24 console.error(error);
25 return Observable.throw(error.json().error || 'Server error'); 25 return Observable.throw(error.json().error || 'Server error');
26 } 26 }
diff --git a/client/app/shared/search.component.ts b/client/app/shared/search.component.ts
index 519810f9b..674518aba 100644
--- a/client/app/shared/search.component.ts
+++ b/client/app/shared/search.component.ts
@@ -12,12 +12,13 @@ import { SearchField } from './search-field.type';
12}) 12})
13 13
14export class SearchComponent { 14export class SearchComponent {
15 @Output() search: EventEmitter<Search> = new EventEmitter<Search>(); 15 @Output() search = new EventEmitter<Search>();
16 16
17 searchCriterias: Search = { 17 searchCriterias: Search = {
18 field: 'name', 18 field: 'name',
19 value: '' 19 value: ''
20 }; 20 };
21
21 fieldChoices = { 22 fieldChoices = {
22 name: 'Name', 23 name: 'Name',
23 author: 'Author', 24 author: 'Author',
@@ -29,18 +30,18 @@ export class SearchComponent {
29 return Object.keys(this.fieldChoices); 30 return Object.keys(this.fieldChoices);
30 } 31 }
31 32
32 getStringChoice(choiceKey: SearchField): string { 33 getStringChoice(choiceKey: SearchField) {
33 return this.fieldChoices[choiceKey]; 34 return this.fieldChoices[choiceKey];
34 } 35 }
35 36
36 choose($event:MouseEvent, choice: SearchField) { 37 choose($event: MouseEvent, choice: SearchField) {
37 $event.preventDefault(); 38 $event.preventDefault();
38 $event.stopPropagation(); 39 $event.stopPropagation();
39 40
40 this.searchCriterias.field = choice; 41 this.searchCriterias.field = choice;
41 } 42 }
42 43
43 doSearch(): void { 44 doSearch() {
44 this.search.emit(this.searchCriterias); 45 this.search.emit(this.searchCriterias);
45 } 46 }
46 47
diff --git a/client/app/users/login/login.component.ts b/client/app/users/login/login.component.ts
index 33590ad4c..8e369541d 100644
--- a/client/app/users/login/login.component.ts
+++ b/client/app/users/login/login.component.ts
@@ -10,17 +10,17 @@ import { AuthService, AuthStatus, User } from '../shared/index';
10}) 10})
11 11
12export class UserLoginComponent { 12export class UserLoginComponent {
13 constructor(private _authService: AuthService, private _router: Router) {} 13 constructor(private authService: AuthService, private router: Router) {}
14 14
15 login(username: string, password: string) { 15 login(username: string, password: string) {
16 this._authService.login(username, password).subscribe( 16 this.authService.login(username, password).subscribe(
17 result => { 17 result => {
18 const user = new User(username, result); 18 const user = new User(username, result);
19 user.save(); 19 user.save();
20 20
21 this._authService.setStatus(AuthStatus.LoggedIn); 21 this.authService.setStatus(AuthStatus.LoggedIn);
22 22
23 this._router.navigate(['VideosList']); 23 this.router.navigate(['VideosList']);
24 }, 24 },
25 error => { 25 error => {
26 if (error.error === 'invalid_grant') { 26 if (error.error === 'invalid_grant') {
diff --git a/client/app/users/shared/auth.service.ts b/client/app/users/shared/auth.service.ts
index 1cb042db5..b1da94436 100644
--- a/client/app/users/shared/auth.service.ts
+++ b/client/app/users/shared/auth.service.ts
@@ -7,27 +7,28 @@ import { User } from './user.model';
7 7
8@Injectable() 8@Injectable()
9export class AuthService { 9export class AuthService {
10 loginChanged$; 10 private static BASE_LOGIN_URL = '/api/v1/users/token';
11 private static BASE_CLIENT_URL = '/api/v1/users/client';
11 12
12 private _loginChanged; 13 loginChangedSource: Observable<AuthStatus>;
13 private _baseLoginUrl = '/api/v1/users/token';
14 private _baseClientUrl = '/api/v1/users/client';
15 private _clientId = '';
16 private _clientSecret = '';
17 14
18 constructor (private http: Http) { 15 private loginChanged: Subject<AuthStatus>;
19 this._loginChanged = new Subject<AuthStatus>(); 16 private clientId: string;
20 this.loginChanged$ = this._loginChanged.asObservable(); 17 private clientSecret: string;
18
19 constructor(private http: Http) {
20 this.loginChanged = new Subject<AuthStatus>();
21 this.loginChangedSource = this.loginChanged.asObservable();
21 22
22 // Fetch the client_id/client_secret 23 // Fetch the client_id/client_secret
23 // FIXME: save in local storage? 24 // FIXME: save in local storage?
24 this.http.get(this._baseClientUrl) 25 this.http.get(AuthService.BASE_CLIENT_URL)
25 .map(res => res.json()) 26 .map(res => res.json())
26 .catch(this.handleError) 27 .catch(this.handleError)
27 .subscribe( 28 .subscribe(
28 result => { 29 result => {
29 this._clientId = result.client_id; 30 this.clientId = result.client_id;
30 this._clientSecret = result.client_secret; 31 this.clientSecret = result.client_secret;
31 console.log('Client credentials loaded.'); 32 console.log('Client credentials loaded.');
32 }, 33 },
33 error => { 34 error => {
@@ -38,8 +39,8 @@ export class AuthService {
38 39
39 login(username: string, password: string) { 40 login(username: string, password: string) {
40 let body = new URLSearchParams(); 41 let body = new URLSearchParams();
41 body.set('client_id', this._clientId); 42 body.set('client_id', this.clientId);
42 body.set('client_secret', this._clientSecret); 43 body.set('client_secret', this.clientSecret);
43 body.set('response_type', 'code'); 44 body.set('response_type', 'code');
44 body.set('grant_type', 'password'); 45 body.set('grant_type', 'password');
45 body.set('scope', 'upload'); 46 body.set('scope', 'upload');
@@ -53,7 +54,7 @@ export class AuthService {
53 headers: headers 54 headers: headers
54 }; 55 };
55 56
56 return this.http.post(this._baseLoginUrl, body.toString(), options) 57 return this.http.post(AuthService.BASE_LOGIN_URL, body.toString(), options)
57 .map(res => res.json()) 58 .map(res => res.json())
58 .catch(this.handleError); 59 .catch(this.handleError);
59 } 60 }
@@ -62,7 +63,7 @@ export class AuthService {
62 // TODO make HTTP request 63 // TODO make HTTP request
63 } 64 }
64 65
65 getRequestHeader(): Headers { 66 getRequestHeader() {
66 return new Headers({ 'Authorization': `${this.getTokenType()} ${this.getToken()}` }); 67 return new Headers({ 'Authorization': `${this.getTokenType()} ${this.getToken()}` });
67 } 68 }
68 69
@@ -70,11 +71,11 @@ export class AuthService {
70 return new RequestOptions({ headers: this.getRequestHeader() }); 71 return new RequestOptions({ headers: this.getRequestHeader() });
71 } 72 }
72 73
73 getToken(): string { 74 getToken() {
74 return localStorage.getItem('access_token'); 75 return localStorage.getItem('access_token');
75 } 76 }
76 77
77 getTokenType(): string { 78 getTokenType() {
78 return localStorage.getItem('token_type'); 79 return localStorage.getItem('token_type');
79 } 80 }
80 81
@@ -88,7 +89,7 @@ export class AuthService {
88 return user; 89 return user;
89 } 90 }
90 91
91 isLoggedIn(): boolean { 92 isLoggedIn() {
92 if (this.getToken()) { 93 if (this.getToken()) {
93 return true; 94 return true;
94 } else { 95 } else {
@@ -97,7 +98,7 @@ export class AuthService {
97 } 98 }
98 99
99 setStatus(status: AuthStatus) { 100 setStatus(status: AuthStatus) {
100 this._loginChanged.next(status); 101 this.loginChanged.next(status);
101 } 102 }
102 103
103 private handleError (error: Response) { 104 private handleError (error: Response) {
diff --git a/client/app/users/shared/token.model.ts b/client/app/users/shared/token.model.ts
index b7872e74a..021c83fad 100644
--- a/client/app/users/shared/token.model.ts
+++ b/client/app/users/shared/token.model.ts
@@ -3,7 +3,7 @@ export class Token {
3 refresh_token: string; 3 refresh_token: string;
4 token_type: string; 4 token_type: string;
5 5
6 static load(): Token { 6 static load() {
7 return new Token({ 7 return new Token({
8 access_token: localStorage.getItem('access_token'), 8 access_token: localStorage.getItem('access_token'),
9 refresh_token: localStorage.getItem('refresh_token'), 9 refresh_token: localStorage.getItem('refresh_token'),
@@ -11,10 +11,11 @@ export class Token {
11 }); 11 });
12 } 12 }
13 13
14 constructor (hash?: any) { 14 constructor(hash?: any) {
15 if (hash) { 15 if (hash) {
16 this.access_token = hash.access_token; 16 this.access_token = hash.access_token;
17 this.refresh_token = hash.refresh_token; 17 this.refresh_token = hash.refresh_token;
18
18 if (hash.token_type === 'bearer') { 19 if (hash.token_type === 'bearer') {
19 this.token_type = 'Bearer'; 20 this.token_type = 'Bearer';
20 } else { 21 } else {
@@ -23,7 +24,7 @@ export class Token {
23 } 24 }
24 } 25 }
25 26
26 save():void { 27 save() {
27 localStorage.setItem('access_token', this.access_token); 28 localStorage.setItem('access_token', this.access_token);
28 localStorage.setItem('refresh_token', this.refresh_token); 29 localStorage.setItem('refresh_token', this.refresh_token);
29 localStorage.setItem('token_type', this.token_type); 30 localStorage.setItem('token_type', this.token_type);
diff --git a/client/app/users/shared/user.model.ts b/client/app/users/shared/user.model.ts
index 73fd4ddc0..ca0a5f26c 100644
--- a/client/app/users/shared/user.model.ts
+++ b/client/app/users/shared/user.model.ts
@@ -4,16 +4,16 @@ export class User {
4 username: string; 4 username: string;
5 token: Token; 5 token: Token;
6 6
7 static load(): User { 7 static load() {
8 return new User(localStorage.getItem('username'), Token.load()); 8 return new User(localStorage.getItem('username'), Token.load());
9 } 9 }
10 10
11 constructor (username: string, hash_token: any) { 11 constructor(username: string, hash_token: any) {
12 this.username = username; 12 this.username = username;
13 this.token = new Token(hash_token); 13 this.token = new Token(hash_token);
14 } 14 }
15 15
16 save(): void { 16 save() {
17 localStorage.setItem('username', this.username); 17 localStorage.setItem('username', this.username);
18 this.token.save(); 18 this.token.save();
19 } 19 }
diff --git a/client/app/videos/shared/video.model.ts b/client/app/videos/shared/video.model.ts
index eec537c9e..2b018ad86 100644
--- a/client/app/videos/shared/video.model.ts
+++ b/client/app/videos/shared/video.model.ts
@@ -11,7 +11,7 @@ export class Video {
11 by: string; 11 by: string;
12 duration: string; 12 duration: string;
13 13
14 private static createDurationString(duration: number): string { 14 private static createDurationString(duration: number) {
15 const minutes = Math.floor(duration / 60); 15 const minutes = Math.floor(duration / 60);
16 const seconds = duration % 60; 16 const seconds = duration % 60;
17 const minutes_padding = minutes >= 10 ? '' : '0'; 17 const minutes_padding = minutes >= 10 ? '' : '0';
@@ -20,7 +20,7 @@ export class Video {
20 return minutes_padding + minutes.toString() + ':' + seconds_padding + seconds.toString(); 20 return minutes_padding + minutes.toString() + ':' + seconds_padding + seconds.toString();
21 } 21 }
22 22
23 private static createByString(author: string, podUrl: string): string { 23 private static createByString(author: string, podUrl: string) {
24 let [ host, port ] = podUrl.replace(/^https?:\/\//, '').split(':'); 24 let [ host, port ] = podUrl.replace(/^https?:\/\//, '').split(':');
25 25
26 if (port === '80' || port === '443') { 26 if (port === '80' || port === '443') {
@@ -57,7 +57,7 @@ export class Video {
57 this.by = Video.createByString(hash.author, hash.podUrl); 57 this.by = Video.createByString(hash.author, hash.podUrl);
58 } 58 }
59 59
60 isRemovableBy(user): boolean { 60 isRemovableBy(user) {
61 return this.isLocal === true && user && this.author === user.username; 61 return this.isLocal === true && user && this.author === user.username;
62 } 62 }
63} 63}
diff --git a/client/app/videos/shared/video.service.ts b/client/app/videos/shared/video.service.ts
index 78789c3cc..b6e0800a0 100644
--- a/client/app/videos/shared/video.service.ts
+++ b/client/app/videos/shared/video.service.ts
@@ -10,30 +10,30 @@ import { Video } from './video.model';
10 10
11@Injectable() 11@Injectable()
12export class VideoService { 12export class VideoService {
13 private _baseVideoUrl = '/api/v1/videos/'; 13 private static BASE_VIDEO_URL = '/api/v1/videos/';
14 14
15 constructor (private http: Http, private _authService: AuthService) {} 15 constructor(private http: Http, private authService: AuthService) {}
16 16
17 getVideos(pagination: Pagination, sort: SortField) { 17 getVideos(pagination: Pagination, sort: SortField) {
18 const params = this.createPaginationParams(pagination); 18 const params = this.createPaginationParams(pagination);
19 19
20 if (sort) params.set('sort', sort); 20 if (sort) params.set('sort', sort);
21 21
22 return this.http.get(this._baseVideoUrl, { search: params }) 22 return this.http.get(VideoService.BASE_VIDEO_URL, { search: params })
23 .map(res => res.json()) 23 .map(res => res.json())
24 .map(this.extractVideos) 24 .map(this.extractVideos)
25 .catch(this.handleError); 25 .catch(this.handleError);
26 } 26 }
27 27
28 getVideo(id: string) { 28 getVideo(id: string) {
29 return this.http.get(this._baseVideoUrl + id) 29 return this.http.get(VideoService.BASE_VIDEO_URL + id)
30 .map(res => <Video> res.json()) 30 .map(res => <Video> res.json())
31 .catch(this.handleError); 31 .catch(this.handleError);
32 } 32 }
33 33
34 removeVideo(id: string) { 34 removeVideo(id: string) {
35 const options = this._authService.getAuthRequestOptions(); 35 const options = this.authService.getAuthRequestOptions();
36 return this.http.delete(this._baseVideoUrl + id, options) 36 return this.http.delete(VideoService.BASE_VIDEO_URL + id, options)
37 .map(res => <number> res.status) 37 .map(res => <number> res.status)
38 .catch(this.handleError); 38 .catch(this.handleError);
39 } 39 }
@@ -44,13 +44,13 @@ export class VideoService {
44 if (search.field) params.set('field', search.field); 44 if (search.field) params.set('field', search.field);
45 if (sort) params.set('sort', sort); 45 if (sort) params.set('sort', sort);
46 46
47 return this.http.get(this._baseVideoUrl + 'search/' + encodeURIComponent(search.value), { search: params }) 47 return this.http.get(VideoService.BASE_VIDEO_URL + 'search/' + encodeURIComponent(search.value), { search: params })
48 .map(res => res.json()) 48 .map(res => res.json())
49 .map(this.extractVideos) 49 .map(this.extractVideos)
50 .catch(this.handleError); 50 .catch(this.handleError);
51 } 51 }
52 52
53 private extractVideos (body: any) { 53 private extractVideos(body: any) {
54 const videos_json = body.data; 54 const videos_json = body.data;
55 const totalVideos = body.total; 55 const totalVideos = body.total;
56 const videos = []; 56 const videos = [];
@@ -61,7 +61,7 @@ export class VideoService {
61 return { videos, totalVideos }; 61 return { videos, totalVideos };
62 } 62 }
63 63
64 private handleError (error: Response) { 64 private handleError(error: Response) {
65 console.error(error); 65 console.error(error);
66 return Observable.throw(error.json().error || 'Server error'); 66 return Observable.throw(error.json().error || 'Server error');
67 } 67 }
diff --git a/client/app/videos/video-add/video-add.component.ts b/client/app/videos/video-add/video-add.component.ts
index ca583a103..67a04a2b4 100644
--- a/client/app/videos/video-add/video-add.component.ts
+++ b/client/app/videos/video-add/video-add.component.ts
@@ -7,7 +7,7 @@ import { PROGRESSBAR_DIRECTIVES } from 'ng2-bootstrap/components/progressbar';
7import { AuthService, User } from '../../users/index'; 7import { AuthService, User } from '../../users/index';
8 8
9// TODO: import it with systemjs 9// TODO: import it with systemjs
10declare var jQuery:any; 10declare var jQuery: any;
11 11
12@Component({ 12@Component({
13 selector: 'my-videos-add', 13 selector: 'my-videos-add',
diff --git a/client/app/videos/video-list/video-list.component.ts b/client/app/videos/video-list/video-list.component.ts
index a88fb379a..3f54c98ce 100644
--- a/client/app/videos/video-list/video-list.component.ts
+++ b/client/app/videos/video-list/video-list.component.ts
@@ -31,26 +31,26 @@ export class VideoListComponent implements OnInit {
31 total: 0 31 total: 0
32 }; 32 };
33 sort: SortField; 33 sort: SortField;
34 loading: boolean = false; 34 loading = false;
35 35
36 private search: Search; 36 private search: Search;
37 37
38 constructor( 38 constructor(
39 private _authService: AuthService, 39 private authService: AuthService,
40 private _videoService: VideoService, 40 private videoService: VideoService,
41 private _routeParams: RouteParams, 41 private routeParams: RouteParams,
42 private _router: Router 42 private router: Router
43 ) { 43 ) {
44 this.search = { 44 this.search = {
45 value: this._routeParams.get('search'), 45 value: this.routeParams.get('search'),
46 field: <SearchField>this._routeParams.get('field') 46 field: <SearchField>this.routeParams.get('field')
47 }; 47 };
48 48
49 this.sort = <SortField>this._routeParams.get('sort') || '-createdDate'; 49 this.sort = <SortField>this.routeParams.get('sort') || '-createdDate';
50 } 50 }
51 51
52 ngOnInit() { 52 ngOnInit() {
53 if (this._authService.isLoggedIn()) { 53 if (this.authService.isLoggedIn()) {
54 this.user = User.load(); 54 this.user = User.load();
55 } 55 }
56 56
@@ -64,9 +64,9 @@ export class VideoListComponent implements OnInit {
64 let observable = null; 64 let observable = null;
65 65
66 if (this.search.value !== null) { 66 if (this.search.value !== null) {
67 observable = this._videoService.searchVideos(this.search, this.pagination, this.sort); 67 observable = this.videoService.searchVideos(this.search, this.pagination, this.sort);
68 } else { 68 } else {
69 observable = this._videoService.getVideos(this.pagination, this.sort); 69 observable = this.videoService.getVideos(this.pagination, this.sort);
70 } 70 }
71 71
72 observable.subscribe( 72 observable.subscribe(
@@ -79,7 +79,7 @@ export class VideoListComponent implements OnInit {
79 ); 79 );
80 } 80 }
81 81
82 onRemoved(video: Video): void { 82 onRemoved(video: Video) {
83 this.videos.splice(this.videos.indexOf(video), 1); 83 this.videos.splice(this.videos.indexOf(video), 1);
84 } 84 }
85 85
@@ -95,7 +95,7 @@ export class VideoListComponent implements OnInit {
95 params.field = this.search.field; 95 params.field = this.search.field;
96 } 96 }
97 97
98 this._router.navigate(['VideosList', params]); 98 this.router.navigate(['VideosList', params]);
99 this.getVideos(); 99 this.getVideos();
100 } 100 }
101} 101}
diff --git a/client/app/videos/video-list/video-miniature.component.ts b/client/app/videos/video-list/video-miniature.component.ts
index 817636768..73416607a 100644
--- a/client/app/videos/video-list/video-miniature.component.ts
+++ b/client/app/videos/video-list/video-miniature.component.ts
@@ -19,9 +19,9 @@ export class VideoMiniatureComponent {
19 @Input() video: Video; 19 @Input() video: Video;
20 @Input() user: User; 20 @Input() user: User;
21 21
22 hovering: boolean = false; 22 hovering = false;
23 23
24 constructor(private _videoService: VideoService) {} 24 constructor(private videoService: VideoService) {}
25 25
26 onHover() { 26 onHover() {
27 this.hovering = true; 27 this.hovering = true;
@@ -31,13 +31,13 @@ export class VideoMiniatureComponent {
31 this.hovering = false; 31 this.hovering = false;
32 } 32 }
33 33
34 displayRemoveIcon(): boolean { 34 displayRemoveIcon() {
35 return this.hovering && this.video.isRemovableBy(this.user); 35 return this.hovering && this.video.isRemovableBy(this.user);
36 } 36 }
37 37
38 removeVideo(id: string) { 38 removeVideo(id: string) {
39 if (confirm('Do you really want to remove this video?')) { 39 if (confirm('Do you really want to remove this video?')) {
40 this._videoService.removeVideo(id).subscribe( 40 this.videoService.removeVideo(id).subscribe(
41 status => this.removed.emit(true), 41 status => this.removed.emit(true),
42 error => alert(error) 42 error => alert(error)
43 ); 43 );
diff --git a/client/app/videos/video-list/video-sort.component.ts b/client/app/videos/video-list/video-sort.component.ts
index d00d7ed49..ed06c7510 100644
--- a/client/app/videos/video-list/video-sort.component.ts
+++ b/client/app/videos/video-list/video-sort.component.ts
@@ -26,7 +26,7 @@ export class VideoSortComponent {
26 return Object.keys(this.sortChoices); 26 return Object.keys(this.sortChoices);
27 } 27 }
28 28
29 getStringChoice(choiceKey: SortField): string { 29 getStringChoice(choiceKey: SortField) {
30 return this.sortChoices[choiceKey]; 30 return this.sortChoices[choiceKey];
31 } 31 }
32 32
diff --git a/client/app/videos/video-watch/video-watch.component.ts b/client/app/videos/video-watch/video-watch.component.ts
index 891e6563f..c159b4004 100644
--- a/client/app/videos/video-watch/video-watch.component.ts
+++ b/client/app/videos/video-watch/video-watch.component.ts
@@ -23,21 +23,21 @@ export class VideoWatchComponent implements OnInit, CanDeactivate {
23 numPeers: number; 23 numPeers: number;
24 loading: boolean = false; 24 loading: boolean = false;
25 25
26 private _interval: NodeJS.Timer; 26 private interval: NodeJS.Timer;
27 private client: any; 27 private client: any;
28 28
29 constructor( 29 constructor(
30 private _videoService: VideoService, 30 private videoService: VideoService,
31 private _routeParams: RouteParams, 31 private routeParams: RouteParams,
32 private _elementRef: ElementRef 32 private elementRef: ElementRef
33 ) { 33 ) {
34 // TODO: use a service 34 // TODO: use a service
35 this.client = new WebTorrent({ dht: false }); 35 this.client = new WebTorrent({ dht: false });
36 } 36 }
37 37
38 ngOnInit() { 38 ngOnInit() {
39 let id = this._routeParams.get('id'); 39 let id = this.routeParams.get('id');
40 this._videoService.getVideo(id).subscribe( 40 this.videoService.getVideo(id).subscribe(
41 video => this.loadVideo(video), 41 video => this.loadVideo(video),
42 error => alert(error) 42 error => alert(error)
43 ); 43 );
@@ -50,7 +50,7 @@ export class VideoWatchComponent implements OnInit, CanDeactivate {
50 this.client.add(this.video.magnetUri, (torrent) => { 50 this.client.add(this.video.magnetUri, (torrent) => {
51 this.loading = false; 51 this.loading = false;
52 console.log('Added ' + this.video.magnetUri + '.'); 52 console.log('Added ' + this.video.magnetUri + '.');
53 torrent.files[0].appendTo(this._elementRef.nativeElement.querySelector('.embed-responsive'), (err) => { 53 torrent.files[0].appendTo(this.elementRef.nativeElement.querySelector('.embed-responsive'), (err) => {
54 if (err) { 54 if (err) {
55 alert('Cannot append the file.'); 55 alert('Cannot append the file.');
56 console.error(err); 56 console.error(err);
@@ -58,7 +58,7 @@ export class VideoWatchComponent implements OnInit, CanDeactivate {
58 }); 58 });
59 59
60 // Refresh each second 60 // Refresh each second
61 this._interval = setInterval(() => { 61 this.interval = setInterval(() => {
62 this.downloadSpeed = torrent.downloadSpeed; 62 this.downloadSpeed = torrent.downloadSpeed;
63 this.uploadSpeed = torrent.uploadSpeed; 63 this.uploadSpeed = torrent.uploadSpeed;
64 this.numPeers = torrent.numPeers; 64 this.numPeers = torrent.numPeers;
@@ -66,9 +66,9 @@ export class VideoWatchComponent implements OnInit, CanDeactivate {
66 }); 66 });
67 } 67 }
68 68
69 routerCanDeactivate(next: ComponentInstruction, prev: ComponentInstruction) : any { 69 routerCanDeactivate(next: ComponentInstruction, prev: ComponentInstruction) {
70 console.log('Removing video from webtorrent.'); 70 console.log('Removing video from webtorrent.');
71 clearInterval(this._interval); 71 clearInterval(this.interval);
72 this.client.remove(this.video.magnetUri); 72 this.client.remove(this.video.magnetUri);
73 return true; 73 return true;
74 } 74 }
diff --git a/client/tslint.json b/client/tslint.json
index 8e4e3fca1..9653c965b 100644
--- a/client/tslint.json
+++ b/client/tslint.json
@@ -51,6 +51,23 @@
51 "use-pipe-transform-interface": true, 51 "use-pipe-transform-interface": true,
52 "pipe-naming": [true, "camelCase", "my"], 52 "pipe-naming": [true, "camelCase", "my"],
53 "component-class-suffix": true, 53 "component-class-suffix": true,
54 "directive-class-suffix": true 54 "directive-class-suffix": true,
55
56 "typedef-whitespace": [ true,
57 {
58 "call-signature": "nospace",
59 "index-signature": "nospace",
60 "parameter": "nospace",
61 "property-declaration": "nospace",
62 "variable-declaration": "nospace"
63 }
64 ],
65 "whitespace": [ true,
66 "check-branch",
67 "check-decl",
68 "check-operator",
69 "check-separator",
70 "check-type"
71 ]
55 } 72 }
56} 73}