mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2024-11-24 02:27:19 +00:00
108 lines
3.3 KiB
JavaScript
108 lines
3.3 KiB
JavaScript
/*\
|
|
title: $:/plugins/tiddlywiki/consent-banner/startup.js
|
|
type: application/javascript
|
|
module-type: startup
|
|
|
|
Startup initialisation
|
|
|
|
\*/
|
|
(function(){
|
|
|
|
/*jslint node: true, browser: true */
|
|
/*global $tw: false */
|
|
"use strict";
|
|
|
|
// Export name and synchronous status
|
|
exports.name = "consent-banner";
|
|
exports.platforms = ["browser"];
|
|
exports.after = ["startup"];
|
|
exports.before = ["render"];
|
|
exports.synchronous = true;
|
|
|
|
var CHECK_CONSENT_INTERVAL = 1000, // Milliseconds between checking local storage
|
|
IS_LOGGED_IN_TITLE = "$:/status/IsLoggedIn",
|
|
CONSENT_KEY = "COOKIE_CONSENT", // Local storage keyname
|
|
CONSENT_TITLE = "$:/state/consent-banner/accepted", // "": undeclared, "yes": accepted, "no": declined
|
|
CONFIG_BLOCK_EMBEDDED_CONTENT_TITLE = "$:/config/plugins/tiddlywiki/consent-banner/block-embedded-content",
|
|
EMBEDDED_MESSAGE_WRAPPER_TITLE = "$:/plugins/tiddlywiki/consent-banner/blocked-embed-message-wrapper";
|
|
|
|
exports.startup = function() {
|
|
var consentState = "",
|
|
setConsentStatus = function(state) {
|
|
if(consentState !== state) {
|
|
consentState = state;
|
|
// Write to local storage
|
|
window.localStorage.setItem(CONSENT_KEY,state);
|
|
// Write to a state tiddler
|
|
$tw.wiki.addTiddler(new $tw.Tiddler({
|
|
title: CONSENT_TITLE,
|
|
text: state
|
|
}));
|
|
}
|
|
},
|
|
calculateConsentStatus = function() {
|
|
// Consent is implied for logged in users, otherwise we check local storage
|
|
return ($tw.wiki.getTiddlerText(IS_LOGGED_IN_TITLE) === "yes" && "yes") || window.localStorage.getItem(CONSENT_KEY) || "";
|
|
},
|
|
checkConsentStatus = function() {
|
|
setConsentStatus(calculateConsentStatus());
|
|
if(consentState === "") {
|
|
pollConsentStatus();
|
|
}
|
|
},
|
|
pollConsentStatus = function() {
|
|
setTimeout(checkConsentStatus,CHECK_CONSENT_INTERVAL);
|
|
};
|
|
// Set the current consent status
|
|
checkConsentStatus();
|
|
// Listen for consent messages
|
|
$tw.rootWidget.addEventListener("tm-consent-accept",function(event) {
|
|
setConsentStatus("yes");
|
|
});
|
|
$tw.rootWidget.addEventListener("tm-consent-decline",function(event) {
|
|
setConsentStatus("no");
|
|
});
|
|
$tw.rootWidget.addEventListener("tm-consent-clear",function(event) {
|
|
setConsentStatus("");
|
|
});
|
|
// Add our element rendering hook
|
|
if($tw.wiki.getTiddlerText(CONFIG_BLOCK_EMBEDDED_CONTENT_TITLE,"no") === "yes") {
|
|
$tw.hooks.addHook("th-rendering-element",function(parseTreeNodes,widget) {
|
|
if(parseTreeNodes) {
|
|
return parseTreeNodes;
|
|
}
|
|
if(["iframe","object","embed"].indexOf(widget.tag) !== -1 && widget.getVariable("tv-block-embedded-content","no") === "yes") {
|
|
var url = widget.getAttribute("src"),
|
|
addUnitsIfMissing = function(str) {
|
|
str = "" + str;
|
|
return str + (("" + parseInt(str,10)) === str ? "px" : "");
|
|
},
|
|
width = addUnitsIfMissing(widget.getAttribute("width","")),
|
|
height = addUnitsIfMissing(widget.getAttribute("height",""));
|
|
return [
|
|
{
|
|
type: "vars",
|
|
attributes: {
|
|
url: {type: "string", value: url},
|
|
width: {type: "string", value: width},
|
|
height: {type: "string", value: height}
|
|
},
|
|
children: [
|
|
{
|
|
type: "transclude",
|
|
attributes: {
|
|
tiddler: {type: "string", value: EMBEDDED_MESSAGE_WRAPPER_TITLE},
|
|
mode: {type: "string", value: "inline"}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
];
|
|
}
|
|
return null;
|
|
});
|
|
}
|
|
};
|
|
|
|
})();
|