Twitter Demo App
import QtQuick 2.0
import Felgo 3.0
Item {
id: dataModel
property alias dispatcher: logicConnection.target
readonly property alias currentProfile: _.currentProfile
readonly property alias timeline: _.timeline
readonly property alias messages: _.messages
readonly property alias firstTweetData: _.firstTweetData
Connections {
id: logicConnection
onFetchTwitterData: {
console.debug("Loading datamodel...")
HttpRequest.get(Qt.resolvedUrl("../data/user.json"))
.then(function(res) {
_.currentProfile = JSON.parse(res.body)
})
HttpRequest.get(Qt.resolvedUrl("../data/feed.json"))
.then(function(res) {
var json = JSON.parse(res.body)
var model = []
_.firstTweetData = json[0]
for (var i = 0; i < json.length; i++) {
model.push(_.tweetModel(json[i]))
}
_.timeline = model
})
HttpRequest.get(Qt.resolvedUrl("../data/messages.json"))
.then(function(res) {
var raw = JSON.parse(res.body)
var model = []
for (var i = 0; i < raw.length; i++) {
var names = model.map(function(val) { return val.handle } )
var message = JSON.parse(JSON.stringify(raw[i]))
message.user = message.sender
message = _.tweetModel(message)
if (names.indexOf("@" + message.user.screen_name) === -1) {
message.actionsHidden = true
delete message.sender
delete message.image
delete message.retweeted
delete message.favorited
delete message.retweet_count
delete message.favorite_count
model.push(message)
}
}
_.messages = model
})
}
onAddTweet: {
var newTweet = JSON.parse(JSON.stringify(_.firstTweetData))
newTweet.user = _.currentProfile
newTweet.text = text
_.timeline.splice(0, 0, _.tweetModel(newTweet))
_.timelineChanged()
}
}
Item {
id: _
property var currentProfile
property var timeline
property var messages
property var firstTweetData
function tweetModel(data) {
console.log("TWEET MODEL: "+JSON.stringify(data))
var date = new Date(data.created_at.replace("+0000 ", "") + " UTC")
var text = data.text
if (!!data.entities && !!data.entities.urls) {
for (var j = 0; j < data.entities.urls.length; j++) {
var url = data.entities.urls[j]
text = text.replace(url.url, "<a href=\"" + url.url + "\">" + url.display_url + "</a>")
}
}
var image = null
if (!!data.entities && !!data.entities.media) {
for (var j = 0; j < data.entities.media.length; j++) {
var med = data.entities.media[j]
if (med.type === "photo") {
image = med.media_url
text = text.replace(med.url, "")
break
}
}
}
return {
"id": data.id,
"name": data.user.name,
"handle": "@" + data.user.screen_name,
"icon": data.user.profile_image_url.replace("_normal", "_bigger"),
"text": text,
"image": image,
"time": DateFormatter.prettyDateTime(date),
"retweet_count": data.retweet_count,
"favorite_count": data.favorite_count,
"retweeted": data.retweeted,
"favorited": data.favorited,
"user": data.user,
"actionsHidden": undefined
}