import 'rxjs/add/operator/first'
import 'rxjs/add/operator/toPromise'
+type ConfirmOptions = {
+ title: string
+ message: string
+ inputLabel?: string
+ expectedInputValue?: string
+ confirmButtonText?: string
+}
+
@Injectable()
export class ConfirmService {
- showConfirm = new Subject<{ title: string, message: string, inputLabel?: string, expectedInputValue?: string }>()
+ showConfirm = new Subject<ConfirmOptions>()
confirmResponse = new Subject<boolean>()
- confirm (message: string, title = '') {
- this.showConfirm.next({ title, message })
+ confirm (message: string, title = '', confirmButtonText?: string) {
+ this.showConfirm.next({ title, message, confirmButtonText })
return this.confirmResponse.asObservable().first().toPromise()
}
- confirmWithInput (message: string, inputLabel: string, expectedInputValue: string, title = '') {
- this.showConfirm.next({ title, message, inputLabel, expectedInputValue })
+ confirmWithInput (message: string, inputLabel: string, expectedInputValue: string, title = '', confirmButtonText?: string) {
+ this.showConfirm.next({ title, message, inputLabel, expectedInputValue, confirmButtonText })
return this.confirmResponse.asObservable().first().toPromise()
}
styleUrls: [ './video-watch.component.scss' ]
})
export class VideoWatchComponent implements OnInit, OnDestroy {
+ private static LOCAL_STORAGE_PRIVACY_CONCERN_KEY = 'video-watch-privacy-concern'
+
@ViewChild('videoDownloadModal') videoDownloadModal: VideoDownloadComponent
@ViewChild('videoShareModal') videoShareModal: VideoShareComponent
@ViewChild('videoReportModal') videoReportModal: VideoReportComponent
)
}
- private onVideoFetched (video: VideoDetails) {
+ private async onVideoFetched (video: VideoDetails) {
this.video = video
this.updateOtherVideosDisplayed()
- let observable
if (this.video.isVideoNSFWForUser(this.user)) {
- observable = this.confirmService.confirm(
+ const res = await this.confirmService.confirm(
'This video contains mature or explicit content. Are you sure you want to watch it?',
'Mature or explicit content'
)
- } else {
- observable = Observable.of(true)
+ if (res === false) return this.router.navigate([ '/videos/list' ])
}
- observable.subscribe(
- res => {
- if (res === false) {
+ if (!this.hasAlreadyAcceptedPrivacyConcern()) {
+ const res = await this.confirmService.confirm(
+ 'PeerTube uses P2P, other may know you are watching that video through your public IP address. ' +
+ 'Are you okay with that?',
+ 'Privacy concern',
+ 'I accept!'
+ )
+ if (res === false) return this.router.navigate([ '/videos/list' ])
+ }
- return this.router.navigate([ '/videos/list' ])
- }
+ this.acceptedPrivacyConcern()
- // Player was already loaded
- if (this.videoPlayerLoaded !== true) {
- this.playerElement = this.elementRef.nativeElement.querySelector('#video-element')
+ // Player was already loaded
+ if (this.videoPlayerLoaded !== true) {
+ this.playerElement = this.elementRef.nativeElement.querySelector('#video-element')
- // If autoplay is true, we don't really need a poster
- if (this.isAutoplay() === false) {
- this.playerElement.poster = this.video.previewUrl
- }
+ // If autoplay is true, we don't really need a poster
+ if (this.isAutoplay() === false) {
+ this.playerElement.poster = this.video.previewUrl
+ }
- const videojsOptions = {
- controls: true,
- autoplay: this.isAutoplay(),
- plugins: {
- peertube: {
- videoFiles: this.video.files,
- playerElement: this.playerElement,
- peerTubeLink: false,
- videoViewUrl: this.videoService.getVideoViewUrl(this.video.uuid),
- videoDuration: this.video.duration
- },
- hotkeys: {
- enableVolumeScroll: false
- }
- }
+ const videojsOptions = {
+ controls: true,
+ autoplay: this.isAutoplay(),
+ plugins: {
+ peertube: {
+ videoFiles: this.video.files,
+ playerElement: this.playerElement,
+ peerTubeLink: false,
+ videoViewUrl: this.videoService.getVideoViewUrl(this.video.uuid),
+ videoDuration: this.video.duration
+ },
+ hotkeys: {
+ enableVolumeScroll: false
}
-
- this.videoPlayerLoaded = true
-
- const self = this
- this.zone.runOutsideAngular(() => {
- videojs(this.playerElement, videojsOptions, function () {
- self.player = this
- this.on('customError', (event, data) => self.handleError(data.err))
- })
- })
- } else {
- const videoViewUrl = this.videoService.getVideoViewUrl(this.video.uuid)
- this.player.peertube().setVideoFiles(this.video.files, videoViewUrl, this.video.duration)
}
+ }
- this.setVideoDescriptionHTML()
- this.setVideoLikesBarTooltipText()
+ this.videoPlayerLoaded = true
- this.setOpenGraphTags()
- this.checkUserRating()
- }
- )
+ const self = this
+ this.zone.runOutsideAngular(() => {
+ videojs(this.playerElement, videojsOptions, function () {
+ self.player = this
+ this.on('customError', (event, data) => self.handleError(data.err))
+ })
+ })
+ } else {
+ const videoViewUrl = this.videoService.getVideoViewUrl(this.video.uuid)
+ this.player.peertube().setVideoFiles(this.video.files, videoViewUrl, this.video.duration)
+ }
+
+ this.setVideoDescriptionHTML()
+ this.setVideoLikesBarTooltipText()
+
+ this.setOpenGraphTags()
+ this.checkUserRating()
}
private setRating (nextRating) {
this.video.likes += likesToIncrement
this.video.dislikes += dislikesToIncrement
- this.video.buildLikeAndDislikePercents()
+ this.video.buildLikeAndDislikePercents()
this.setVideoLikesBarTooltipText()
}
// Be sure the autoPlay is set to false
return this.user.autoPlayVideo !== false
}
+
+ private hasAlreadyAcceptedPrivacyConcern () {
+ return localStorage.getItem(VideoWatchComponent.LOCAL_STORAGE_PRIVACY_CONCERN_KEY) === 'true'
+ }
+
+ private acceptedPrivacyConcern () {
+ localStorage.setItem(VideoWatchComponent.LOCAL_STORAGE_PRIVACY_CONCERN_KEY, 'true')
+ }
}