FastComments.com

Развој проширења

Контекст

FastComments пружа могућност проширивања наше основне функционалности кроз скрипте које називамо Проширења.

An Extension може додати додатни маркуп у видџет за коментаре, слушаоце догађаја, и извршавати произвољан код.

Овдје ћете наћи примјере проширења која имамо у продукцији, као и документацију о томе како писати проширења.


Животни циклус екстензије Internal Link

Скрипт за свако проширење се преузима и позива прије него што виџет коментара започне преузимање првог сета коментара и рендеровање корисничког интерфејса.

При почетном учитавању, сљедећи подаци ће бити прикачени на објекат проширења:

  • config - Референца на објекат config.
  • translations - Референца на објекат translations.
  • commentsById - Референца на све коментаре по id.
  • root - Референца на root DOM чвор.

Проширења треба да препишу жељене функције, које ће виџет коментара позивати у одговарајућим тренуцима.

Дефинисање екстензије Internal Link

Najmanje moguće proširenje bi bilo:

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

Za svrhe ovog primjera, sačuvajte 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, osim što pri učitavanju dohvaća objekat proširenja koji je kreirala osnovna biblioteka komentara.

Ovaj Extension objekat je singleton i nije dijeljen sa bilo kojim drugim proširenjima.

Zatim, da bismo učitali naše proširenje, moramo obavijestiti widget za komentare o njemu. 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.

Објекат екстензије Internal Link

Објекат проширења се састоји од сљедеће дефиниције:

JSDoc објекта екстензије
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 - Коренски DOM чвор видгета.
10 * @property {string} [css]
11 * @property {Object} config - FastComments конфигурациони објекат.
12 * @property {Object} commentsById - Референца на објекат који садржи све коментаре по id-у, који се одржава ажурним.
13 * @property {Object} translations - Референца на све преводе.
14 * @property {Function} reRenderComment - Референца на функцију која може бити позвана да поново рендерује коментар.
15 * @property {Function} removeCommentAndReRender - Референца на функцију која може бити позвана да уклони коментар из меморије и поново рендерује одговарајући део DOM-а.
16 * @property {Function} newBroadcastId - Референца на функцију која може бити позвана да креира нови broadcast id и дода га у локалну листу broadcast id-јева које треба игнорисати.
17 * @property {FastCommentsUIExtensionSetupEventHandlers} [setupEventHandlers]
18 * @property {FastCommentsUIExtensionPrepareCommentForSavingCallback} [prepareCommentForSaving]
19 * @property {FastCommentsUIExtensionNewCommentCallback} [newComment]
20 * @property {FastCommentsUIExtensionReplyAreaFilter} [replyAreaFilter] - Филтрира HTML за област коментара.
21 * @property {FastCommentsUIExtensionWidgetFilter} [widgetFilter] - Филтрира HTML за цео видгет при рендеровању.
22 * @property {FastCommentsUIExtensionCommentTopFilter} [commentFilter] - Филтрира HTML за сваки коментар пре рендеровања.
23 * @property {FastCommentsUIExtensionReplyAreaFilter} [commentMenuFilter] - Филтрира HTML за мени сваког коментара пре рендеровања.
24 * @property {FastCommentsUIExtensionMenuFilter} [menuFilter] - Филтрира HTML за цео видгет при рендеровању.
25 * @property {FastCommentsUIExtensionReplyAreaTop} [replyAreaTop] - (ЗАСТАРЕЛО) Враћа HTML који се додаје на врх области за одговор.
26 * @property {FastCommentsUIExtensionWidgetTopCallback} [widgetTop] - (ЗАСТАРЕЛО) Враћа HTML који се додаје на врх видгета.
27 * @property {FastCommentsUIExtensionCommentTopCallback} [commentTop] - (ЗАСТАРЕЛО) Враћа HTML који се додаје на врх елемента коментара.
28 * @property {FastCommentsUIExtensionCommentBottomCallback} [commentBottom] - (ЗАСТАРЕЛО) Враћа HTML који се додаје на дно елемента коментара.
29 * @property {FastCommentsUIExtensionMenuBottomCallback} [menuBottom] - (ЗАСТАРЕЛО) Враћа HTML који се додаје на дно елемента менија за сваки коментар.
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 - Коренски елемент.
39 * @param {Object.<string, Function>} clickListeners - Обрађивачи догађаја за кликове, индексирани по имену класе, који се могу мењати по референци.
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

АПИ екстензије Internal Link

Interakcija sa Extension je jednostavna, jer jednostavno definišemo reference na funkcije koje želimo pozvati.

Da nadogradimo raniji primjer, recimo da želimo dodati HTML na vrh svakog komentara:

Jednostavna ekstenzija - 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 ovako, on će biti spojen u UI putem DOM-diffing algoritma.

Ručno pokretanje ponovnog renderovanja komentara

Možemo sačekati inicijalno učitavanje stranice i ručno ponovo renderovati komentar pozivanjem reRenderComment:

Ponovno renderovanje 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 nije potreban, samo primjer.
20 }
21})();
22