Mercurial > hg > isophonics-drupal-site
comparison core/modules/history/js/history.es6.js @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children | 1fec387a4317 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4c8ae668cc8c |
---|---|
1 /** | |
2 * @file | |
3 * JavaScript API for the History module, with client-side caching. | |
4 * | |
5 * May only be loaded for authenticated users, with the History module enabled. | |
6 */ | |
7 | |
8 (function ($, Drupal, drupalSettings, storage) { | |
9 const currentUserID = parseInt(drupalSettings.user.uid, 10); | |
10 | |
11 // Any comment that is older than 30 days is automatically considered read, | |
12 // so for these we don't need to perform a request at all! | |
13 const thirtyDaysAgo = Math.round(new Date().getTime() / 1000) - 30 * 24 * 60 * 60; | |
14 | |
15 // Use the data embedded in the page, if available. | |
16 let embeddedLastReadTimestamps = false; | |
17 if (drupalSettings.history && drupalSettings.history.lastReadTimestamps) { | |
18 embeddedLastReadTimestamps = drupalSettings.history.lastReadTimestamps; | |
19 } | |
20 | |
21 /** | |
22 * @namespace | |
23 */ | |
24 Drupal.history = { | |
25 | |
26 /** | |
27 * Fetch "last read" timestamps for the given nodes. | |
28 * | |
29 * @param {Array} nodeIDs | |
30 * An array of node IDs. | |
31 * @param {function} callback | |
32 * A callback that is called after the requested timestamps were fetched. | |
33 */ | |
34 fetchTimestamps(nodeIDs, callback) { | |
35 // Use the data embedded in the page, if available. | |
36 if (embeddedLastReadTimestamps) { | |
37 callback(); | |
38 return; | |
39 } | |
40 | |
41 $.ajax({ | |
42 url: Drupal.url('history/get_node_read_timestamps'), | |
43 type: 'POST', | |
44 data: { 'node_ids[]': nodeIDs }, | |
45 dataType: 'json', | |
46 success(results) { | |
47 for (const nodeID in results) { | |
48 if (results.hasOwnProperty(nodeID)) { | |
49 storage.setItem(`Drupal.history.${currentUserID}.${nodeID}`, results[nodeID]); | |
50 } | |
51 } | |
52 callback(); | |
53 }, | |
54 }); | |
55 }, | |
56 | |
57 /** | |
58 * Get the last read timestamp for the given node. | |
59 * | |
60 * @param {number|string} nodeID | |
61 * A node ID. | |
62 * | |
63 * @return {number} | |
64 * A UNIX timestamp. | |
65 */ | |
66 getLastRead(nodeID) { | |
67 // Use the data embedded in the page, if available. | |
68 if (embeddedLastReadTimestamps && embeddedLastReadTimestamps[nodeID]) { | |
69 return parseInt(embeddedLastReadTimestamps[nodeID], 10); | |
70 } | |
71 return parseInt(storage.getItem(`Drupal.history.${currentUserID}.${nodeID}`) || 0, 10); | |
72 }, | |
73 | |
74 /** | |
75 * Marks a node as read, store the last read timestamp client-side. | |
76 * | |
77 * @param {number|string} nodeID | |
78 * A node ID. | |
79 */ | |
80 markAsRead(nodeID) { | |
81 $.ajax({ | |
82 url: Drupal.url(`history/${nodeID}/read`), | |
83 type: 'POST', | |
84 dataType: 'json', | |
85 success(timestamp) { | |
86 // If the data is embedded in the page, don't store on the client | |
87 // side. | |
88 if (embeddedLastReadTimestamps && embeddedLastReadTimestamps[nodeID]) { | |
89 return; | |
90 } | |
91 | |
92 storage.setItem(`Drupal.history.${currentUserID}.${nodeID}`, timestamp); | |
93 }, | |
94 }); | |
95 }, | |
96 | |
97 /** | |
98 * Determines whether a server check is necessary. | |
99 * | |
100 * Any content that is >30 days old never gets a "new" or "updated" | |
101 * indicator. Any content that was published before the oldest known reading | |
102 * also never gets a "new" or "updated" indicator, because it must've been | |
103 * read already. | |
104 * | |
105 * @param {number|string} nodeID | |
106 * A node ID. | |
107 * @param {number} contentTimestamp | |
108 * The time at which some content (e.g. a comment) was published. | |
109 * | |
110 * @return {bool} | |
111 * Whether a server check is necessary for the given node and its | |
112 * timestamp. | |
113 */ | |
114 needsServerCheck(nodeID, contentTimestamp) { | |
115 // First check if the content is older than 30 days, then we can bail | |
116 // early. | |
117 if (contentTimestamp < thirtyDaysAgo) { | |
118 return false; | |
119 } | |
120 | |
121 // Use the data embedded in the page, if available. | |
122 if (embeddedLastReadTimestamps && embeddedLastReadTimestamps[nodeID]) { | |
123 return contentTimestamp > parseInt(embeddedLastReadTimestamps[nodeID], 10); | |
124 } | |
125 | |
126 const minLastReadTimestamp = parseInt(storage.getItem(`Drupal.history.${currentUserID}.${nodeID}`) || 0, 10); | |
127 return contentTimestamp > minLastReadTimestamp; | |
128 }, | |
129 }; | |
130 }(jQuery, Drupal, drupalSettings, window.localStorage)); |