]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - client/src/root-helpers/plugins.ts
Merge remote-tracking branch 'weblate/develop' into develop
[github/Chocobozzz/PeerTube.git] / client / src / root-helpers / plugins.ts
index 011721761682ee2a388c87a15ed74903967adcd8..8c1c858b724c8d4d2b2f92fff02af75e76e067d7 100644 (file)
@@ -1,6 +1,16 @@
-import { getHookType, internalRunHook } from '@shared/core-utils/plugins/hooks'
-import { ClientHookName, ClientScript, RegisterClientHookOptions, ServerConfigPlugin, PluginType, clientHookObject } from '../../../shared/models'
 import { RegisterClientHelpers } from 'src/types/register-client-option.model'
+import { getHookType, internalRunHook } from '@shared/core-utils/plugins/hooks'
+import {
+  ClientHookName,
+  clientHookObject,
+  ClientScript,
+  PluginType,
+  RegisterClientFormFieldOptions,
+  RegisterClientHookOptions,
+  RegisterClientSettingsScript,
+  RegisterClientVideoFieldOptions,
+  ServerConfigPlugin
+} from '../../../shared/models'
 import { ClientScript as ClientScriptModule } from '../types/client-script.model'
 import { importModule } from './utils'
 
@@ -18,6 +28,13 @@ type PluginInfo = {
   isTheme: boolean
 }
 
+type FormFields = {
+  video: {
+    commonOptions: RegisterClientFormFieldOptions
+    videoFormOptions: RegisterClientVideoFieldOptions
+  }[]
+}
+
 async function runHook<T> (hooks: Hooks, hookName: ClientHookName, result?: T, params?: any) {
   if (!hooks[hookName]) return result
 
@@ -34,7 +51,14 @@ async function runHook<T> (hooks: Hooks, hookName: ClientHookName, result?: T, p
   return result
 }
 
-function loadPlugin (hooks: Hooks, pluginInfo: PluginInfo, peertubeHelpersFactory: (pluginInfo: PluginInfo) => RegisterClientHelpers) {
+function loadPlugin (options: {
+  hooks: Hooks
+  pluginInfo: PluginInfo
+  peertubeHelpersFactory: (pluginInfo: PluginInfo) => RegisterClientHelpers
+  formFields?: FormFields
+  onSettingsScripts?: (options: RegisterClientSettingsScript) => void
+}) {
+  const { hooks, pluginInfo, peertubeHelpersFactory, formFields, onSettingsScripts } = options
   const { plugin, clientScript } = pluginInfo
 
   const registerHook = (options: RegisterClientHookOptions) => {
@@ -54,12 +78,31 @@ function loadPlugin (hooks: Hooks, pluginInfo: PluginInfo, peertubeHelpersFactor
     })
   }
 
+  const registerVideoField = (commonOptions: RegisterClientFormFieldOptions, videoFormOptions: RegisterClientVideoFieldOptions) => {
+    if (!formFields) {
+      throw new Error('Video field registration is not supported')
+    }
+
+    formFields.video.push({
+      commonOptions,
+      videoFormOptions
+    })
+  }
+
+  const registerSettingsScript = (options: RegisterClientSettingsScript) => {
+    if (!onSettingsScripts) {
+      throw new Error('Registering settings script is not supported')
+    }
+
+    return onSettingsScripts(options)
+  }
+
   const peertubeHelpers = peertubeHelpersFactory(pluginInfo)
 
   console.log('Loading script %s of plugin %s.', clientScript.script, plugin.name)
 
   return importModule(clientScript.script)
-    .then((script: ClientScriptModule) => script.register({ registerHook, peertubeHelpers }))
+    .then((script: ClientScriptModule) => script.register({ registerHook, registerVideoField, registerSettingsScript, peertubeHelpers }))
     .then(() => sortHooksByPriority(hooks))
     .catch(err => console.error('Cannot import or register plugin %s.', pluginInfo.plugin.name, err))
 }
@@ -68,6 +111,7 @@ export {
   HookStructValue,
   Hooks,
   PluginInfo,
+  FormFields,
   loadPlugin,
   runHook
 }