Merge branch 'release/1.4.0' into develop
This commit is contained in:
commit
001ed2d40c
|
@ -86,7 +86,8 @@
|
|||
"options": {
|
||||
"baseHref": "/",
|
||||
"deployUrl": "client/",
|
||||
"browserTarget": "PeerTube:build"
|
||||
"browserTarget": "PeerTube:build",
|
||||
"proxyConfig": "proxy.config.json"
|
||||
},
|
||||
"configurations": {
|
||||
"production": {
|
||||
|
@ -96,7 +97,8 @@
|
|||
"browserTarget": "PeerTube:build:hmr"
|
||||
},
|
||||
"e2e": {
|
||||
"browserTarget": "PeerTube:build:e2e"
|
||||
"browserTarget": "PeerTube:build:e2e",
|
||||
"proxyConfig": "e2e/proxy.config.json"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
{
|
||||
"/api": {
|
||||
"target": "http://localhost:9000",
|
||||
"secure": false
|
||||
},
|
||||
"/plugins": {
|
||||
"target": "http://localhost:9000",
|
||||
"secure": false
|
||||
},
|
||||
"/themes": {
|
||||
"target": "http://localhost:9000",
|
||||
"secure": false
|
||||
},
|
||||
"/static": {
|
||||
"target": "http://localhost:9000",
|
||||
"secure": false
|
||||
},
|
||||
"/lazy-static": {
|
||||
"target": "http://localhost:9000",
|
||||
"secure": false
|
||||
},
|
||||
"/socket.io": {
|
||||
"target": "ws://localhost:9000",
|
||||
"secure": false,
|
||||
"ws": true
|
||||
},
|
||||
"/!(client)**": {
|
||||
"target": "http://localhost:3333/client/index.html",
|
||||
"secure": false,
|
||||
"logLevel": "debug"
|
||||
},
|
||||
"/!(client)**/**": {
|
||||
"target": "http://localhost:3333/client/index.html",
|
||||
"secure": false,
|
||||
"logLevel": "debug"
|
||||
}
|
||||
}
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
.plugin {
|
||||
margin: 15px 0;
|
||||
background-color: var(--submenuColor);
|
||||
}
|
||||
|
||||
.first-row {
|
||||
|
|
|
@ -8,9 +8,11 @@ import { debounceTime, filter, map, pairwise, skip } from 'rxjs/operators'
|
|||
import { Hotkey, HotkeysService } from 'angular2-hotkeys'
|
||||
import { I18n } from '@ngx-translate/i18n-polyfill'
|
||||
import { fromEvent } from 'rxjs'
|
||||
import { ViewportScroller } from '@angular/common'
|
||||
import { PlatformLocation, ViewportScroller } from '@angular/common'
|
||||
import { PluginService } from '@app/core/plugins/plugin.service'
|
||||
import { HooksService } from '@app/core/plugins/hooks.service'
|
||||
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
|
||||
import { POP_STATE_MODAL_DISMISS } from '@app/shared/misc/constants'
|
||||
|
||||
@Component({
|
||||
selector: 'my-app',
|
||||
|
@ -35,7 +37,9 @@ export class AppComponent implements OnInit {
|
|||
private screenService: ScreenService,
|
||||
private hotkeysService: HotkeysService,
|
||||
private themeService: ThemeService,
|
||||
private hooks: HooksService
|
||||
private hooks: HooksService,
|
||||
private location: PlatformLocation,
|
||||
private modalService: NgbModal
|
||||
) { }
|
||||
|
||||
get serverVersion () {
|
||||
|
@ -90,6 +94,8 @@ export class AppComponent implements OnInit {
|
|||
fromEvent(window, 'resize')
|
||||
.pipe(debounceTime(200))
|
||||
.subscribe(() => this.onResize())
|
||||
|
||||
this.location.onPopState(() => this.modalService.dismissAll(POP_STATE_MODAL_DISMISS))
|
||||
}
|
||||
|
||||
isUserLoggedIn () {
|
||||
|
@ -110,7 +116,6 @@ export class AppComponent implements OnInit {
|
|||
const eventsObs = this.router.events
|
||||
|
||||
const scrollEvent = eventsObs.pipe(filter((e: Event): e is Scroll => e instanceof Scroll))
|
||||
const navigationEndEvent = eventsObs.pipe(filter((e: Event): e is NavigationEnd => e instanceof NavigationEnd))
|
||||
|
||||
scrollEvent.subscribe(e => {
|
||||
if (e.position) {
|
||||
|
@ -126,6 +131,8 @@ export class AppComponent implements OnInit {
|
|||
}
|
||||
})
|
||||
|
||||
const navigationEndEvent = eventsObs.pipe(filter((e: Event): e is NavigationEnd => e instanceof NavigationEnd))
|
||||
|
||||
// When we add the a-state parameter, we don't want to alter the scroll
|
||||
navigationEndEvent.pipe(pairwise())
|
||||
.subscribe(([ e1, e2 ]) => {
|
||||
|
|
|
@ -18,12 +18,16 @@ export class ConfirmService {
|
|||
confirm (message: string, title = '', confirmButtonText?: string) {
|
||||
this.showConfirm.next({ title, message, confirmButtonText })
|
||||
|
||||
return this.confirmResponse.asObservable().pipe(first()).toPromise()
|
||||
return this.confirmResponse.asObservable()
|
||||
.pipe(first())
|
||||
.toPromise()
|
||||
}
|
||||
|
||||
confirmWithInput (message: string, inputLabel: string, expectedInputValue: string, title = '', confirmButtonText?: string) {
|
||||
this.showConfirm.next({ title, message, inputLabel, expectedInputValue, confirmButtonText })
|
||||
|
||||
return this.confirmResponse.asObservable().pipe(first()).toPromise()
|
||||
return this.confirmResponse.asObservable()
|
||||
.pipe(first())
|
||||
.toPromise()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@ import { ConfirmService } from '@app/core/confirm/confirm.service'
|
|||
import { I18n } from '@ngx-translate/i18n-polyfill'
|
||||
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
|
||||
import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap/modal/modal-ref'
|
||||
import { POP_STATE_MODAL_DISMISS } from '@app/shared/misc/constants'
|
||||
|
||||
@Component({
|
||||
selector: 'my-confirm',
|
||||
|
@ -63,6 +64,11 @@ export class ConfirmComponent implements OnInit {
|
|||
|
||||
this.openedModal.result
|
||||
.then(() => this.confirmService.confirmResponse.next(true))
|
||||
.catch(() => this.confirmService.confirmResponse.next(false))
|
||||
.catch((reason: string) => {
|
||||
// If the reason was that the user used the back button, we don't care about the confirm dialog result
|
||||
if (!reason || reason !== POP_STATE_MODAL_DISMISS) {
|
||||
this.confirmService.confirmResponse.next(false)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
export const POP_STATE_MODAL_DISMISS = 'pop state dismiss'
|
|
@ -34,6 +34,7 @@ import { VideoWatchPlaylistComponent } from '@app/videos/+video-watch/video-watc
|
|||
import { getStoredTheater } from '../../../assets/player/peertube-player-local-storage'
|
||||
import { PluginService } from '@app/core/plugins/plugin.service'
|
||||
import { HooksService } from '@app/core/plugins/hooks.service'
|
||||
import { PlatformLocation } from '@angular/common'
|
||||
|
||||
@Component({
|
||||
selector: 'my-video-watch',
|
||||
|
@ -95,6 +96,7 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
|
|||
private i18n: I18n,
|
||||
private hotkeysService: HotkeysService,
|
||||
private hooks: HooksService,
|
||||
private location: PlatformLocation,
|
||||
@Inject(LOCALE_ID) private localeId: string
|
||||
) {}
|
||||
|
||||
|
@ -374,13 +376,13 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
|
|||
this.i18n('This video contains mature or explicit content. Are you sure you want to watch it?'),
|
||||
this.i18n('Mature or explicit content')
|
||||
)
|
||||
if (res === false) return this.redirectService.redirectToHomepage()
|
||||
if (res === false) return this.location.back()
|
||||
}
|
||||
|
||||
// Flush old player if needed
|
||||
this.flushPlayer()
|
||||
|
||||
// Build video element, because videojs remove it on dispose
|
||||
// Build video element, because videojs removes it on dispose
|
||||
const playerElementWrapper = this.elementRef.nativeElement.querySelector('#videojs-wrapper')
|
||||
this.playerElement = document.createElement('video')
|
||||
this.playerElement.className = 'video-js vjs-peertube-skin'
|
||||
|
|
|
@ -44,6 +44,8 @@ async function getAvatar (req: express.Request, res: express.Response) {
|
|||
}
|
||||
|
||||
const avatar = await AvatarModel.loadByName(filename)
|
||||
if (!avatar) return res.sendStatus(404)
|
||||
|
||||
if (avatar.onDisk === false) {
|
||||
if (!avatar.fileUrl) return res.sendStatus(404)
|
||||
|
||||
|
|
Loading…
Reference in New Issue