FastComments.com

פיתוח הרחבות

הקשר

FastComments מספקת את היכולת להרחיב את הפונקציונליות הליבה שלנו באמצעות סקריפטים שאנו קוראים להם הרחבות.

ה-Extension יכול להוסיף סימון נוסף לווידג'ט התגובות, להוסיף מאזיני אירועים, ולהריץ קוד כלשהו.

כאן תמצאו דוגמאות להרחבות שלנו בסביבת הייצור, וכן תיעוד כיצד לכתוב הרחבות.


מחזור חיי ההרחבה 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.

תוסף זה אינו עושה דבר; בעת טעינה בלבד הוא מאחזר את אובייקט ה-Extension שנוצר על ידי ספריית ההערות המרכזית.

אובייקט ה-Extension הוא סינגלטון ואינו משותף עם תוספים אחרים.

בהמשך, כדי לטעון את התוסף שלנו, עלינו להודיע על כך לווידג'ט ההערות. לדוגמה:

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 * 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 - הפניה לפונקציה שניתן לקרוא לה כדי ליצור מזהה שידור חדש ולהוסיף אותו לרשימה מקומית של מזהי שידור שיש להתעלם מהם.
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] - (LEGACY) מחזיר HTML להוספה לראש אזור התגובה.
26 * @property {FastCommentsUIExtensionWidgetTopCallback} [widgetTop] - (LEGACY) מחזיר HTML להוספה לראש הווידג'ט.
27 * @property {FastCommentsUIExtensionCommentTopCallback} [commentTop] - (LEGACY) מחזיר HTML להוספה לראש אלמנט התגובה.
28 * @property {FastCommentsUIExtensionCommentBottomCallback} [commentBottom] - (LEGACY) מחזיר HTML להוספה לתחתית אלמנט התגובה.
29 * @property {FastCommentsUIExtensionMenuBottomCallback} [menuBottom] - (LEGACY) מחזיר 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 כזה, הוא יתמזג בממשק המשתמש באמצעות אלגוריתם 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); // אין צורך ב-timeout, זו רק דוגמה.
20 }
21})();
22