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:

JSDoc dokumentacija objekta Extension
Copy CopyRun External Link
1
2/**
3 * Objekt proširenja FastCommentsUI. Koristi se za lazy-loading određenih komponenti. Na primjer, sustav recenzija ne
4 * koriste svi kupci, pa taj extension učitavamo samo kada nam treba.
5 *
6 * @typedef {Object} FastCommentsUIExtension
7 * @property {string} id
8 * @property {Element} scriptNode
9 * @property {Element} root - Korijenski DOM čvor widgeta.
10 * @property {string} [css]
11 * @property {Object} config - FastComments config objekt.
12 * @property {Object} commentsById - Referenca na objekt sa svim komentarima po id-u, koji se stalno ažurira.
13 * @property {Object} translations - Referenca na sve prijevode.
14 * @property {Function} reRenderComment - Referenca na funkciju koja se može pozvati za ponovno renderiranje komentara.
15 * @property {Function} removeCommentAndReRender - Referenca na funkciju koja se može pozvati za uklanjanje komentara iz memorije i ponovno renderiranje odgovarajućeg dijela DOM-a.
16 * @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.
17 * @property {Function} [withSessionId] - Poziva se s URL-om zahtjeva i callback funkcijom. Poziva callback s URL-om plus viewerovim session id-om dodanim kada su third-party kolačići blokirani (isti put koji koriste zahtjevi za komentare i glasove), ili s nepromijenjenim URL-om inače. Kada session id nije na taj način dostupan, dodaje zadnji anonimni session id dan funkciji rememberAnonSessionId, ako postoji. Ne koristi se za SSO.
18 * @property {Function} [rememberAnonSessionId] - Poziva se s anonSessionId koji je odgovor vratio. Server ga vraća samo gostu čiji zahtjev nije imao session kolačić, i nikada za prijavljenu sesiju. Čuva se u localStorage (ili u memoriji kada pohrana nije dostupna) tako da withSessionId šalje id u kasnijim zahtjevima i gost zadržava jedan identitet.
19 * @property {FastCommentsUIExtensionSetupEventHandlers} [setupEventHandlers]
20 * @property {FastCommentsUIExtensionPrepareCommentForSavingCallback} [prepareCommentForSaving] - Poziva se s komentarom koji će biti objavljen. Vratite false za otkazivanje slanja (na primjer kada je priložena anketa nepotpuna).
21 * @property {FastCommentsUIExtensionNewCommentCallback} [newComment]
22 * @property {FastCommentsUIExtensionReplyAreaFilter} [replyAreaFilter] - Filtrira HTML za područje komentara.
23 * @property {FastCommentsUIExtensionWidgetFilter} [widgetFilter] - Filtrira HTML za cijeli widget prilikom renderiranja.
24 * @property {FastCommentsUIExtensionCommentTopFilter} [commentFilter] - Filtrira HTML za svaki komentar prije renderiranja.
25 * @property {FastCommentsUIExtensionReplyAreaFilter} [commentMenuFilter] - Filtrira HTML za izbornik svakog komentara prije renderiranja.
26 * @property {FastCommentsUIExtensionMenuFilter} [menuFilter] - Filtrira HTML za cijeli widget prilikom renderiranja.
27 * @property {FastCommentsUIExtensionReplyAreaTop} [replyAreaTop] - (LEGACY) Vraća HTML koji se dodaje na vrh područja za odgovor.
28 * @property {FastCommentsUIExtensionWidgetTopCallback} [widgetTop] - (LEGACY) Vraća HTML koji se dodaje na vrh widgeta.
29 * @property {FastCommentsUIExtensionCommentTopCallback} [commentTop] - (LEGACY) Vraća HTML koji se dodaje na vrh elementa komentara.
30 * @property {FastCommentsUIExtensionCommentBottomCallback} [commentBottom] - (LEGACY) Vraća HTML koji se dodaje na dno elementa komentara.
31 * @property {FastCommentsUIExtensionCommentBottomCallback} [commentContentBottom] - Vraća HTML koji se dodaje nakon teksta komentara, unutar elementa sadržaja komentara (koriste se u anketama).
32 * @property {Function} [replyAreaInputBottom] - Vraća HTML koji se dodaje unutar okvira za unos komentara, ispod polja za unos teksta (koriste se u anketama za uređivač ankete na mjestu). Prima id roditeljskog komentara ili null za glavni okvir za odgovor.
33 * @property {Function} [onPollUpdate] - Poziva se s live eventom kada se promijene brojevi glasova ankete na stranici.
34 * @property {Function} isSiteAdmin - Vraća je li gledatelj admin ili moderator tenant-a. Poznato nakon prvog dohvata.
35 * @property {FastCommentsUIExtensionMenuBottomCallback} [menuBottom] - (LEGACY) Vraća HTML koji se dodaje na dno elementa izbornika za svaki komentar.
36 * @property {FastCommentsUIExtensionRenderCallback} [onRender]
37 * @property {FastCommentsUIExtensionConnectionStatusCallback} [onLiveConnectionStatusUpdate]
38 * @property {FastCommentsUIExtensionInitialRenderCallback} [onInitialRenderComplete]
39 * @property {FastCommentsUIExtensionPresenceUpdateCallback} [onPresenceUpdate]
40 */
41
42/**
43 * @callback FastCommentsUIExtensionSetupEventHandlers
44 * @param {Element} element - Korijenski element.
45 * @param {Object.<string, Function>} clickListeners - Rukovatelji događajima za klikove, po nazivu klase, koje se mogu mijenjati po referenci.
46 * @returns void
47 */
48
49/**
50 * @callback FastCommentsUIExtensionWidgetTopCallback
51 * @param {Object} moduleData
52 * @returns {string}
53 */
54
55/**
56 * @callback FastCommentsUIExtensionWidgetFilter
57 * @param {Object} moduleData
58 * @param {Object} html
59 * @returns {string}
60 */
61
62/**
63 * @callback FastCommentsUIExtensionCommentTopCallback
64 * @param {Object} comment
65 * @returns {string}
66 */
67
68/**
69 * @callback FastCommentsUIExtensionCommentTopFilter
70 * @param {Object} comment
71 * @param {string} html
72 * @returns {string}
73 */
74
75/**
76 * @callback FastCommentsUIExtensionCommentBottomCallback
77 * @param {Object} comment
78 * @returns {string}
79 */
80
81/**
82 * @callback FastCommentsUIExtensionMenuBottomCallback
83 * @param {Object} comment
84 * @returns {string}
85 */
86
87/**
88 * @callback FastCommentsUIExtensionMenuFilter
89 * @param {Object} comment
90 * @param {string} html
91 * @returns {string}
92 */
93
94/**
95 * @callback FastCommentsUIExtensionRenderCallback
96 * @returns {string}
97 */
98
99/**
100 * @callback FastCommentsUIExtensionConnectionStatusCallback
101 * @param {boolean} isConnected
102 * @returns {void}
103 */
104
105/**
106 * @callback FastCommentsUIExtensionInitialRenderCallback
107 * @returns {void}
108 */
109
110/**
111 * @callback FastCommentsUIExtensionReplyAreaTop
112 * @param {Object|null} currentUser
113 * @param {boolean} isSaving
114 * @param {boolean} isReplyOpen
115 * @param {string|null} parentId
116 * @returns {string}
117 */
118
119/**
120 * @callback FastCommentsUIExtensionReplyAreaFilter
121 * @param {Object|null} currentUser
122 * @param {boolean} isSaving
123 * @param {boolean} isReplyOpen
124 * @param {string|null} parentId
125 * @param {string|null} html
126 * @returns {string}
127 */
128
129/**
130 * @callback FastCommentsUIExtensionPrepareCommentForSavingCallback
131 * @param {Object} comment
132 * @param {string} parentId
133 */
134
135/**
136 * @callback FastCommentsUIExtensionNewCommentCallback
137 * @param {Object} comment
138 */
139
140/**
141 * @callback FastCommentsUIExtensionPresenceUpdateCallback
142 * @param {Object} update
143 */
144

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