diff options
author | Benjamin Bouvier <public@benj.me> | 2018-01-07 14:48:10 +0100 |
---|---|---|
committer | Chocobozzz <me@florianbigard.com> | 2018-01-07 14:48:10 +0100 |
commit | 57a49263e48739c31cd339730ac4cb24e3d5d723 (patch) | |
tree | 520de9caa84113e704b39ae3b6f068a4fca7a66d | |
parent | cbca00dfc14fe47260e8d081f4ed0bec7c66fd09 (diff) | |
download | PeerTube-57a49263e48739c31cd339730ac4cb24e3d5d723.tar.gz PeerTube-57a49263e48739c31cd339730ac4cb24e3d5d723.tar.zst PeerTube-57a49263e48739c31cd339730ac4cb24e3d5d723.zip |
A few updates for the watch video view (#181)
* Fixes #156: Filter out the video being watched from the list of other videos of the same author;
* Fixes #167: in the video view, hide the author's domain when it's from the current host;
* Fixes #171: Allow undoing a like/dislike;
-rw-r--r-- | client/src/app/shared/video/video.model.ts | 7 | ||||
-rw-r--r-- | client/src/app/shared/video/video.service.ts | 4 | ||||
-rw-r--r-- | client/src/app/videos/+video-watch/video-watch.component.html | 2 | ||||
-rw-r--r-- | client/src/app/videos/+video-watch/video-watch.component.ts | 71 | ||||
-rw-r--r-- | server/controllers/api/videos/rate.ts | 1 | ||||
-rw-r--r-- | server/helpers/custom-validators/videos.ts | 2 | ||||
-rw-r--r-- | shared/models/videos/video-rate.type.ts | 2 |
7 files changed, 55 insertions, 34 deletions
diff --git a/client/src/app/shared/video/video.model.ts b/client/src/app/shared/video/video.model.ts index 060bf933f..a4b90ad94 100644 --- a/client/src/app/shared/video/video.model.ts +++ b/client/src/app/shared/video/video.model.ts | |||
@@ -35,7 +35,10 @@ export class Video implements VideoServerModel { | |||
35 | nsfw: boolean | 35 | nsfw: boolean |
36 | account: Account | 36 | account: Account |
37 | 37 | ||
38 | private static createByString (account: string, serverHost: string) { | 38 | private static createByString (account: string, serverHost: string, apiURL: string) { |
39 | const thisHost = new URL(apiURL).host | ||
40 | if (serverHost.trim() === thisHost) | ||
41 | return account | ||
39 | return account + '@' + serverHost | 42 | return account + '@' + serverHost |
40 | } | 43 | } |
41 | 44 | ||
@@ -78,7 +81,7 @@ export class Video implements VideoServerModel { | |||
78 | this.dislikes = hash.dislikes | 81 | this.dislikes = hash.dislikes |
79 | this.nsfw = hash.nsfw | 82 | this.nsfw = hash.nsfw |
80 | 83 | ||
81 | this.by = Video.createByString(hash.accountName, hash.serverHost) | 84 | this.by = Video.createByString(hash.accountName, hash.serverHost, absoluteAPIUrl) |
82 | } | 85 | } |
83 | 86 | ||
84 | isVideoNSFWForUser (user: User) { | 87 | isVideoNSFWForUser (user: User) { |
diff --git a/client/src/app/shared/video/video.service.ts b/client/src/app/shared/video/video.service.ts index 073acb2b6..50761ca0c 100644 --- a/client/src/app/shared/video/video.service.ts +++ b/client/src/app/shared/video/video.service.ts | |||
@@ -136,6 +136,10 @@ export class VideoService { | |||
136 | return this.setVideoRate(id, 'dislike') | 136 | return this.setVideoRate(id, 'dislike') |
137 | } | 137 | } |
138 | 138 | ||
139 | unsetVideoLike (id: number) { | ||
140 | return this.setVideoRate(id, 'none') | ||
141 | } | ||
142 | |||
139 | getUserVideoRating (id: number): Observable<UserVideoRate> { | 143 | getUserVideoRating (id: number): Observable<UserVideoRate> { |
140 | const url = UserService.BASE_USERS_URL + 'me/videos/' + id + '/rating' | 144 | const url = UserService.BASE_USERS_URL + 'me/videos/' + id + '/rating' |
141 | 145 | ||
diff --git a/client/src/app/videos/+video-watch/video-watch.component.html b/client/src/app/videos/+video-watch/video-watch.component.html index 514a86e28..a5c387638 100644 --- a/client/src/app/videos/+video-watch/video-watch.component.html +++ b/client/src/app/videos/+video-watch/video-watch.component.html | |||
@@ -165,7 +165,7 @@ | |||
165 | Other videos | 165 | Other videos |
166 | </div> | 166 | </div> |
167 | 167 | ||
168 | <div *ngFor="let video of otherVideos"> | 168 | <div *ngFor="let video of otherVideosDisplayed"> |
169 | <my-video-miniature [video]="video" [user]="user"></my-video-miniature> | 169 | <my-video-miniature [video]="video" [user]="user"></my-video-miniature> |
170 | </div> | 170 | </div> |
171 | </div> | 171 | </div> |
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 f1f194764..01e4bbf4a 100644 --- a/client/src/app/videos/+video-watch/video-watch.component.ts +++ b/client/src/app/videos/+video-watch/video-watch.component.ts | |||
@@ -29,6 +29,7 @@ export class VideoWatchComponent implements OnInit, OnDestroy { | |||
29 | @ViewChild('videoReportModal') videoReportModal: VideoReportComponent | 29 | @ViewChild('videoReportModal') videoReportModal: VideoReportComponent |
30 | 30 | ||
31 | otherVideos: Video[] = [] | 31 | otherVideos: Video[] = [] |
32 | otherVideosDisplayed: Video[] = [] | ||
32 | 33 | ||
33 | error = false | 34 | error = false |
34 | loading = false | 35 | loading = false |
@@ -69,8 +70,7 @@ export class VideoWatchComponent implements OnInit, OnDestroy { | |||
69 | this.videoService.getVideos({ currentPage: 1, itemsPerPage: 5 }, '-createdAt') | 70 | this.videoService.getVideos({ currentPage: 1, itemsPerPage: 5 }, '-createdAt') |
70 | .subscribe( | 71 | .subscribe( |
71 | data => this.otherVideos = data.videos, | 72 | data => this.otherVideos = data.videos, |
72 | 73 | err => console.error(err) | |
73 | err => console.error(err) | ||
74 | ) | 74 | ) |
75 | 75 | ||
76 | this.paramsSub = this.route.params.subscribe(routeParams => { | 76 | this.paramsSub = this.route.params.subscribe(routeParams => { |
@@ -102,36 +102,22 @@ export class VideoWatchComponent implements OnInit, OnDestroy { | |||
102 | 102 | ||
103 | setLike () { | 103 | setLike () { |
104 | if (this.isUserLoggedIn() === false) return | 104 | if (this.isUserLoggedIn() === false) return |
105 | // Already liked this video | 105 | if (this.userRating === 'like') { |
106 | if (this.userRating === 'like') return | 106 | // Already liked this video |
107 | 107 | this.setRating('none') | |
108 | this.videoService.setVideoLike(this.video.id) | 108 | } else { |
109 | .subscribe( | 109 | this.setRating('like') |
110 | () => { | 110 | } |
111 | // Update the video like attribute | ||
112 | this.updateVideoRating(this.userRating, 'like') | ||
113 | this.userRating = 'like' | ||
114 | }, | ||
115 | |||
116 | err => this.notificationsService.error('Error', err.message) | ||
117 | ) | ||
118 | } | 111 | } |
119 | 112 | ||
120 | setDislike () { | 113 | setDislike () { |
121 | if (this.isUserLoggedIn() === false) return | 114 | if (this.isUserLoggedIn() === false) return |
122 | // Already disliked this video | 115 | if (this.userRating === 'dislike') { |
123 | if (this.userRating === 'dislike') return | 116 | // Already disliked this video |
124 | 117 | this.setRating('none') | |
125 | this.videoService.setVideoDislike(this.video.id) | 118 | } else { |
126 | .subscribe( | 119 | this.setRating('dislike') |
127 | () => { | 120 | } |
128 | // Update the video dislike attribute | ||
129 | this.updateVideoRating(this.userRating, 'dislike') | ||
130 | this.userRating = 'dislike' | ||
131 | }, | ||
132 | |||
133 | err => this.notificationsService.error('Error', err.message) | ||
134 | ) | ||
135 | } | 121 | } |
136 | 122 | ||
137 | blacklistVideo (event: Event) { | 123 | blacklistVideo (event: Event) { |
@@ -303,6 +289,10 @@ export class VideoWatchComponent implements OnInit, OnDestroy { | |||
303 | private onVideoFetched (video: VideoDetails) { | 289 | private onVideoFetched (video: VideoDetails) { |
304 | this.video = video | 290 | this.video = video |
305 | 291 | ||
292 | if (this.otherVideos.length > 0) { | ||
293 | this.otherVideosDisplayed = this.otherVideos.filter(v => v.uuid !== this.video.uuid) | ||
294 | } | ||
295 | |||
306 | let observable | 296 | let observable |
307 | if (this.video.isVideoNSFWForUser(this.user)) { | 297 | if (this.video.isVideoNSFWForUser(this.user)) { |
308 | observable = this.confirmService.confirm( | 298 | observable = this.confirmService.confirm( |
@@ -366,6 +356,31 @@ export class VideoWatchComponent implements OnInit, OnDestroy { | |||
366 | ) | 356 | ) |
367 | } | 357 | } |
368 | 358 | ||
359 | private setRating (nextRating) { | ||
360 | let method | ||
361 | switch (nextRating) { | ||
362 | case 'like': | ||
363 | method = this.videoService.setVideoLike | ||
364 | break | ||
365 | case 'dislike': | ||
366 | method = this.videoService.setVideoDislike | ||
367 | break | ||
368 | case 'none': | ||
369 | method = this.videoService.unsetVideoLike | ||
370 | break | ||
371 | } | ||
372 | |||
373 | method.call(this.videoService, this.video.id) | ||
374 | .subscribe( | ||
375 | () => { | ||
376 | // Update the video like attribute | ||
377 | this.updateVideoRating(this.userRating, nextRating) | ||
378 | this.userRating = nextRating | ||
379 | }, | ||
380 | err => this.notificationsService.error('Error', err.message) | ||
381 | ) | ||
382 | } | ||
383 | |||
369 | private updateVideoRating (oldRating: UserVideoRateType, newRating: VideoRateType) { | 384 | private updateVideoRating (oldRating: UserVideoRateType, newRating: VideoRateType) { |
370 | let likesToIncrement = 0 | 385 | let likesToIncrement = 0 |
371 | let dislikesToIncrement = 0 | 386 | let dislikesToIncrement = 0 |
diff --git a/server/controllers/api/videos/rate.ts b/server/controllers/api/videos/rate.ts index b470f27f6..a7bd570eb 100644 --- a/server/controllers/api/videos/rate.ts +++ b/server/controllers/api/videos/rate.ts | |||
@@ -62,7 +62,6 @@ async function rateVideo (req: express.Request, res: express.Response) { | |||
62 | await previousRate.destroy({ transaction: t }) | 62 | await previousRate.destroy({ transaction: t }) |
63 | } else { // Update previous rate | 63 | } else { // Update previous rate |
64 | previousRate.type = rateType | 64 | previousRate.type = rateType |
65 | |||
66 | await previousRate.save({ transaction: t }) | 65 | await previousRate.save({ transaction: t }) |
67 | } | 66 | } |
68 | } else if (rateType !== 'none') { // There was not a previous rate, insert a new one if there is a rate | 67 | } else if (rateType !== 'none') { // There was not a previous rate, insert a new one if there is a rate |
diff --git a/server/helpers/custom-validators/videos.ts b/server/helpers/custom-validators/videos.ts index 1a5fdb887..0e8a2aab2 100644 --- a/server/helpers/custom-validators/videos.ts +++ b/server/helpers/custom-validators/videos.ts | |||
@@ -65,7 +65,7 @@ function isVideoViewsValid (value: string) { | |||
65 | } | 65 | } |
66 | 66 | ||
67 | function isVideoRatingTypeValid (value: string) { | 67 | function isVideoRatingTypeValid (value: string) { |
68 | return values(VIDEO_RATE_TYPES).indexOf(value as VideoRateType) !== -1 | 68 | return value === 'none' || values(VIDEO_RATE_TYPES).indexOf(value as VideoRateType) !== -1 |
69 | } | 69 | } |
70 | 70 | ||
71 | function isVideoFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[]) { | 71 | function isVideoFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[]) { |
diff --git a/shared/models/videos/video-rate.type.ts b/shared/models/videos/video-rate.type.ts index d48774a4b..17aaba5a5 100644 --- a/shared/models/videos/video-rate.type.ts +++ b/shared/models/videos/video-rate.type.ts | |||
@@ -1 +1 @@ | |||
export type VideoRateType = 'like' | 'dislike' | export type VideoRateType = 'like' | 'dislike' | 'none' | ||