Add persistence of settings using cookies

This commit is contained in:
chylex 2017-05-21 01:08:41 +02:00
parent 03bc03c51d
commit 65a64b30bb
5 changed files with 77 additions and 50 deletions

View File

@ -84,6 +84,22 @@ var DOM = (function(){
*/ */
listen: (ele, event, callback) => ele.addEventListener(event, callback), listen: (ele, event, callback) => ele.addEventListener(event, callback),
/*
* Utility function to save an object into a cookie.
*/
saveToCookie: (name, obj, expiresInSeconds) => {
var expires = new Date(Date.now()+1000*expiresInSeconds).toUTCString();
document.cookie = name+"="+encodeURIComponent(JSON.stringify(obj))+";path=/;expires="+expires;
},
/*
* Utility function to load an object from a cookie.
*/
loadFromCookie: (name) => {
var value = document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)"+name+"\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1");
return value.length ? JSON.parse(decodeURIComponent(value)) : null;
},
/* /*
* Triggers a UTF-8 text file download. * Triggers a UTF-8 text file download.
*/ */

View File

@ -36,13 +36,13 @@ var GUI = (function(){
var force = type === "gui" && detail === "settings"; var force = type === "gui" && detail === "settings";
if (force){ if (force){
settings.ui.cbAutoscroll.checked = STATE.settings.autoscroll; settings.ui.cbAutoscroll.checked = SETTINGS.autoscroll;
settings.ui.optsAfterFirstMsg[STATE.settings.afterFirstMsg].checked = true; settings.ui.optsAfterFirstMsg[SETTINGS.afterFirstMsg].checked = true;
settings.ui.optsAfterSavedMsg[STATE.settings.afterSavedMsg].checked = true; settings.ui.optsAfterSavedMsg[SETTINGS.afterSavedMsg].checked = true;
} }
if (type === "setting" || force){ if (type === "setting" || force){
var autoscrollRev = !STATE.settings.autoscroll; var autoscrollRev = !SETTINGS.autoscroll;
// discord polyfills Object.values // discord polyfills Object.values
Object.values(settings.ui.optsAfterFirstMsg).forEach(ele => ele.disabled = autoscrollRev); Object.values(settings.ui.optsAfterFirstMsg).forEach(ele => ele.disabled = autoscrollRev);
@ -56,6 +56,7 @@ var GUI = (function(){
var setupStateChanged = function(detail){ var setupStateChanged = function(detail){
if (!registeredEvent){ if (!registeredEvent){
STATE.onStateChanged(stateChangedEvent); STATE.onStateChanged(stateChangedEvent);
SETTINGS.onSettingsChanged(stateChangedEvent);
registeredEvent = true; registeredEvent = true;
} }
@ -245,18 +246,18 @@ var GUI = (function(){
// events // events
settings.ui.cbAutoscroll.addEventListener("change", () => { settings.ui.cbAutoscroll.addEventListener("change", () => {
STATE.settings.autoscroll = settings.ui.cbAutoscroll.checked; SETTINGS.autoscroll = settings.ui.cbAutoscroll.checked;
}); });
Object.keys(settings.ui.optsAfterFirstMsg).forEach(key => { Object.keys(settings.ui.optsAfterFirstMsg).forEach(key => {
DOM.listen(settings.ui.optsAfterFirstMsg[key], "click", () => { DOM.listen(settings.ui.optsAfterFirstMsg[key], "click", () => {
STATE.settings.afterFirstMsg = key; SETTINGS.afterFirstMsg = key;
}); });
}); });
Object.keys(settings.ui.optsAfterSavedMsg).forEach(key => { Object.keys(settings.ui.optsAfterSavedMsg).forEach(key => {
DOM.listen(settings.ui.optsAfterSavedMsg[key], "click", () => { DOM.listen(settings.ui.optsAfterSavedMsg[key], "click", () => {
STATE.settings.afterSavedMsg = key; SETTINGS.afterSavedMsg = key;
}); });
}); });

48
src/tracker/settings.js Normal file
View File

@ -0,0 +1,48 @@
var CONSTANTS = {
AUTOSCROLL_ACTION_NOTHING: "optNothing",
AUTOSCROLL_ACTION_PAUSE: "optPause",
AUTOSCROLL_ACTION_SWITCH: "optSwitch"
};
var SETTINGS = (function(){
var root = {};
var settingsChangedEvents = [];
var triggerSettingsChanged = function(changeType, changeDetail){
for(var callback of settingsChangedEvents){
callback(changeType, changeDetail);
}
DOM.saveToCookie("DHT_SETTINGS", root, 60*60*24*365*5);
};
var defineTriggeringProperty = function(obj, property, value){
var name = "_"+property;
Object.defineProperty(obj, property, {
get: (() => obj[name]),
set: (value => {
obj[name] = value;
triggerSettingsChanged("setting", property);
})
});
obj[name] = value;
};
var loaded = DOM.loadFromCookie("DHT_SETTINGS") || {
"_autoscroll": true,
"_afterFirstMsg": CONSTANTS.AUTOSCROLL_ACTION_PAUSE,
"_afterSavedMsg": CONSTANTS.AUTOSCROLL_ACTION_PAUSE
};
defineTriggeringProperty(root, "autoscroll", loaded._autoscroll);
defineTriggeringProperty(root, "afterFirstMsg", loaded._afterFirstMsg);
defineTriggeringProperty(root, "afterSavedMsg", loaded._afterSavedMsg);
root.onSettingsChanged = function(callback){
settingsChangedEvents.push(callback);
};
return root;
})();

View File

@ -1,9 +1,3 @@
var CONSTANTS = {
AUTOSCROLL_ACTION_NOTHING: "optNothing",
AUTOSCROLL_ACTION_PAUSE: "optPause",
AUTOSCROLL_ACTION_SWITCH: "optSwitch"
};
var STATE = (function(){ var STATE = (function(){
var stateChangedEvents = []; var stateChangedEvents = [];
@ -13,41 +7,10 @@ var STATE = (function(){
} }
}; };
var defineTriggeringProperty = function(obj, type, property){
var name = "_"+property;
Object.defineProperty(obj, property, {
get: (() => obj[name]),
set: (value => {
obj[name] = value;
triggerStateChanged(type, property);
})
});
};
/*
* Internal settings class constructor.
*/
var SETTINGS = function(){
defineTriggeringProperty(this, "setting", "autoscroll");
defineTriggeringProperty(this, "setting", "afterFirstMsg");
defineTriggeringProperty(this, "setting", "afterSavedMsg");
};
/*
* Resets settings without triggering state changed event.
*/
SETTINGS.prototype._reset = function(){
this._autoscroll = true;
this._afterFirstMsg = CONSTANTS.AUTOSCROLL_ACTION_PAUSE;
this._afterSavedMsg = CONSTANTS.AUTOSCROLL_ACTION_PAUSE;
};
/* /*
* Internal class constructor. * Internal class constructor.
*/ */
var CLS = function(){ var CLS = function(){
this.settings = new SETTINGS();
this.resetState(); this.resetState();
}; };
@ -58,7 +21,6 @@ var STATE = (function(){
this._savefile = null; this._savefile = null;
this._isTracking = false; this._isTracking = false;
this._lastFileName = null; this._lastFileName = null;
this.settings._reset();
triggerStateChanged("data", "reset"); triggerStateChanged("data", "reset");
}; };

View File

@ -31,15 +31,15 @@ DISCORD.setupMessageRequestHook((channel, messages) => {
STATE.addDiscordChannel(info.server, info.type, channel, info.channel); STATE.addDiscordChannel(info.server, info.type, channel, info.channel);
var hasUpdatedFile = STATE.addDiscordMessages(channel, messages); var hasUpdatedFile = STATE.addDiscordMessages(channel, messages);
if (STATE.settings.autoscroll){ if (SETTINGS.autoscroll){
DOM.setTimer(() => { DOM.setTimer(() => {
var action = CONSTANTS.AUTOSCROLL_ACTION_NOTHING; var action = CONSTANTS.AUTOSCROLL_ACTION_NOTHING;
if (!hasUpdatedFile){ if (!hasUpdatedFile){
action = STATE.settings.afterSavedMsg; action = SETTINGS.afterSavedMsg;
} }
else if (!DISCORD.hasMoreMessages()){ else if (!DISCORD.hasMoreMessages()){
action = STATE.settings.afterFirstMsg; action = SETTINGS.afterFirstMsg;
} }
if ((action === CONSTANTS.AUTOSCROLL_ACTION_SWITCH && !DISCORD.selectNextTextChannel()) || action === CONSTANTS.AUTOSCROLL_ACTION_PAUSE){ if ((action === CONSTANTS.AUTOSCROLL_ACTION_SWITCH && !DISCORD.selectNextTextChannel()) || action === CONSTANTS.AUTOSCROLL_ACTION_PAUSE){
@ -81,12 +81,12 @@ STATE.onStateChanged((type, detail) => {
--untrackedRequests; --untrackedRequests;
} }
if (STATE.settings.autoscroll && DISCORD.isInMessageView()){ if (SETTINGS.autoscroll && DISCORD.isInMessageView()){
if (DISCORD.hasMoreMessages()){ if (DISCORD.hasMoreMessages()){
DISCORD.loadOlderMessages(); DISCORD.loadOlderMessages();
} }
else{ else{
var action = STATE.settings.afterFirstMsg; var action = SETTINGS.afterFirstMsg;
if ((action === CONSTANTS.AUTOSCROLL_ACTION_SWITCH && !DISCORD.selectNextTextChannel()) || action === CONSTANTS.AUTOSCROLL_ACTION_PAUSE){ if ((action === CONSTANTS.AUTOSCROLL_ACTION_SWITCH && !DISCORD.selectNextTextChannel()) || action === CONSTANTS.AUTOSCROLL_ACTION_PAUSE){
DOM.setTimer(() => STATE.toggleTracking(), 200); // give the user visual feedback after clicking the button before switching off DOM.setTimer(() => STATE.toggleTracking(), 200); // give the user visual feedback after clicking the button before switching off