import { catchError, first, map, shareReplay } from 'rxjs/operators'
import { HttpClient } from '@angular/common/http'
import { Inject, Injectable, LOCALE_ID, NgZone } from '@angular/core'
+import { VideoEditType } from '@app/+videos/+video-edit/shared/video-edit.type'
import { AuthService } from '@app/core/auth'
import { Notifier } from '@app/core/notification'
import { MarkdownService } from '@app/core/renderer'
PluginTranslation,
PluginType,
PublicServerSetting,
+ RegisterClientSettingsScript,
ServerConfigPlugin
} from '@shared/models'
import { environment } from '../../../environments/environment'
pluginsLoaded: { [ scope in PluginClientScope ]: ReplaySubject<boolean> } = {
common: new ReplaySubject<boolean>(1),
+ 'admin-plugin': new ReplaySubject<boolean>(1),
search: new ReplaySubject<boolean>(1),
'video-watch': new ReplaySubject<boolean>(1),
signup: new ReplaySubject<boolean>(1),
customModal: CustomModalComponent
private plugins: ServerConfigPlugin[] = []
+ private helpers: { [ npmName: string ]: RegisterClientHelpers } = {}
+
private scopes: { [ scopeName: string ]: PluginInfo[] } = {}
+
private loadedScripts: { [ script: string ]: boolean } = {}
private loadedScopes: PluginClientScope[] = []
private loadingScopes: { [id in PluginClientScope]?: boolean } = {}
private formFields: FormFields = {
video: []
}
+ private settingsScripts: { [ npmName: string ]: RegisterClientSettingsScript } = {}
constructor (
private authService: AuthService,
: PluginType.THEME
}
- getRegisteredVideoFormFields (type: 'import-url' | 'import-torrent' | 'upload' | 'update') {
+ getRegisteredVideoFormFields (type: VideoEditType) {
return this.formFields.video.filter(f => f.videoFormOptions.type === type)
}
+ getRegisteredSettingsScript (npmName: string) {
+ return this.settingsScripts[npmName]
+ }
+
+ translateBy (npmName: string, toTranslate: string) {
+ const helpers = this.helpers[npmName]
+ if (!helpers) {
+ console.error('Unknown helpers to translate %s from %s.', toTranslate, npmName)
+ return toTranslate
+ }
+
+ return helpers.translate(toTranslate)
+ }
+
private loadPlugin (pluginInfo: PluginInfo) {
return this.zone.runOutsideAngular(() => {
+ const npmName = this.nameToNpmName(pluginInfo.plugin.name, pluginInfo.pluginType)
+
+ const helpers = this.buildPeerTubeHelpers(pluginInfo)
+ this.helpers[npmName] = helpers
+
return loadPlugin({
hooks: this.hooks,
formFields: this.formFields,
+ onSettingsScripts: options => this.settingsScripts[npmName] = options,
pluginInfo,
- peertubeHelpersFactory: pluginInfo => this.buildPeerTubeHelpers(pluginInfo)
+ peertubeHelpersFactory: () => helpers
})
})
}
.toPromise()
},
+ getServerConfig: () => {
+ return this.server.getConfig()
+ .pipe(catchError(res => this.restExtractor.handleError(res)))
+ .toPromise()
+ },
+
isLoggedIn: () => {
return this.authService.isLoggedIn()
},
+ getAuthHeader: () => {
+ if (!this.authService.isLoggedIn()) return undefined
+
+ const value = this.authService.getRequestHeaderValue()
+ return { 'Authorization': value }
+ },
+
notifier: {
info: (text: string, title?: string, timeout?: number) => this.notifier.info(text, title, timeout),
error: (text: string, title?: string, timeout?: number) => this.notifier.error(text, title, timeout),