diff --git a/client/src/app/+admin/plugins/plugin-search/plugin-search.component.ts b/client/src/app/+admin/plugins/plugin-search/plugin-search.component.ts
index 0058fa691..a6fbeed84 100644
--- a/client/src/app/+admin/plugins/plugin-search/plugin-search.component.ts
+++ b/client/src/app/+admin/plugins/plugin-search/plugin-search.component.ts
@@ -92,7 +92,12 @@ export class PluginSearchComponent implements OnInit {
this.pagination.totalItems = res.total
},
- err => this.notifier.error(err.message)
+ err => {
+ console.error(err)
+
+ const message = this.i18n('The plugin index is not available. Please retry later.')
+ this.notifier.error(message)
+ }
)
}
diff --git a/client/src/app/app.component.html b/client/src/app/app.component.html
index d398d4f35..07a576083 100644
--- a/client/src/app/app.component.html
+++ b/client/src/app/app.component.html
@@ -8,7 +8,7 @@
-
+
{{ instanceName }}
diff --git a/client/src/app/app.component.scss b/client/src/app/app.component.scss
index 3f8b9777a..c95b21ca3 100644
--- a/client/src/app/app.component.scss
+++ b/client/src/app/app.component.scss
@@ -38,8 +38,9 @@
}
}
- #peertube-title {
+ .peertube-title {
@include disable-default-a-behaviour;
+
font-size: 20px;
font-weight: $font-bold;
color: inherit !important;
@@ -64,7 +65,7 @@
@media screen and (max-width: 500px) {
width: 70px;
- #peertube-title {
+ .peertube-title {
display: none;
}
}
diff --git a/client/src/app/core/plugins/plugin.service.ts b/client/src/app/core/plugins/plugin.service.ts
index c6ba3dd17..525740a01 100644
--- a/client/src/app/core/plugins/plugin.service.ts
+++ b/client/src/app/core/plugins/plugin.service.ts
@@ -14,12 +14,19 @@ interface HookStructValue extends RegisterHookOptions {
clientScript: ClientScript
}
+type PluginInfo = {
+ plugin: ServerConfigPlugin
+ clientScript: ClientScript
+ isTheme: boolean
+}
+
@Injectable()
export class PluginService {
pluginsLoaded = new ReplaySubject
(1)
private plugins: ServerConfigPlugin[] = []
- private scopes: { [ scopeName: string ]: { plugin: ServerConfigPlugin, clientScript: ClientScript }[] } = {}
+ private scopes: { [ scopeName: string ]: PluginInfo[] } = {}
+ private loadedPlugins: { [ name: string ]: boolean } = {}
private loadedScripts: { [ script: string ]: boolean } = {}
private loadedScopes: PluginScope[] = []
@@ -49,7 +56,7 @@ export class PluginService {
}
addPlugin (plugin: ServerConfigPlugin, isTheme = false) {
- const pathPrefix = isTheme ? '/themes' : '/plugins'
+ const pathPrefix = this.getPluginPathPrefix(isTheme)
for (const key of Object.keys(plugin.clientScripts)) {
const clientScript = plugin.clientScripts[key]
@@ -62,7 +69,8 @@ export class PluginService {
clientScript: {
script: environment.apiUrl + `${pathPrefix}/${plugin.name}/${plugin.version}/client-scripts/${clientScript.script}`,
scopes: clientScript.scopes
- }
+ },
+ isTheme
})
this.loadedScripts[clientScript.script] = false
@@ -78,24 +86,26 @@ export class PluginService {
async reloadLoadedScopes () {
for (const scope of this.loadedScopes) {
- await this.loadPluginsByScope(scope)
+ await this.loadPluginsByScope(scope, true)
}
}
- async loadPluginsByScope (scope: PluginScope) {
+ async loadPluginsByScope (scope: PluginScope, isReload = false) {
try {
await this.ensurePluginsAreLoaded()
- this.loadedScopes.push(scope)
+ if (!isReload) this.loadedScopes.push(scope)
const toLoad = this.scopes[ scope ]
if (!Array.isArray(toLoad)) return
const promises: Promise[] = []
- for (const { plugin, clientScript } of toLoad) {
+ for (const pluginInfo of toLoad) {
+ const clientScript = pluginInfo.clientScript
+
if (this.loadedScripts[ clientScript.script ]) continue
- promises.push(this.loadPlugin(plugin, clientScript))
+ promises.push(this.loadPlugin(pluginInfo))
this.loadedScripts[ clientScript.script ] = true
}
@@ -109,6 +119,8 @@ export class PluginService {
async runHook (hookName: string, param?: any) {
let result = param
+ if (!this.hooks[hookName]) return result
+
const wait = hookName.startsWith('static:')
for (const hook of this.hooks[hookName]) {
@@ -123,7 +135,9 @@ export class PluginService {
return result
}
- private loadPlugin (plugin: ServerConfigPlugin, clientScript: ClientScript) {
+ private loadPlugin (pluginInfo: PluginInfo) {
+ const { plugin, clientScript } = pluginInfo
+
const registerHook = (options: RegisterHookOptions) => {
if (!this.hooks[options.target]) this.hooks[options.target] = []
@@ -136,10 +150,12 @@ export class PluginService {
})
}
+ const peertubeHelpers = this.buildPeerTubeHelpers(pluginInfo)
+
console.log('Loading script %s of plugin %s.', clientScript.script, plugin.name)
return import(/* webpackIgnore: true */ clientScript.script)
- .then(script => script.register({ registerHook }))
+ .then(script => script.register({ registerHook, peertubeHelpers }))
.then(() => this.sortHooksByPriority())
}
@@ -156,4 +172,19 @@ export class PluginService {
})
}
}
+
+ private buildPeerTubeHelpers (pluginInfo: PluginInfo) {
+ const { plugin } = pluginInfo
+
+ return {
+ getBaseStaticRoute: () => {
+ const pathPrefix = this.getPluginPathPrefix(pluginInfo.isTheme)
+ return environment.apiUrl + `${pathPrefix}/${plugin.name}/${plugin.version}/static`
+ }
+ }
+ }
+
+ private getPluginPathPrefix (isTheme: boolean) {
+ return isTheme ? '/themes' : '/plugins'
+ }
}
diff --git a/client/src/app/core/theme/theme.service.ts b/client/src/app/core/theme/theme.service.ts
index 76199d1cc..012488075 100644
--- a/client/src/app/core/theme/theme.service.ts
+++ b/client/src/app/core/theme/theme.service.ts
@@ -87,7 +87,7 @@ export class ThemeService {
const theme = this.getTheme(currentTheme)
if (theme) {
console.log('Adding scripts of theme %s.', currentTheme)
- this.pluginService.addPlugin(theme)
+ this.pluginService.addPlugin(theme, true)
this.pluginService.reloadLoadedScopes()
}