FastComments.com

Scrivere estensioni

Sviluppo di Extensions

Contesto

FastComments offre la possibilità di estendere la nostra funzionalità principale tramite script che chiamiamo Extensions.

Un'Extension può aggiungere markup aggiuntivo al widget dei commenti, listener di eventi ed eseguire codice arbitrario.

Qui troverai esempi di Extensions che abbiamo in produzione, oltre alla documentazione su come scrivere Extensions.


Il ciclo di vita dell'estensione Internal Link


Lo script per ogni estensione viene recuperato e invocato prima che il widget dei commenti inizi a recuperare il primo set di commenti e a renderizzare l'interfaccia utente.

Al caricamento iniziale, i seguenti dati verranno aggiunti all'oggetto dell'estensione:

  • config - Un riferimento all'oggetto config.
  • translations - Un riferimento all'oggetto translations.
  • commentsById - Un riferimento a tutti i commenti per id.
  • root - Un riferimento al nodo DOM radice.

Le estensioni dovrebbero sovrascrivere le funzioni desiderate, che il widget dei commenti invocherà nei momenti appropriati.


Definire un'estensione Internal Link

L'estensione più piccola possibile sarebbe:

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

Per questo esempio, salva questo come my-extension.js, e rendilo disponibile a https://example.com/my-extension.min.js.

Questa estensione non fa nulla; al caricamento recupera l'oggetto extension creato dalla libreria principale dei commenti.

Questo oggetto Extension è un singleton e non viene condiviso con altre estensioni.

Successivamente, per caricare la nostra estensione, dobbiamo comunicarlo al widget dei commenti. Ad esempio:

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

Per esempi funzionali, vedi la sezione successiva.

L'oggetto dell'estensione Internal Link

L'oggetto di estensione consiste nella seguente definizione:

Oggetto Estensione JSDoc
Copy CopyRun External Link
1
2/**
3 * L'oggetto di estensione FastCommentsUI. Utilizzato per il caricamento lazy di alcuni componenti. Per esempio, il sistema di recensioni non
4 * è usato da tutti i clienti, quindi carichiamo quell'estensione solo quando ne abbiamo bisogno.
5 *
6 * @typedef {Object} FastCommentsUIExtension
7 * @property {string} id
8 * @property {Element} scriptNode
9 * @property {Element} root - Il nodo DOM radice del widget.
10 * @property {string} [css]
11 * @property {Object} config - L'oggetto di configurazione FastComments.
12 * @property {Object} commentsById - Un riferimento a un oggetto con tutti i commenti per id, mantenuto aggiornato.
13 * @property {Object} translations - Un riferimento a tutte le traduzioni.
14 * @property {Function} reRenderComment - Un riferimento a una funzione che può essere invocata per ridisegnare un commento.
15 * @property {Function} removeCommentAndReRender - Un riferimento a una funzione che può essere invocata per rimuovere un commento dalla memoria e ridisegnare la parte appropriata del DOM.
16 * @property {Function} newBroadcastId - Un riferimento a una funzione che può essere invocata per creare un nuovo broadcast id e aggiungerlo alla lista locale di broadcast id da ignorare.
17 * @property {FastCommentsUIExtensionSetupEventHandlers} [setupEventHandlers]
18 * @property {FastCommentsUIExtensionPrepareCommentForSavingCallback} [prepareCommentForSaving] - Chiamata con il commento che sta per essere pubblicato. Restituisce false per annullare l'invio (ad esempio quando un sondaggio allegato è incompleto).
19 * @property {FastCommentsUIExtensionNewCommentCallback} [newComment]
20 * @property {FastCommentsUIExtensionReplyAreaFilter} [replyAreaFilter] - Filtra l'HTML per l'area del commento.
21 * @property {FastCommentsUIExtensionWidgetFilter} [widgetFilter] - Filtra l'HTML per l'intero widget al rendering.
22 * @property {FastCommentsUIExtensionCommentTopFilter} [commentFilter] - Filtra l'HTML per ogni commento prima del rendering.
23 * @property {FastCommentsUIExtensionReplyAreaFilter} [commentMenuFilter] - Filtra l'HTML per ogni menu del commento prima del rendering.
24 * @property {FastCommentsUIExtensionMenuFilter} [menuFilter] - Filtra l'HTML per l'intero widget al rendering.
25 * @property {FastCommentsUIExtensionReplyAreaTop} [replyAreaTop] - (LEGACY) Restituisce HTML da aggiungere in cima all'area di risposta.
26 * @property {FastCommentsUIExtensionWidgetTopCallback} [widgetTop] - (LEGACY) Restituisce HTML da aggiungere in cima al widget.
27 * @property {FastCommentsUIExtensionCommentTopCallback} [commentTop] - (LEGACY) Restituisce HTML da aggiungere in cima all'elemento del commento.
28 * @property {FastCommentsUIExtensionCommentBottomCallback} [commentBottom] - (LEGACY) Restituisce HTML da aggiungere in fondo all'elemento del commento.
29 * @property {FastCommentsUIExtensionCommentBottomCallback} [commentContentBottom] - Restituisce HTML da aggiungere dopo il testo del commento, all'interno dell'elemento del contenuto del commento (usato dai sondaggi).
30 * @property {Function} [replyAreaInputBottom] - Restituisce HTML da aggiungere all'interno del frame di input del commento, sotto l'input di testo (usato dai sondaggi per l'editor di sondaggio in loco). Riceve l'id del commento genitore, o null per la casella di risposta radice.
31 * @property {Function} [onPollUpdate] - Chiamata con l'evento live quando i conteggi dei voti di un sondaggio sulla pagina cambiano.
32 * @property {Function} isSiteAdmin - Restituisce se lo spettatore è un amministratore o moderatore del tenant. Conosciuto dopo il primo fetch.
33 * @property {FastCommentsUIExtensionMenuBottomCallback} [menuBottom] - (LEGACY) Restituisce HTML da aggiungere in fondo all'elemento del menu per ogni commento.
34 * @property {FastCommentsUIExtensionRenderCallback} [onRender]
35 * @property {FastCommentsUIExtensionConnectionStatusCallback} [onLiveConnectionStatusUpdate]
36 * @property {FastCommentsUIExtensionInitialRenderCallback} [onInitialRenderComplete]
37 * @property {FastCommentsUIExtensionPresenceUpdateCallback} [onPresenceUpdate]
38 */
39
40/**
41 * @callback FastCommentsUIExtensionSetupEventHandlers
42 * @param {Element} element - L'elemento radice.
43 * @param {Object.<string, Function>} clickListeners - I gestori di eventi per i click, per nome di classe, che possono essere modificati per riferimento.
44 * @returns void
45 */
46
47/**
48 * @callback FastCommentsUIExtensionWidgetTopCallback
49 * @param {Object} moduleData
50 * @returns {string}
51 */
52
53/**
54 * @callback FastCommentsUIExtensionWidgetFilter
55 * @param {Object} moduleData
56 * @param {Object} html
57 * @returns {string}
58 */
59
60/**
61 * @callback FastCommentsUIExtensionCommentTopCallback
62 * @param {Object} comment
63 * @returns {string}
64 */
65
66/**
67 * @callback FastCommentsUIExtensionCommentTopFilter
68 * @param {Object} comment
69 * @param {string} html
70 * @returns {string}
71 */
72
73/**
74 * @callback FastCommentsUIExtensionCommentBottomCallback
75 * @param {Object} comment
76 * @returns {string}
77 */
78
79/**
80 * @callback FastCommentsUIExtensionMenuBottomCallback
81 * @param {Object} comment
82 * @returns {string}
83 */
84
85/**
86 * @callback FastCommentsUIExtensionMenuFilter
87 * @param {Object} comment
88 * @param {string} html
89 * @returns {string}
90 */
91
92/**
93 * @callback FastCommentsUIExtensionRenderCallback
94 * @returns {string}
95 */
96
97/**
98 * @callback FastCommentsUIExtensionConnectionStatusCallback
99 * @param {boolean} isConnected
100 * @returns {void}
101 */
102
103/**
104 * @callback FastCommentsUIExtensionInitialRenderCallback
105 * @returns {void}
106 */
107
108/**
109 * @callback FastCommentsUIExtensionReplyAreaTop
110 * @param {Object|null} currentUser
111 * @param {boolean} isSaving
112 * @param {boolean} isReplyOpen
113 * @param {string|null} parentId
114 * @returns {string}
115 */
116
117/**
118 * @callback FastCommentsUIExtensionReplyAreaFilter
119 * @param {Object|null} currentUser
120 * @param {boolean} isSaving
121 * @param {boolean} isReplyOpen
122 * @param {string|null} parentId
123 * @param {string|null} html
124 * @returns {string}
125 */
126
127/**
128 * @callback FastCommentsUIExtensionPrepareCommentForSavingCallback
129 * @param {Object} comment
130 * @param {string} parentId
131 */
132
133/**
134 * @callback FastCommentsUIExtensionNewCommentCallback
135 * @param {Object} comment
136 */
137
138/**
139 * @callback FastCommentsUIExtensionPresenceUpdateCallback
140 * @param {Object} update
141 */
142

L'API dell'estensione Internal Link

Interacting with the Extension is simple, as we simply define references to functions we want invoked.

Per basarci sull'esempio precedente, supponiamo di voler aggiungere HTML all'inizio di ogni commento:

Una semplice estensione - Continuazione
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

Whenever you return HTML like this, it will get merged into the UI via a dom-diffing algorithm.

Attivare manualmente il re-render di un commento

Possiamo attendere il caricamento iniziale della pagina e renderizzare nuovamente un commento manualmente invocando reRenderComment:

Re-Rendering di un commento
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); // timeout non necessario, solo un esempio.
20 }
21})();
22