BangleApps_old/apps/heatsuite/heatsuite.survey.js

228 lines
7.0 KiB
JavaScript

var surveyFileJSON = "heatsuite.survey.json";
var Layout = require("Layout");
const modHS = require('HSModule');
var layout;
var TaskScreenTimeout;
Bangle.setOptions({
'backlightTimeout':30000,
'lockTimeout':30000
});
var settings = modHS.getSettings();
//randomize question order
function shuffle(array) {
const result = [];
var itemsLeft = array;
while (itemsLeft.length) {
var Item;
if (itemsLeft[0].orderFix !== undefined && itemsLeft[0].orderFix == true) {
Item = itemsLeft.splice(0, 1)[0];
} else {
var randomIndex = Math.floor(Math.random() * itemsLeft.length);
Item = itemsLeft.splice(randomIndex, 1)[0];
}
result.push(Item); // ...and add it to the result
}
return result;
}
var surveyFile = require('Storage').readJSON(surveyFileJSON, true) || {"questions":[{"text":{"en_GB":"Thermal Comfort?"},"options":[{"text":{"en_GB":"Comfortable"},"value":0,"color":"#ffffff","btnColor":"#38ed35"},{"text":{"en_GB":"Uncomfortable"},"value":1,"color":"#ffffff","btnColor":"#ff0019"}],"tod":[[0,2359]],"key":"comfort"}],"supported":{"en_GB":"English (GB)"}};
var QArr = surveyFile.questions;
if (settings.surveyRandomize !== undefined && settings.surveyRandomize) {
QArr = shuffle(QArr);
}
function log(msg) {
if (!settings.DEBUG) {
return;
} else {
console.log(msg);
}
}
var appCache = modHS.getCache();
var lang = settings.lang || require("locale").name || "en_GB";
function queueTaskScreenTimeout() {
if (TaskScreenTimeout) clearTimeout(TaskScreenTimeout);
if (TaskScreenTimeout === undefined) {
TaskScreenTimeout = setTimeout(function () {
Bangle.load();
}, 180000);
}
}
/** -----------==== SURVEYS ====---------------- */
var scrollInterval;
function drawScrollingText(text,height) {
Bangle.appRect = { x: 0, y: height, w: g.getWidth(), h: g.getHeight() - height, x2: g.getWidth()-1, y2: g.getHeight()-1 };
let stringWidth = g.stringWidth(text);
let textX = (stringWidth > g.getWidth())? (stringWidth/2) : 0;
g.setColor("#000");
g.setBgColor("#FFF");
g.setFont("Vector:20", 2);
g.clearRect(0, 0, g.getWidth(), height);
function QuestionText() {
g.setColor("#000");
g.setBgColor("#FFF");
g.setFont("Vector:20", 2);
g.clearRect(0, 0, g.getWidth(), height);
g.drawString(text, textX, height/2);
textX -= 5;
if (textX < (-(stringWidth/2)+g.getWidth())) textX = (stringWidth/2);
g.flip();
}
if(scrollInterval) clearTimeout(scrollInterval);
if(stringWidth > g.getWidth()){
scrollInterval = setInterval(QuestionText, 60); //will need to scroll as its too long
}else{
QuestionText();
}
}
function drawResponseOpts(ind){
//force scrolling of question at the top
var question = QArr[ind];
drawScrollingText(question.text[lang].replace(/\\n/g, " "),30);
var height = 30;
var options = question.options;
if(options.length < 4){
height = Math.floor(Bangle.appRect.h / options.length);
}
let drawItem = function (idx,r){
var optionText = options[idx].value;
if (options[idx].text !== undefined) {
optionText = options[idx].text[lang];
}
g.setColor((options[idx].color)?options[idx].color:"#000");
g.setBgColor((options[idx].btnColor)?options[idx].btnColor:"#CCC").clearRect(r.x,r.y,r.x+r.w-1,r.y+r.h-1);
g.setFontAlign(0, 0, 0);
g.setFont("Vector:20").drawString(optionText,r.x+(g.getWidth()/2),r.y+(height/2));
};
let selectItem = function(id) {
var resp = (options[id] && options[id].text && lang in options[id].text) ? options[id].text[lang] : options[id].value;
const cbString = ind + "," + question.key + "," + resp + "," + options[id].value;
return surveyResponse(cbString);
};
E.showScroller({
h : height,
c : options.length,
draw : drawItem,
select : selectItem
});
}
function drawSurveyLayout(index) {
if(scrollInterval) clearTimeout(scrollInterval);
if (surveyFile === undefined) {
log('No Survey File');
E.showAlert("No Survey File Found.").then(function () {
Bangle.showClock();
});
return;
}
if (index == QArr.length) {
//at the end, so we can show a saved image and redirect to time screen
g.clear();
g.reset();
g.setBgColor("#FFF");
Bangle.buzz(150);
layout = new Layout({
type: "v",
c: [{
type: "img",
pad: 4,
src: require("heatshrink").decompress(atob("ikUwYFCgVJkgMDhMkyVJAwQFCAQNAgESAoQCBwEBBwlIgAFDpNkyAjDkm/5MEBwdf+gUEl/6AoVZkmX/oLClv6pf+DQn1/4+E3//0gFBkACBv/SBYI7D5JiDLJx9CBAR4CAoWQQ4Z9DgAA=="))
},
{
type: "txt",
font: "Vector:30",
label: "Done!"
}]
});
layout.render();
setTimeout(function () {
Bangle.load();
}, 500);
return;
}
var question = QArr[index];
var dateN = new Date();
if (question.tod !== undefined && question.tod.length > 0) {
//Now we need to see if we are in window of the day that we are eligible to ask the question
var windowOfDay = false;
var currMT = parseInt(dateN.getHours() + "" + dateN.getMinutes());
for (let d = 0; d < question.tod.length; d++) {
if (currMT > question.tod[d][0] && currMT < question.tod[d][1]) {
windowOfDay = true;
break;
}
}
if (!windowOfDay) {
drawSurveyLayout(index + 1);
return;
}
}
if (appCache.survey !== undefined){ //first time we are asking this question
if(appCache.survey[question.key] !== undefined) {
//lets just check if this survey question can be shown right now, otherwise we will skip it
var lastS = new Date(appCache.survey[question.key].unix * 1000);
if (question.oncePerDay !== undefined && question.oncePerDay) { // check if we can only show survey once a day and if we already have
//if (dateN.getFullYear() + dateN.getMonth() + dateN.getDate() === lastS.getFullYear() + lastS.getMonth() + lastS.getDate()) {
if(Math.floor(dateN.getTime() / 86400000) === Math.floor(lastS.getTime() / 86400000)){
drawSurveyLayout(index + 1);
return;
}
}
}
}
Bangle.buzz(100);
g.clear();
g.reset();
var out = {
type: "v",
c: []
};
//default to English if question isn't translated
if (!question.text[lang]) {
lang = "en_GB";
}
var questionText = question.text[lang].replace(/\\n/g, "\n");
var q = {
type: "txt",
wrap: true,
fillx: 1,
filly: 1,
font: "Vector:20",
label: questionText,
id: "label"
};
out.c.push(q);
var optFont = 'Vector:30';
if (question.optFont !== undefined) optFont = question.optFont;
var opt = {
type: "btn",
font: optFont,
label: ">>",
pad: 1,
btnFaceCol: "#0f0",
cb: l => drawResponseOpts(index)
};
out.c.push(opt);
layout = new Layout(out);
layout.render();
return;
}
function surveyResponse(text) {
var arr = text.split(',');
var nextSurvey = parseInt(arr[0]) + 1;
let newArr = {
"key": arr[1],
"resp": arr[2],
"value": arr[3]
}
modHS.saveDataToFile('survey', 'survey', newArr);
drawSurveyLayout(nextSurvey);
}
drawSurveyLayout(0);
queueTaskScreenTimeout();