Refactor and reorganize scr.state.js in renderer

This commit is contained in:
chylex 2016-11-02 18:23:26 +01:00
parent b54ab16a39
commit 082e6d0a1a
2 changed files with 152 additions and 103 deletions

View File

@ -7,7 +7,6 @@ document.addEventListener("DOMContentLoaded", () => {
UTILS.readJsonFile(files[0], (obj, file) => {
if (SAVEFILE.isValid(obj)){
STATE.uploadFile(new SAVEFILE(obj));
updateChannelList();
}
else{
alert((obj ? "File '{}' has an invalid format." : "Could not parse '{}', see console for details.").replace("{}", file.name));
@ -23,28 +22,21 @@ document.addEventListener("DOMContentLoaded", () => {
GUI.onOptionMessagesPerPageChanged(() => {
STATE.setMessagesPerPage(GUI.getOptionMessagesPerPage());
updateMessageList();
});
STATE.setMessagesPerPage(GUI.getOptionMessagesPerPage());
GUI.onNavigationButtonClicked(action => {
STATE.updateCurrentPage(action);
updateMessageList();
});
var updateChannelList = function(){
updateMessageList(null);
GUI.updateChannelList(STATE.getChannelList(), channel => {
STATE.selectChannel(channel);
updateMessageList();
});
};
STATE.onChannelsRefreshed(channels => {
GUI.updateChannelList(channels, STATE.selectChannel);
});
var updateMessageList = function(){
STATE.onMessagesRefreshed(messages => {
GUI.updateNavigation(STATE.getCurrentPage(), STATE.getPageCount());
GUI.updateMessageList(STATE.getMessageList());
GUI.updateMessageList(messages);
GUI.scrollMessagesToTop();
};
});
});

View File

@ -1,4 +1,10 @@
var STATE = (function(){
var ROOT = {};
// ---------------
// State variables
// ---------------
var FILE;
var MSGS;
@ -6,6 +12,10 @@ var STATE = (function(){
var currentPage;
var messagesPerPage;
// -----------------
// Utility functions
// -----------------
var messageKeySorter = (key1, key2) => {
if (key1.length === key2.length){
return key1 > key2 ? 1 : key1 < key2 ? -1 : 0;
@ -15,94 +25,141 @@ var STATE = (function(){
}
};
return {
uploadFile: function(file){
FILE = file;
MSGS = null;
currentPage = 1;
},
getChannelList: function(){
var channels = FILE.getChannels();
return Object.keys(channels).map(key => ({ // reserve.txt
id: key,
name: channels[key].name,
server: FILE.getServer(channels[key].server),
msgcount: FILE.getMessageCount(key)
}));
},
getChannelName: function(channel){
return FILE.getChannelById(channel).name;
},
getUserName: function(user){
return FILE.getUserById(user).name;
},
selectChannel: function(channel){
selectedChannel = channel;
currentPage = 1;
MSGS = Object.keys(FILE.getMessages(channel)).sort(messageKeySorter);
},
getSelectedChannel: function(){
return selectedChannel;
},
getRawMessages: function(channel){
return channel ? FILE.getMessages(channel) : FILE.getAllMessages();
},
setMessagesPerPage: function(amount){
messagesPerPage = amount;
},
updateCurrentPage: function(action){
switch(action){
case "first": currentPage = 1; break;
case "prev": currentPage = Math.max(1, currentPage-1); break;
case "next": currentPage = Math.min(STATE.getPageCount(), currentPage+1); break;
case "last": currentPage = STATE.getPageCount(); break;
}
},
getMessageList: function(){
if (!MSGS){
return [];
}
var messages = FILE.getMessages(selectedChannel);
var startIndex = messagesPerPage*(currentPage-1);
return MSGS.slice(startIndex, !messagesPerPage ? undefined : startIndex+messagesPerPage).map(key => {
var message = messages[key];
return { // reserve.txt
user: FILE.getUser(message.u),
timestamp: message.t,
contents: message.m,
embeds: message.e,
attachments: message.a,
edited: (message.f&1) === 1
};
});
},
getCurrentPage: function(){
var total = getPageCount();
if (currentPage > total && total > 0){
currentPage = total;
}
return currentPage;
},
getPageCount: function(){
return !MSGS ? 0 : (!messagesPerPage ? 1 : Math.ceil(MSGS.length/messagesPerPage));
}
// ----------------------------------
// Channel and message refresh events
// ----------------------------------
var eventOnChannelsRefreshed;
var eventOnMessagesRefreshed;
var triggerChannelsRefreshed = function(){
eventOnChannelsRefreshed && eventOnChannelsRefreshed(ROOT.getChannelList());
};
var triggerMessagesRefreshed = function(){
eventOnMessagesRefreshed && eventOnMessagesRefreshed(ROOT.getMessageList());
};
ROOT.onChannelsRefreshed = function(callback){
eventOnChannelsRefreshed = callback;
};
ROOT.onMessagesRefreshed = function(callback){
eventOnMessagesRefreshed = callback;
};
// ------------------------------------
// File upload and basic data retrieval
// ------------------------------------
ROOT.uploadFile = function(file){
FILE = file;
MSGS = null;
currentPage = 1;
triggerChannelsRefreshed();
triggerMessagesRefreshed();
};
ROOT.getChannelName = function(channel){
return FILE.getChannelById(channel).name;
};
ROOT.getUserName = function(user){
return FILE.getUserById(user).name;
};
ROOT.getRawMessages = function(channel){
return channel ? FILE.getMessages(channel) : FILE.getAllMessages();
};
// --------------------------
// Channel list and selection
// --------------------------
ROOT.getChannelList = function(){
var channels = FILE.getChannels();
return Object.keys(channels).map(key => ({ // reserve.txt
id: key,
name: channels[key].name,
server: FILE.getServer(channels[key].server),
msgcount: FILE.getMessageCount(key)
}));
};
ROOT.selectChannel = function(channel){
currentPage = 1;
selectedChannel = channel;
MSGS = Object.keys(FILE.getMessages(channel)).sort(messageKeySorter);
triggerMessagesRefreshed();
};
ROOT.getSelectedChannel = function(){
return selectedChannel;
};
// ------------
// Message list
// ------------
ROOT.getMessageList = function(){
if (!MSGS){
return [];
}
var messages = FILE.getMessages(selectedChannel);
var startIndex = messagesPerPage*(ROOT.getCurrentPage()-1);
return MSGS.slice(startIndex, !messagesPerPage ? undefined : startIndex+messagesPerPage).map(key => {
var message = messages[key];
return { // reserve.txt
user: FILE.getUser(message.u),
timestamp: message.t,
contents: message.m,
embeds: message.e,
attachments: message.a,
edited: (message.f&1) === 1
};
});
};
// ----------
// Pagination
// ----------
ROOT.setMessagesPerPage = function(amount){
messagesPerPage = amount;
triggerMessagesRefreshed();
};
ROOT.updateCurrentPage = function(action){
switch(action){
case "first": currentPage = 1; break;
case "prev": currentPage = Math.max(1, currentPage-1); break;
case "next": currentPage = Math.min(ROOT.getPageCount(), currentPage+1); break;
case "last": currentPage = ROOT.getPageCount(); break;
}
triggerMessagesRefreshed();
};
ROOT.getCurrentPage = function(){
var total = ROOT.getPageCount();
if (currentPage > total && total > 0){
currentPage = total;
}
return currentPage;
};
ROOT.getPageCount = function(){
return !MSGS ? 0 : (!messagesPerPage ? 1 : Math.ceil(MSGS.length/messagesPerPage));
};
// End
return ROOT;
})();