FastComments.com

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 objekta proširenja
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 - Korijenski DOM čvor widgeta.
10 * @property {string} [css]
11 * @property {Object} config - FastComments konfiguracijski objekt.
12 * @property {Object} commentsById - Referenca na objekt sa svim komentarima po ID-u, koji se održava ažurnim.
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 lokalnu listu broadcast ID-eva koje treba ignorirati.
17 * @property {FastCommentsUIExtensionSetupEventHandlers} [setupEventHandlers]
18 * @property {FastCommentsUIExtensionPrepareCommentForSavingCallback} [prepareCommentForSaving]
19 * @property {FastCommentsUIExtensionNewCommentCallback} [newComment]
20 * @property {FastCommentsUIExtensionReplyAreaFilter} [replyAreaFilter] - Filtrira HTML za područje komentara.
21 * @property {FastCommentsUIExtensionWidgetFilter} [widgetFilter] - Filtrira HTML za cijeli widget pri renderiranju.
22 * @property {FastCommentsUIExtensionCommentTopFilter} [commentFilter] - Filtrira HTML za svaki komentar prije renderiranja.
23 * @property {FastCommentsUIExtensionReplyAreaFilter} [commentMenuFilter] - Filtrira HTML za svaki izbornik komentara prije renderiranja.
24 * @property {FastCommentsUIExtensionMenuFilter} [menuFilter] - Filtrira HTML za cijeli widget pri renderiranju.
25 * @property {FastCommentsUIExtensionReplyAreaTop} [replyAreaTop] - (ZASTARJELO) Vraća HTML za dodavanje na vrh područja odgovora.
26 * @property {FastCommentsUIExtensionWidgetTopCallback} [widgetTop] - (ZASTARJELO) Vraća HTML za dodavanje na vrh widgeta.
27 * @property {FastCommentsUIExtensionCommentTopCallback} [commentTop] - (ZASTARJELO) Vraća HTML za dodavanje na vrh elementa komentara.
28 * @property {FastCommentsUIExtensionCommentBottomCallback} [commentBottom] - (ZASTARJELO) Vraća HTML za dodavanje na dno elementa komentara.
29 * @property {FastCommentsUIExtensionMenuBottomCallback} [menuBottom] - (ZASTARJELO) Vraća HTML za dodavanje na dno elementa izbornika za svaki komentar.
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 - Korijenski element.
39 * @param {Object.<string, Function>} clickListeners - Handleri događaja za klikove, po nazivu klase, koje je moguće mijenjati preko reference.
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

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