FastComments.com

Pisanje proširenja

Razvoj proširenja

Kontekst

FastComments pruža mogućnost proširenja naše osnovne funkcionalnosti putem skripti koje nazivamo proširenja.

An Extension can add additional markup to the comment widget, event listeners, and run arbitrary code.

Ovdje ćete pronaći primjere proširenja koja imamo u produkciji, kao i dokumentaciju o tome kako pisati proširenja.


Životni ciklus proširenja Internal Link


Skripta za svako proširenje dohvaća se i poziva prije nego što widget za komentare počne dohvaćati prvi skup komentara i prikazivati korisničko sučelje.

Pri početnom učitavanju, sljedeći će se podaci pridružiti objektu proširenja:

  • config - Referenca na objekt config.
  • translations - Referenca na objekt translations.
  • commentsById - Referenca na sve komentare po id-u.
  • root - Referenca na korijenski DOM čvor.

Proširenja trebaju prebrisati željene funkcije koje će widget za komentare pozivati u odgovarajućim trenucima.


Definiranje proširenja Internal Link

Najmanje moguće proširenje bilo bi:

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

U svrhu ovog primjera, spremite ovo kao my-extension.js, i učinite ga dostupnim na https://example.com/my-extension.min.js.

Ovo proširenje ne radi ništa; pri učitavanju jedino dohvaća objekt proširenja koji je stvorila osnovna biblioteka komentara.

Ovaj Extension objekt je singleton i nije dijeljen s nijednim drugim proširenjem.

Sljedeće, da bismo učitali naše proširenje, moramo o tome obavijestiti widget za komentare. Na primjer:

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

Za funkcionalne primjere, pogledajte sljedeći odjeljak.


Objekt proširenja Internal Link

Objekt proširenja sastoji se od sljedeće definicije:

Objekt proširenja JSDoc
Copy CopyRun External Link
1
2/**
3 * FastCommentsUI objekt proširenja. Koristi se za lijeno učitavanje određenih komponenti. Na primjer, sustav recenzija nije korišten od svih kupaca, pa učitavamo to proširenje samo kada ga trebamo.
4 *
5 * @typedef {Object} FastCommentsUIExtension
6 * @property {string} id
7 * @property {Element} scriptNode
8 * @property {Element} root - DOM čvor korijena widgeta.
9 * @property {string} [css]
10 * @property {Object} config - FastComments konfiguracijski objekt.
11 * @property {Object} commentsById - Referenca na objekt koji sadrži sve komentare po ID-u, koji se održava ažurnim.
12 * @property {Object} translations - Referenca na sve prijevode.
13 * @property {Function} reRenderComment - Referenca na funkciju koja se može pozvati za ponovno renderiranje komentara.
14 * @property {Function} removeCommentAndReRender - Referenca na funkciju koja se može pozvati za uklanjanje komentara iz memorije i ponovno renderiranje odgovarajućeg dijela DOM-a.
15 * @property {Function} newBroadcastId - Referenca na funkciju koja se može pozvati za stvaranje novog broadcast ID-a i dodavanje u lokalni popis broadcast ID-ova koje treba ignorirati.
16 * @property {FastCommentsUIExtensionSetupEventHandlers} [setupEventHandlers]
17 * @property {FastCommentsUIExtensionPrepareCommentForSavingCallback} [prepareCommentForSaving] - Poziva se s komentarom koji će biti objavljen. Vraća false za otkazivanje slanja (na primjer kada je priloženi upitnik nepotpun).
18 * @property {FastCommentsUIExtensionNewCommentCallback} [newComment]
19 * @property {FastCommentsUIExtensionReplyAreaFilter} [replyAreaFilter] - Filtrira HTML za područje komentara.
20 * @property {FastCommentsUIExtensionWidgetFilter} [widgetFilter] - Filtrira HTML za cijeli widget prilikom renderiranja.
21 * @property {FastCommentsUIExtensionCommentTopFilter} [commentFilter] - Filtrira HTML za svaki komentar prije renderiranja.
22 * @property {FastCommentsUIExtensionReplyAreaFilter} [commentMenuFilter] - Filtrira HTML za svaki izbornik komentara prije renderiranja.
23 * @property {FastCommentsUIExtensionMenuFilter} [menuFilter] - Filtrira HTML za cijeli widget prilikom renderiranja.
24 * @property {FastCommentsUIExtensionReplyAreaTop} [replyAreaTop] - (LEGACY) Vraća HTML koji se dodaje na vrh područja odgovora.
25 * @property {FastCommentsUIExtensionWidgetTopCallback} [widgetTop] - (LEGACY) Vraća HTML koji se dodaje na vrh widgeta.
26 * @property {FastCommentsUIExtensionCommentTopCallback} [commentTop] - (LEGACY) Vraća HTML koji se dodaje na vrh elementa komentara.
27 * @property {FastCommentsUIExtensionCommentBottomCallback} [commentBottom] - (LEGACY) Vraća HTML koji se dodaje na dno elementa komentara.
28 * @property {FastCommentsUIExtensionCommentBottomCallback} [commentContentBottom] - Vraća HTML koji se dodaje nakon teksta komentara, unutar elementa sadržaja komentara (koristi se u anketama).
29 * @property {Function} [replyAreaInputBottom] - Vraća HTML koji se dodaje unutar okvira za unos komentara, ispod tekstualnog polja (koristi se u anketama za uređivač ankete na mjestu). Prima ID roditeljskog komentara ili null za korijenski okvir odgovora.
30 * @property {Function} [onPollUpdate] - Poziva se s događajem uživo kada se promijeni broj glasova ankete na stranici.
31 * @property {Function} isSiteAdmin - Vraća je li gledatelj administrator ili moderator najamnika. Poznato nakon prvog dohvaćanja.
32 * @property {FastCommentsUIExtensionMenuBottomCallback} [menuBottom] - (LEGACY) Vraća HTML koji se dodaje na dno izbornika za svaki komentar.
33 * @property {FastCommentsUIExtensionRenderCallback} [onRender]
34 * @property {FastCommentsUIExtensionConnectionStatusCallback} [onLiveConnectionStatusUpdate]
35 * @property {FastCommentsUIExtensionInitialRenderCallback} [onInitialRenderComplete]
36 * @property {FastCommentsUIExtensionPresenceUpdateCallback} [onPresenceUpdate]
37 */
38
39/**
40 * @callback FastCommentsUIExtensionSetupEventHandlers
41 * @param {Element} element - Korijenski element.
42 * @param {Object.<string, Function>} clickListeners - Obrađivači događaja za klikove, po nazivu klase, koji se mogu modificirati po referenci.
43 * @returns void
44 */
45
46/**
47 * @callback FastCommentsUIExtensionWidgetTopCallback
48 * @param {Object} moduleData
49 * @returns {string}
50 */
51
52/**
53 * @callback FastCommentsUIExtensionWidgetFilter
54 * @param {Object} moduleData
55 * @param {Object} html
56 * @returns {string}
57 */
58
59/**
60 * @callback FastCommentsUIExtensionCommentTopCallback
61 * @param {Object} comment
62 * @returns {string}
63 */
64
65/**
66 * @callback FastCommentsUIExtensionCommentTopFilter
67 * @param {Object} comment
68 * @param {string} html
69 * @returns {string}
70 */
71
72/**
73 * @callback FastCommentsUIExtensionCommentBottomCallback
74 * @param {Object} comment
75 * @returns {string}
76 */
77
78/**
79 * @callback FastCommentsUIExtensionMenuBottomCallback
80 * @param {Object} comment
81 * @returns {string}
82 */
83
84/**
85 * @callback FastCommentsUIExtensionMenuFilter
86 * @param {Object} comment
87 * @param {string} html
88 * @returns {string}
89 */
90
91/**
92 * @callback FastCommentsUIExtensionRenderCallback
93 * @returns {string}
94 */
95
96/**
97 * @callback FastCommentsUIExtensionConnectionStatusCallback
98 * @param {boolean} isConnected
99 * @returns {void}
100 */
101
102/**
103 * @callback FastCommentsUIExtensionInitialRenderCallback
104 * @returns {void}
105 */
106
107/**
108 * @callback FastCommentsUIExtensionReplyAreaTop
109 * @param {Object|null} currentUser
110 * @param {boolean} isSaving
111 * @param {boolean} isReplyOpen
112 * @param {string|null} parentId
113 * @returns {string}
114 */
115
116/**
117 * @callback FastCommentsUIExtensionReplyAreaFilter
118 * @param {Object|null} currentUser
119 * @param {boolean} isSaving
120 * @param {boolean} isReplyOpen
121 * @param {string|null} parentId
122 * @param {string|null} html
123 * @returns {string}
124 */
125
126/**
127 * @callback FastCommentsUIExtensionPrepareCommentForSavingCallback
128 * @param {Object} comment
129 * @param {string} parentId
130 */
131
132/**
133 * @callback FastCommentsUIExtensionNewCommentCallback
134 * @param {Object} comment
135 */
136
137/**
138 * @callback FastCommentsUIExtensionPresenceUpdateCallback
139 * @param {Object} update
140 */
141

API proširenja Internal Link

Interakcija s Extension-om je jednostavna, jer jednostavno definiramo reference na funkcije koje želimo pozvati.

Da nadogradimo prethodni primjer, pretpostavimo da želimo dodati HTML na vrh svakog komentara:

Jednostavno proširenje - nastavak
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

Kad god vratite HTML poput ovog, on će se spojiti u UI putem algoritma usporedbe DOM-a.

Ručno pokretanje ponovnog prikaza komentara

Možemo pričekati početno učitavanje stranice i ručno ponovno prikazati komentar pozivom reRenderComment:

Ponovno prikazivanje komentara
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 not required, just an example.
20 }
21})();
22