FastComments.com

Tworzenie rozszerzeń

Tworzenie Extensions

Kontekst

FastComments umożliwia rozszerzanie naszej podstawowej funkcjonalności za pomocą skryptów, które nazywamy Extensions.

Extension może dodać dodatkowe elementy HTML do widżetu komentarzy, zarejestrować nasłuchiwacze zdarzeń i uruchamiać dowolny kod.

Tutaj znajdziesz przykłady extensions, które stosujemy w środowisku produkcyjnym, a także dokumentację dotyczącą tworzenia extensions.

Cykl życia rozszerzenia Internal Link

Skrypt dla każdego rozszerzenia jest pobierany i uruchamiany zanim widżet komentarzy zacznie pobierać pierwszy zestaw komentarzy i renderować UI.

Na początkowym ładowaniu następujące dane zostaną przypisane do obiektu rozszerzenia:

  • config - Odwołanie do obiektu config.
  • translations - Odwołanie do obiektu translations.
  • commentsById - Odwołanie do wszystkich komentarzy według id.
  • root - Odwołanie do głównego węzła DOM.

Rozszerzenia powinny nadpisać pożądane funkcje, które widżet komentarzy wywoła w odpowiednich momentach.

Definiowanie rozszerzenia Internal Link

Najmniejsze możliwe rozszerzenie wyglądałoby tak:

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

Na potrzeby tego przykładu zapisz to jako my-extension.js i udostępnij pod adresem https://example.com/my-extension.min.js.

To rozszerzenie nic nie robi, poza tym że przy załadowaniu pobiera obiekt rozszerzenia utworzony przez główną bibliotekę komentarzy.

Ten obiekt Extension jest singletonem i nie jest współdzielony z żadnymi innymi rozszerzeniami.

Następnie, aby załadować nasze rozszerzenie, musimy poinformować o nim widżet komentarzy. Na przykład:

Użycie niestandardowego rozszerzenia
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

Przykłady funkcjonalne znajdziesz w następnej sekcji.

Obiekt rozszerzenia Internal Link

Obiekt rozszerzenia składa się z następującej definicji:

Dokumentacja JSDoc obiektu Extension
Copy CopyRun External Link
1
2/**
3 * Obiekt rozszerzenia FastCommentsUI. Używany do leniwego ładowania określonych komponentów. Na przykład system recenzji nie jest
4 * używany przez wszystkich klientów, więc ładujemy to rozszerzenie tylko wtedy, gdy jest potrzebne.
5 *
6 * @typedef {Object} FastCommentsUIExtension
7 * @property {string} id
8 * @property {Element} scriptNode
9 * @property {Element} root - Węzeł DOM root widżetu.
10 * @property {string} [css]
11 * @property {Object} config - Obiekt konfiguracyjny FastComments.
12 * @property {Object} commentsById - Referencja do obiektu ze wszystkimi komentarzami według id, który jest na bieżąco aktualizowany.
13 * @property {Object} translations - Referencja do wszystkich tłumaczeń.
14 * @property {Function} reRenderComment - Referencja do funkcji, którą można wywołać, aby ponownie wyrenderować komentarz.
15 * @property {Function} removeCommentAndReRender - Referencja do funkcji, którą można wywołać, aby usunąć komentarz z pamięci i ponownie wyrenderować odpowiednią część DOM.
16 * @property {Function} newBroadcastId - Referencja do funkcji, którą można wywołać, aby utworzyć nowy broadcast id i dodać go do lokalnej listy broadcast id do ignorowania.
17 * @property {Function} [withSessionId] - Wywołaj z adresem URL żądania i callbackiem. Wywołuje callback z URL plus dołączonym id sesji przeglądającego, gdy ciasteczka stron trzecich są blokowane (ta sama ścieżka, której używają żądania komentarzy i głosów), lub niezmienionym URL w przeciwnym razie. Gdy w ten sposób nie jest dostępne żadne id sesji, dołącza ostatnie anonimowe id sesji przekazane do rememberAnonSessionId, jeśli istnieje. Nieużywane dla SSO.
18 * @property {Function} [rememberAnonSessionId] - Wywołaj z anonSessionId zwróconym przez odpowiedź. Serwer zwraca je tylko gościowi, którego żądanie nie miało ciasteczka sesji, i nigdy dla zalogowanej sesji. Jest przechowywane w localStorage (lub w pamięci, gdy magazyn jest niedostępny), dzięki czemu withSessionId wysyła je w kolejnych żądaniach, a gość zachowuje jedną tożsamość.
19 * @property {FastCommentsUIExtensionSetupEventHandlers} [setupEventHandlers]
20 * @property {FastCommentsUIExtensionPrepareCommentForSavingCallback} [prepareCommentForSaving] - Wywoływane z komentarzem, który ma zostać opublikowany. Zwróć false, aby anulować wysłanie (na przykład gdy dołączona ankieta jest niekompletna).
21 * @property {FastCommentsUIExtensionNewCommentCallback} [newComment]
22 * @property {FastCommentsUIExtensionReplyAreaFilter} [replyAreaFilter] - Filtruje HTML dla obszaru komentarzy.
23 * @property {FastCommentsUIExtensionWidgetFilter} [widgetFilter] - Filtruje HTML dla całego widżetu podczas renderowania.
24 * @property {FastCommentsUIExtensionCommentTopFilter} [commentFilter] - Filtruje HTML dla każdego komentarza przed renderowaniem.
25 * @property {FastCommentsUIExtensionReplyAreaFilter} [commentMenuFilter] - Filtruje HTML dla menu każdego komentarza przed renderowaniem.
26 * @property {FastCommentsUIExtensionMenuFilter} [menuFilter] - Filtruje HTML dla całego widżetu podczas renderowania.
27 * @property {FastCommentsUIExtensionReplyAreaTop} [replyAreaTop] - (LEGACY) Zwraca HTML do dodania na górze obszaru odpowiedzi.
28 * @property {FastCommentsUIExtensionWidgetTopCallback} [widgetTop] - (LEGACY) Zwraca HTML do dodania na górze widżetu.
29 * @property {FastCommentsUIExtensionCommentTopCallback} [commentTop] - (LEGACY) Zwraca HTML do dodania na górze elementu komentarza.
30 * @property {FastCommentsUIExtensionCommentBottomCallback} [commentBottom] - (LEGACY) Zwraca HTML do dodania na dole elementu komentarza.
31 * @property {FastCommentsUIExtensionCommentBottomCallback} [commentContentBottom] - Zwraca HTML do dodania po tekście komentarza, wewnątrz elementu treści komentarza (używane przez ankiety).
32 * @property {Function} [replyAreaInputBottom] - Zwraca HTML do dodania wewnątrz ramki pola komentarza, pod polem tekstowym (używane przez ankiety dla edytora ankiety w miejscu). Otrzymuje id komentarza nadrzędnego lub null dla głównego pola odpowiedzi.
33 * @property {Function} [onPollUpdate] - Wywoływane ze zdarzeniem live, gdy zmieniają się liczby głosów ankiety na stronie.
34 * @property {Function} isSiteAdmin - Zwraca informację, czy przeglądający jest administratorem lub moderatorem tenanta. Znane po pierwszym pobraniu.
35 * @property {FastCommentsUIExtensionMenuBottomCallback} [menuBottom] - (LEGACY) Zwraca HTML do dodania na dole elementu menu dla każdego komentarza.
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 - Element główny.
45 * @param {Object.<string, Function>} clickListeners - Handlery zdarzeń kliknięć, według nazwy klasy, które mogą być modyfikowane przez referencję.
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 rozszerzenia Internal Link

Interakcja z Extension jest prosta — wystarczy zdefiniować odniesienia do funkcji, które chcemy wywołać.

Bazując na wcześniejszym przykładzie, załóżmy, że chcemy dodać HTML na początku każdego komentarza:

Proste rozszerzenie - ciąg dalszy
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

Kiedykolwiek zwrócisz HTML w ten sposób, zostanie on scalony z interfejsem użytkownika za pomocą algorytmu porównywania DOM (dom-diffing).

Ręczne wywoływanie ponownego renderowania komentarza

Możemy poczekać na początkowe załadowanie strony i ręcznie ponownie wyrenderować komentarz, wywołując reRenderComment:

Ponowne renderowanie komentarza
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 nie jest wymagany, to tylko przykład.
20 }
21})();
22