Qt World Summit Conference App
import Felgo 3.0
import QtQuick 2.0
QtObject {
id: _
property string location: "Berlin"
property string qtwsApiScheduleUrl: Qt.resolvedUrl("https://www.qtworldsummit.com/2019/api/schedule/all/?location=" + _.location)
readonly property string qtwsApiSpeakersUrl: Qt.resolvedUrl("https://www.qtworldsummit.com/2019/api/speakers/all/")
readonly property string qtwsApiVersionUrl: Qt.resolvedUrl("https://www.qtworldsummit.com/2019/api/version/show/")
readonly property string fallbackScheduleUrl: Qt.resolvedUrl("../../assets/data/schedule.json")
readonly property string fallbackSpeakersUrl: Qt.resolvedUrl("../../assets/data/speakers.json")
readonly property string fallbackVersionUrl: Qt.resolvedUrl("../../assets/data/version.json")
Component.onCompleted: {
HttpNetworkActivityIndicator.activationDelay = 0
}
function sendGetRequest(url, successHandler, errorHandler) {
HttpRequest.get(url)
.then(function(res) {
var fixedResponse = res.text.replace(new RegExp("&",'g'),"&")
successHandler(JSON.parse(fixedResponse))
})
.catch(function(err) {
console.error("Error: Failed to load data from "+url+", error = "+err.message)
if(errorHandler !== undefined)
errorHandler()
else if(!loading)
dataModel.loadingFailed()
})
}
function checkAPIVersion(useLocalData) {
var versionUrl = useLocalData ? _.fallbackVersionUrl : _.qtwsApiVersionUrl
_.sendGetRequest(versionUrl, function(data) {
var currVersion = data.version
if(!system.publishBuild || dataModel.version === undefined || dataModel.version !== currVersion) {
dataModel.version = currVersion
_.loadSchedule(useLocalData)
}
}, function() {
if(dataModel.version === undefined && useLocalData === undefined)
checkAPIVersion(true)
else if(!loading)
dataModel.loadingFailed()
})
}
function loadSchedule(useLocalData) {
var scheduleUrl = useLocalData ? _.fallbackScheduleUrl : _.qtwsApiScheduleUrl
_.sendGetRequest(scheduleUrl, function(data) {
_.processScheduleData(data)
_.loadSpeakers(useLocalData)
})
}
function loadSpeakers(useLocalData) {
var speakersUrl = useLocalData ? _.fallbackSpeakersUrl : _.qtwsApiSpeakersUrl
_.sendGetRequest(speakersUrl, function(data) {
_.processSpeakersData(data)
storage.setValue("version", dataModel.version)
})
}
function processScheduleData(data) {
var tracks = {}
var talks = {}
for(var day in data.conference.days) {
for(var room in data.conference.days[day]["rooms"])
for (var eventIdx in data.conference.days[day]["rooms"][room]) {
var event = data.conference.days[day]["rooms"][room][eventIdx]
var start = event.start.split(":")
var duration = event.duration.split(":")
var end = [parseInt(start[0])+parseInt(duration[0]),
parseInt(start[1])+parseInt(duration[1])]
if(end[1] >= 60) {
end[1] -= 60
end[0] += 1
}
event.start = _.format2DigitTime(start[0]) + ":" + _.format2DigitTime(start[1])
event.end = _.format2DigitTime(end[0]) + ":" + _.format2DigitTime(end[1])
if(event.start.substring(1,2) == ':') {
event.start = "0"+event.start
}
event.day = day
if(event["tracks"] !== undefined && Array.isArray(event["tracks"])) {
for(var idx in event["tracks"]) {
tracks[event["tracks"][idx].name] = event["tracks"][idx].color
}
}
if(event["room"] == "Berlin" || event["room"] == ":")
event["room"] = ""
talks[event["id"]] = event
data.conference.days[day]["rooms"][room][eventIdx] = event["id"]
}
}
dataModel.talks = talks
dataModel.tracks = tracks
dataModel.schedule = data
storage.setValue("talks", talks)
storage.setValue("tracks", tracks)
storage.setValue("schedule", data)
dataModel.preparedTracks = viewHelper.prepareTracks(tracks)
var favorites = dataModel.favorites
dataModel.favorites = undefined
dataModel.favorites = favorites
}
function processSpeakersData(data) {
var speakers = {}
for(var i = 0; i < data.length; i++) {
var speaker = data[i]
speakers[speaker.id] = speaker
var talks= []
for (var j in Object.keys(dataModel.talks)) {
var talkID = Object.keys(dataModel.talks)[j];
var talk = dataModel.talks[parseInt(talkID)]
var persons = talk.persons
for(var k in persons) {
if(persons[k].id === speaker.id) {
talks.push(talkID.toString())
}
}
}
speakers[speaker.id]["talks"] = talks
}
dataModel.speakers = speakers
dataModel.preparedSpeakers = viewHelper.prepareSpeakers(speakers)
storage.setValue("speakers", speakers)
}
function format2DigitTime(time) {