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 * אובייקט ההרחבה FastCommentsUI. משמש לטעינה עצלה של רכיבים מסוימים. לדוגמה, מערכת הסקירות אינה
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 - הפנייה לאובייקט המכיל את כל ההערות לפי מזהה, המתעדכן באופן שוטף.
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] - נקראת עם התגובה שעומדת להישלח. החזרת false מבטלת את השליחה (לדוגמה כאשר סקר מצורף אינו שלם).
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 {FastCommentsUIExtensionCommentBottomCallback} [commentContentBottom] - מחזיר HTML להוספה אחרי טקסט התגובה, בתוך אלמנט תוכן התגובה (משמש בסקרים).
30 * @property {Function} [replyAreaInputBottom] - מחזיר HTML להוספה בתוך מסגרת קלט התגובה, מתחת לשדה הטקסט (משמש בסקרים לעורך הסקר במקום). מקבל את מזהה ההורה של התגובה, או null לתיבת השדה הראשית.
31 * @property {Function} [onPollUpdate] - נקראת עם האירוע החי כאשר ספירות הקולות של סקר בעמוד משתנות.
32 * @property {Function} isSiteAdmin - מחזירה האם הצופה הוא מנהל או מודרטור של השוכרת. ידוע לאחר הפנייה הראשונה.
33 * @property {FastCommentsUIExtensionMenuBottomCallback} [menuBottom] - (LEGACY) מחזיר HTML להוספה לתחתית אלמנט התפריט עבור כל תגובה.
34 * @property {FastCommentsUIExtensionRenderCallback} [onRender]
35 * @property {FastCommentsUIExtensionConnectionStatusCallback} [onLiveConnectionStatusUpdate]
36 * @property {FastCommentsUIExtensionInitialRenderCallback} [onInitialRenderComplete]
37 * @property {FastCommentsUIExtensionPresenceUpdateCallback} [onPresenceUpdate]
38 */
39
40/**
41 * @callback FastCommentsUIExtensionSetupEventHandlers
42 * @param {Element} element - אלמנט השורש.
43 * @param {Object.<string, Function>} clickListeners - מאפשי אירועי לחיצה, לפי שם מחלקה, שניתן לשנות בהתייחסות.
44 * @returns void
45 */
46
47/**
48 * @callback FastCommentsUIExtensionWidgetTopCallback
49 * @param {Object} moduleData
50 * @returns {string}
51 */
52
53/**
54 * @callback FastCommentsUIExtensionWidgetFilter
55 * @param {Object} moduleData
56 * @param {Object} html
57 * @returns {string}
58 */
59
60/**
61 * @callback FastCommentsUIExtensionCommentTopCallback
62 * @param {Object} comment
63 * @returns {string}
64 */
65
66/**
67 * @callback FastCommentsUIExtensionCommentTopFilter
68 * @param {Object} comment
69 * @param {string} html
70 * @returns {string}
71 */
72
73/**
74 * @callback FastCommentsUIExtensionCommentBottomCallback
75 * @param {Object} comment
76 * @returns {string}
77 */
78
79/**
80 * @callback FastCommentsUIExtensionMenuBottomCallback
81 * @param {Object} comment
82 * @returns {string}
83 */
84
85/**
86 * @callback FastCommentsUIExtensionMenuFilter
87 * @param {Object} comment
88 * @param {string} html
89 * @returns {string}
90 */
91
92/**
93 * @callback FastCommentsUIExtensionRenderCallback
94 * @returns {string}
95 */
96
97/**
98 * @callback FastCommentsUIExtensionConnectionStatusCallback
99 * @param {boolean} isConnected
100 * @returns {void}
101 */
102
103/**
104 * @callback FastCommentsUIExtensionInitialRenderCallback
105 * @returns {void}
106 */
107
108/**
109 * @callback FastCommentsUIExtensionReplyAreaTop
110 * @param {Object|null} currentUser
111 * @param {boolean} isSaving
112 * @param {boolean} isReplyOpen
113 * @param {string|null} parentId
114 * @returns {string}
115 */
116
117/**
118 * @callback FastCommentsUIExtensionReplyAreaFilter
119 * @param {Object|null} currentUser
120 * @param {boolean} isSaving
121 * @param {boolean} isReplyOpen
122 * @param {string|null} parentId
123 * @param {string|null} html
124 * @returns {string}
125 */
126
127/**
128 * @callback FastCommentsUIExtensionPrepareCommentForSavingCallback
129 * @param {Object} comment
130 * @param {string} parentId
131 */
132
133/**
134 * @callback FastCommentsUIExtensionNewCommentCallback
135 * @param {Object} comment
136 */
137
138/**
139 * @callback FastCommentsUIExtensionPresenceUpdateCallback
140 * @param {Object} update
141 */
142

ממשק 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