瀏覽代碼

Add documentation on writing hooks

JC Brand 3 年之前
父節點
當前提交
a31f87f25b
共有 3 個文件被更改,包括 104 次插入17 次删除
  1. 22 14
      docs/source/dependencies.rst
  2. 79 0
      docs/source/plugin_development.rst
  3. 3 3
      docs/source/webserver.rst

+ 22 - 14
docs/source/dependencies.rst

@@ -9,40 +9,47 @@ Starting up a dev environment
 Installing the 3rd party dependencies
 =====================================
 
-We use development tools which depend on Node.js and npm (the Node package manager).
+To develop and customize Converse, you'll first need to check out Converse's Git
+repository:
 
-If you don't have Node.js installed, you can download and install the latest
-version `here <https://nodejs.org/download>`_.
+::
+
+    git clone https://github.com/conversejs/converse.js.git
+    cd converse.js
+
+
+We use development tools which depend on Node.js and NPM (the Node package manager).
 
-Alternatively you can `use your operating system's package manager to install
-Node.js <https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-distributions>`_.
+It's recommended that you use `NVM <https://github.com/nvm-sh/nvm>`_ (the Node version manager)
+to make sure you have the right version of Node.
 
-Also make sure you have ``Git`` installed. `See here <http://git-scm.com/book/en/Getting-Started-Installing-Git>`_.
+Refer to the `NVM Github page <https://github.com/nvm-sh/nvm#install--update-script>`_ for instructions on how to install it.
 
-Now use ``git`` to check out the Converse repository:
+Once NVM is installed, you can run the following inside your checkout of the Converse Git repository:
 
 ::
 
-    git clone https://github.com/conversejs/converse.js.git
+    nvm install
+
+.. note::
+    You will always have to first run ``nvm install`` in a new terminal session before working on Converse.
 
-Now go into the repository checkout and run ``make dev`` in order to set up the
-development environment.
+
+To set up the Converse development environment, you now run ``make dev``.
 
 ::
 
-    cd converse.js
     make dev
 
-If you're using Windows, or don't have GNU Make installed, you can run the
+Alternatively, if you're using Windows, or don't have GNU Make installed, you can run the
 following:
 
 ::
 
-  cd converse.js
   npm install
   npm run lerna
 
-This will install the Node.js development tools and Converse's dependencies.
+This will install the Node development tools and Converse's dependencies.
 
 The front-end dependencies are those JavaScript files on which
 Converse directly depends and which will be loaded in the browser as part of
@@ -80,3 +87,4 @@ under the `GPLv3 <https://github.com/signalapp/libsignal-protocol-javascript/blo
 which requires all other dependent JavaScript code to also be open sourced under the same
 license. You might not be willing to adhere to those terms, which is why you
 need to decide for yourself whether you're going to load libsignal or not.
+

+ 79 - 0
docs/source/plugin_development.rst

@@ -436,6 +436,85 @@ Please refer to the `API documentation </docs/html/api/http://localhost:8008/doc
 for an overview of what's available to you. If you need new events or promises, then
 `please open an issue or make a pull request on Github <https://github.com/jcbrand/converse.js>`_
 
+
+Hooks
+-----
+
+Converse has the concept of ``hooks``, which are special events that allow you
+to modify it's behaviour at runtime.
+
+A hook is similar to an event, but it differs in two meaningful ways:
+
+1. Converse will wait for all handlers of a hook to finish before continuing inside the function from where the hook was triggered.
+2. Each hook contains a payload, which the handlers can modify or extend, before returning it (either to the function that triggered the hook or to subsequent handlers).
+
+These two properties of hooks makes it possible for 3rd party plugins to
+intercept and update data, allowing them to modify Converse without the need of
+resorting to `overrides`_.
+
+A hook is triggered in the following way:
+
+.. code-block:: javascript
+
+    async function hookTriggerExample () {
+        const payload = { foo: 'bar' };
+        const updated_payload = await api.hook('hookName', this, payload);
+        return updated_payload;
+    }
+
+The above could be shortened:
+
+.. code-block:: javascript
+
+    async function hookTriggerExample () {
+        return await api.hook('hookName', this, { foo: 'bar' });
+    }
+
+The ``async/await`` syntax could also be removed, but then it's less clear to
+the reader that this function returns a promise.
+
+Let's assume that in a plugin somewhere a listener is registered for this hook:
+
+.. code-block:: javascript
+
+    function hookListenerExample () {
+
+        api.listen.on('hookname', (context, payload) => {
+            return {...payload, 'baz': 'buzz'};
+        });
+    }
+
+The ``context`` parameter in our listener is usually the ``this`` of the function
+that triggered the hook (as is the case in ``hookTriggerExample``),
+but could also be a ``Model`` instance.
+
+The ``payload`` parameter is the same payload that was passed in in
+``hookTriggerExample``.
+
+The ``hookListenerExample`` function accepts the payload and returns a new one
+which contains the original payload together with a new key and value.
+
+The ``updated_payload`` that is now returned from ``hookTriggerExample`` looks
+as follows:
+
+::
+
+    { foo: 'bar', bazz: 'buzz' }
+
+Our plugin was able to add data to the payload without requiring any kind of
+knowledge from ``hookTriggerExample`` about ``hookListenerExample`` and
+without any kind of coupling betwee the code.
+
+A good example of a real-world hook in Converse, is the
+`getMessageActionButtons <https://conversejs.org/docs/html/api/-_converse.html#event:getMessageActionButtons>`_
+which allows you to add, modify or delete the actions you can take on a message
+in a chat.
+
+The `Actions <https://github.com/conversejs/community-plugins/tree/master/packages/actions>`_
+3rd party community plugin makes use of this hook to add extra actions such as
+``like`` or ``dislike`` to chat messages.
+
+
 A full example plugin
 ---------------------
 

+ 3 - 3
docs/source/webserver.rst

@@ -37,9 +37,6 @@ You might want to open `dev.html <https://github.com/conversejs/converse.js/blob
 how ``converse.initialize`` is called and to potentially change any of the
 settings.
 
-If you're running ``make devserver``, you need to open http://localhost:8080
-instead.
-
 Starting a web server with live reloading
 -----------------------------------------
 
@@ -49,3 +46,6 @@ can run ``make devserver`` (which will use `webpack-dev-server <https://github.c
 Instead of ``dev.html`` being used, `webpack.html <https://github.com/conversejs/converse.js/blob/master/webpack.html>`_
 is now being used as the HTML template, and you'll need to modify that file if
 you want to change the settings passed to ``converse.initialize``.
+
+If you're running ``make devserver``, you need to open http://localhost:8080.
+