FastComments.com


Développement d'extensions

Contexte

FastComments offre la possibilité d'étendre notre fonctionnalité principale via des scripts que nous appelons Extensions.

Une Extension peut ajouter du balisage supplémentaire au widget de commentaires, des écouteurs d'événements, et exécuter du code arbitraire.

Ici vous trouverez des exemples d'extensions que nous avons en production, ainsi que la documentation sur la façon d'écrire des extensions.


Le cycle de vie de l'extension Internal Link

Le script de chaque extension est récupéré et exécuté avant que le widget de commentaires ne commence à récupérer le premier ensemble de commentaires et à afficher l'interface utilisateur.

Au chargement initial, les données suivantes seront ajoutées à l'objet extension :

  • config - Une référence à l'objet config.
  • translations - Une référence à l'objet translations.
  • commentsById - Une référence à tous les commentaires par id.
  • root - Une référence au nœud DOM racine.

Les extensions doivent redéfinir les fonctions souhaitées, que le widget de commentaires invoquera aux moments appropriés.

Définir une extension Internal Link

La plus petite extension possible serait:

Une extension simple
Copy CopyRun External Link
1
2(function () {
3 const extension = FastCommentsUI.extensions.find((extension) => {
4 return extension.id === 'my-extension';
5 });
6})();
7

Pour cet exemple, enregistrez ceci sous my-extension.js, et rendez-le disponible à https://example.com/my-extension.min.js.

Cette extension ne fait rien, sauf qu'au chargement elle récupère l'objet créé Extension par la bibliothèque principale de commentaires.

Cet objet Extension est un singleton et n'est pas partagé avec d'autres extensions.

Ensuite, pour charger notre extension, nous devons en informer le widget de commentaires. Par exemple:

Using a Custom Extension
Copy CopyRun External Link
1
2<script async src="https://cdn.fastcomments.com/js/embed-v2-async.min.js"></script>
3<div id="fastcomments-widget"></div>
4<script>
5window.fcConfigs = [{
6 "tenantId": "demo",
7 "extensions": [
8 {
9 "id": "my-extension",
10 "path": "https://example.com/my-extension.min.js"
11 }
12 ]
13}];
14</script>
15

Pour des exemples fonctionnels, voir la section suivante.

L'objet d'extension Internal Link

L'objet d'extension se compose de la définition suivante :

JSDoc de l'extension
Copy CopyRun External Link
1
2/**
3 * The FastCommentsUI extension object. Used for lazy-loading certain components. For example, the review system is not
4 * used by all customers, so we only load that extension when we want it.
5 *
6 * @typedef {Object} FastCommentsUIExtension
7 * @property {string} id
8 * @property {Element} scriptNode
9 * @property {Element} root - Le nœud DOM racine du widget.
10 * @property {string} [css]
11 * @property {Object} config - L'objet de configuration FastComments.
12 * @property {Object} commentsById - Une référence à un objet contenant tous les commentaires par id, qui est tenu à jour.
13 * @property {Object} translations - Une référence à toutes les traductions.
14 * @property {Function} reRenderComment - Une référence à une fonction pouvant être appelée pour réafficher un commentaire.
15 * @property {Function} removeCommentAndReRender - Une référence à une fonction pouvant être appelée pour supprimer un commentaire de la mémoire et réafficher la partie appropriée du DOM.
16 * @property {Function} newBroadcastId - Une référence à une fonction pouvant être appelée pour créer un nouvel identifiant de diffusion (broadcast id) et l'ajouter à la liste locale d'identifiants de diffusion à ignorer.
17 * @property {FastCommentsUIExtensionSetupEventHandlers} [setupEventHandlers]
18 * @property {FastCommentsUIExtensionPrepareCommentForSavingCallback} [prepareCommentForSaving]
19 * @property {FastCommentsUIExtensionNewCommentCallback} [newComment]
20 * @property {FastCommentsUIExtensionReplyAreaFilter} [replyAreaFilter] - Filtre HTML pour la zone de commentaire.
21 * @property {FastCommentsUIExtensionWidgetFilter} [widgetFilter] - Filtre HTML pour l'ensemble du widget lors du rendu.
22 * @property {FastCommentsUIExtensionCommentTopFilter} [commentFilter] - Filtre HTML pour chaque commentaire avant le rendu.
23 * @property {FastCommentsUIExtensionReplyAreaFilter} [commentMenuFilter] - Filtre HTML pour le menu de chaque commentaire avant le rendu.
24 * @property {FastCommentsUIExtensionMenuFilter} [menuFilter] - Filtre HTML pour l'ensemble du widget lors du rendu.
25 * @property {FastCommentsUIExtensionReplyAreaTop} [replyAreaTop] - (HÉRITAGE) Retourne du HTML à ajouter en haut de la zone de réponse.
26 * @property {FastCommentsUIExtensionWidgetTopCallback} [widgetTop] - (HÉRITAGE) Retourne du HTML à ajouter en haut du widget.
27 * @property {FastCommentsUIExtensionCommentTopCallback} [commentTop] - (HÉRITAGE) Retourne du HTML à ajouter en haut de l'élément de commentaire.
28 * @property {FastCommentsUIExtensionCommentBottomCallback} [commentBottom] - (HÉRITAGE) Retourne du HTML à ajouter en bas de l'élément de commentaire.
29 * @property {FastCommentsUIExtensionMenuBottomCallback} [menuBottom] - (HÉRITAGE) Retourne du HTML à ajouter en bas de l'élément de menu pour chaque commentaire.
30 * @property {FastCommentsUIExtensionRenderCallback} [onRender]
31 * @property {FastCommentsUIExtensionConnectionStatusCallback} [onLiveConnectionStatusUpdate]
32 * @property {FastCommentsUIExtensionInitialRenderCallback} [onInitialRenderComplete]
33 * @property {FastCommentsUIExtensionPresenceUpdateCallback} [onPresenceUpdate]
34 */
35
36/**
37 * @callback FastCommentsUIExtensionSetupEventHandlers
38 * @param {Element} element - L'élément racine.
39 * @param {Object.<string, Function>} clickListeners - Les gestionnaires d'événements pour les clics, par nom de classe, qui peuvent être modifiés par référence.
40 * @returns void
41 */
42
43/**
44 * @callback FastCommentsUIExtensionWidgetTopCallback
45 * @param {Object} moduleData
46 * @returns {string}
47 */
48
49/**
50 * @callback FastCommentsUIExtensionWidgetFilter
51 * @param {Object} moduleData
52 * @param {Object} html
53 * @returns {string}
54 */
55
56/**
57 * @callback FastCommentsUIExtensionCommentTopCallback
58 * @param {Object} comment
59 * @returns {string}
60 */
61
62/**
63 * @callback FastCommentsUIExtensionCommentTopFilter
64 * @param {Object} comment
65 * @param {string} html
66 * @returns {string}
67 */
68
69/**
70 * @callback FastCommentsUIExtensionCommentBottomCallback
71 * @param {Object} comment
72 * @returns {string}
73 */
74
75/**
76 * @callback FastCommentsUIExtensionMenuBottomCallback
77 * @param {Object} comment
78 * @returns {string}
79 */
80
81/**
82 * @callback FastCommentsUIExtensionMenuFilter
83 * @param {Object} comment
84 * @param {string} html
85 * @returns {string}
86 */
87
88/**
89 * @callback FastCommentsUIExtensionRenderCallback
90 * @returns {string}
91 */
92
93/**
94 * @callback FastCommentsUIExtensionConnectionStatusCallback
95 * @param {boolean} isConnected
96 * @returns {void}
97 */
98
99/**
100 * @callback FastCommentsUIExtensionInitialRenderCallback
101 * @returns {void}
102 */
103
104/**
105 * @callback FastCommentsUIExtensionReplyAreaTop
106 * @param {Object|null} currentUser
107 * @param {boolean} isSaving
108 * @param {boolean} isReplyOpen
109 * @param {string|null} parentId
110 * @returns {string}
111 */
112
113/**
114 * @callback FastCommentsUIExtensionReplyAreaFilter
115 * @param {Object|null} currentUser
116 * @param {boolean} isSaving
117 * @param {boolean} isReplyOpen
118 * @param {string|null} parentId
119 * @param {string|null} html
120 * @returns {string}
121 */
122
123/**
124 * @callback FastCommentsUIExtensionPrepareCommentForSavingCallback
125 * @param {Object} comment
126 * @param {string} parentId
127 */
128
129/**
130 * @callback FastCommentsUIExtensionNewCommentCallback
131 * @param {Object} comment
132 */
133
134/**
135 * @callback FastCommentsUIExtensionPresenceUpdateCallback
136 * @param {Object} update
137 */
138

L'API d'extension Internal Link

Interagir avec l'Extension est simple, car nous définissons simplement des références aux fonctions que nous souhaitons invoquer.

Pour reprendre l'exemple précédent, supposons que nous voulons ajouter du HTML au haut de chaque commentaire :

Une extension simple - Suite
Copy CopyRun External Link
1
2(function () {
3 const extension = FastCommentsUI.extensions.find((extension) => {
4 return extension.id === 'my-extension';
5 });
6
7 extension.commentFilter = function(comment, html) {
8 return `<h3>The user's name is ${comment.commenterName}!</h3>` + html;
9 }
10})();
11

Chaque fois que vous renverrez du HTML comme ceci, il sera fusionné dans l'interface utilisateur via un algorithme de diff du DOM.

Déclencher manuellement le re-rendu d'un commentaire

Nous pouvons attendre le chargement initial de la page et relancer manuellement le rendu d'un commentaire en invoquant reRenderComment:

Relancer le rendu d'un commentaire
Copy CopyRun External Link
1
2(function () {
3 const extension = FastCommentsUI.extensions.find((extension) => {
4 return extension.id === 'my-extension';
5 });
6
7 let renderCount = 0;
8
9 extension.commentFilter = function(comment, html) {
10 renderCount++;
11 return `<h3>The render count is ${renderCount}!</h3>` + html;
12 }
13
14 extension.onInitialRenderComplete = function() {
15 setInterval(function() {
16 extension.reRenderComment(extension.commentsById[Object.keys(extension.commentsById)[0]], function renderDone() {
17 console.log('Comment re-render done.');
18 });
19 }, 2000); // délai non requis, juste un exemple.
20 }
21})();
22