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 {Function} [withSessionId] - קוראים לה עם כתובת URL של בקשה ופונקציית callback. מפעילה את ה-callback עם ה-URL ועליו מזהה הסשן של הצופה מצורף כאשר עוגיות צד שלישי נחסמות (אותו נתיב שבו משתמשות בקשות התגובה וההצבעה), או עם ה-URL ללא שינוי אחרת. כאשר אין מזהה סשן זמין בדרך זו, מצרפת את מזהה הסשן האנונימי האחרון שנמסר ל-rememberAnonSessionId, אם קיים. אינה בשימוש עבור SSO.
18 * @property {Function} [rememberAnonSessionId] - קוראים לה עם ה-anonSessionId שהחזירה תשובה. השרת מחזיר מזהה כזה רק לאורח שבקשתו לא כללה עוגיית סשן, ולעולם לא עבור סשן מחובר. המזהה נשמר ב-localStorage (או בזיכרון כאשר האחסון אינו זמין) כך ש-withSessionId תשלח אותו בבקשות מאוחרות יותר והאורח ישמור על זהות אחת.
19 * @property {FastCommentsUIExtensionSetupEventHandlers} [setupEventHandlers]
20 * @property {FastCommentsUIExtensionPrepareCommentForSavingCallback} [prepareCommentForSaving] - נקראת עם התגובה העומדת להתפרסם. החזירו false כדי לבטל את השליחה (למשל כאשר סקר מצורף אינו שלם).
21 * @property {FastCommentsUIExtensionNewCommentCallback} [newComment]
22 * @property {FastCommentsUIExtensionReplyAreaFilter} [replyAreaFilter] - סינון HTML עבור אזור התגובות.
23 * @property {FastCommentsUIExtensionWidgetFilter} [widgetFilter] - סינון HTML עבור הווידג'ט כולו בעת רינדור.
24 * @property {FastCommentsUIExtensionCommentTopFilter} [commentFilter] - סינון HTML עבור כל תגובה לפני רינדור.
25 * @property {FastCommentsUIExtensionReplyAreaFilter} [commentMenuFilter] - סינון HTML עבור התפריט של כל תגובה לפני רינדור.
26 * @property {FastCommentsUIExtensionMenuFilter} [menuFilter] - סינון HTML עבור הווידג'ט כולו בעת רינדור.
27 * @property {FastCommentsUIExtensionReplyAreaTop} [replyAreaTop] - (מיושן) מחזיר HTML להוספה בראש אזור התגובה.
28 * @property {FastCommentsUIExtensionWidgetTopCallback} [widgetTop] - (מיושן) מחזיר HTML להוספה בראש הווידג'ט.
29 * @property {FastCommentsUIExtensionCommentTopCallback} [commentTop] - (מיושן) מחזיר HTML להוספה בראש אלמנט התגובה.
30 * @property {FastCommentsUIExtensionCommentBottomCallback} [commentBottom] - (מיושן) מחזיר HTML להוספה בתחתית אלמנט התגובה.
31 * @property {FastCommentsUIExtensionCommentBottomCallback} [commentContentBottom] - מחזיר HTML להוספה אחרי טקסט התגובה, בתוך אלמנט תוכן התגובה (בשימוש על ידי סקרים).
32 * @property {Function} [replyAreaInputBottom] - מחזיר HTML להוספה בתוך מסגרת קלט התגובה, מתחת לשדה הטקסט (בשימוש על ידי סקרים עבור עורך הסקר המובנה). מקבל את מזהה תגובת האב, או null עבור תיבת התגובה הראשית.
33 * @property {Function} [onPollUpdate] - נקראת עם האירוע החי כאשר מספרי ההצבעות של סקר בדף משתנים.
34 * @property {Function} isSiteAdmin - מחזירה האם הצופה הוא מנהל או מנחה של הטננט. ידוע לאחר הבקשה הראשונה.
35 * @property {FastCommentsUIExtensionMenuBottomCallback} [menuBottom] - (מיושן) מחזיר HTML להוספה בתחתית אלמנט התפריט עבור כל תגובה.
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 - האלמנט הראשי.
45 * @param {Object.<string, Function>} clickListeners - מטפלי האירועים ללחיצות, לפי שם מחלקה, אשר ניתנים לשינוי על ידי הפניה.
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 של ההרחבה 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