FastComments.com

Розробка Extensions

Контекст

FastComments надає можливість розширювати нашу основну функціональність за допомогою скриптів, які ми називаємо Extensions.

Extension може додавати додаткову розмітку до віджета коментарів, реєструвати обробники подій та виконувати довільний код.

Тут ви знайдете приклади Extensions, які ми маємо у виробничому середовищі, а також документацію про те, як писати Extensions.


Життєвий цикл розширення Internal Link

Скрипт для кожного розширення завантажується та виконується до того, як віджет коментарів почне завантажувати перший набір коментарів і відображати інтерфейс користувача.

На початковому завантаженні до об'єкта розширення буде додано такі дані:

  • config - Посилання на об'єкт config.
  • translations - Посилання на об'єкт translations.
  • commentsById - Посилання на всі коментарі за id.
  • root - Посилання на кореневий DOM-вузол.

Розширення повинні перевизначити необхідні функції, які віджет коментарів викликатиме у відповідні моменти.

Визначення розширення Internal Link

Найменше можливе розширення виглядає так:

Просте розширення
Copy CopyRun External Link
1
2(function () {
3 const extension = FastCommentsUI.extensions.find((extension) => {
4 return extension.id === 'my-extension';
5 });
6})();
7

Для цього прикладу збережіть цей файл як my-extension.js і зробіть його доступним за адресою https://example.com/my-extension.min.js.

Це розширення нічого не робить, окрім того, що при завантаженні воно отримує об'єкт розширення, створений основною бібліотекою коментарів.

This Extension object is a singleton and is not shared with any other extensions.

Далі, щоб завантажити наше розширення, ми повинні повідомити віджет коментарів про нього. Наприклад:

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

Для функціональних прикладів див. наступний розділ.


Об'єкт розширення Internal Link

Об'єкт розширення складається з наступного визначення:

JSDoc об'єкта розширення
Copy CopyRun External Link
1
2/**
3 * Об'єкт розширення FastCommentsUI. Використовується для відкладеного (lazy) завантаження певних компонентів. Наприклад, система рецензій
4 * не використовується всіма клієнтами, тому ми завантажуємо це розширення лише тоді, коли воно потрібно.
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

API розширення Internal Link

Взаємодія з Extension проста: ми просто визначаємо посилання на функції, які хочемо викликати.

Продовжуючи попередній приклад, припустімо, що ми хочемо додати HTML зверху кожного коментаря:

Просте розширення — продовження
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

Коли ви повертаєте HTML таким чином, він буде об'єднаний з UI за допомогою алгоритму dom-diffing.

Ручний повторний рендер коментаря

Ми можемо дочекатися початкового завантаження сторінки і вручну повторно відрендерити коментар, викликавши reRenderComment:

Повторний рендер коментаря
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); // таймаут не обов'язковий, просто приклад.
20 }
21})();
22