import QtQuick 2.0 import Sailfish.Silica 1.0 import QtGraphicalEffects 1.0 import "../lib/API.js" as Logic import "./components/" Page { id: profilePage property ListModel tweets property string display_name: "" property string username: "" property string profileImage: "" property string profileBackground: "" property string note: "" property string url: "" property string user_id: "" property int statuses_count property int following_count property int followers_count property int favourites_count property int reblogs_count property int count_moments property bool locked: false property bool bot: false property bool following: false property bool requested: false property bool followed_by: false property bool blocking: false property bool muting: false property bool domain_blocking: false property date created_at WorkerScript { id: worker source: "../lib/Worker.js" onMessage: { console.log(JSON.stringify(messageObject)) if(messageObject.action.indexOf("accounts/search") > -1 ){ user_id = messageObject.data.id followers_count = messageObject.data.followers_count following_count = messageObject.data.following_count username = messageObject.data.acct display_name = messageObject.data.display_name profileImage = messageObject.data.avatar_static profileBackground = messageObject.data.header_static var msg = { 'action' : "accounts/relationships/", 'params' : [ {name: "id", data: user_id}], 'conf' : Logic.conf }; worker.sendMessage(msg); list.loadData("prepend") } if(messageObject.action === "accounts/relationships/"){ console.log(JSON.stringify(messageObject)) following= messageObject.data.following requested= messageObject.data.requested followed_by= messageObject.data.followed_by blocking= messageObject.data.blocking muting= messageObject.data.muting domain_blocking= messageObject.data.domain_blocking } switch (messageObject.key) { case 'followers_count': followers_count = messageObject.data break; case 'following_count': following_count = messageObject.data break; case 'acct': // line below was commented out, reason unknown // username = messageObject.data break; case 'locked': locked = messageObject.data break; case 'bot': bot = messageObject.data break; case 'created_at': created_at = messageObject.data break; case 'statuses_count': statuses_count = messageObject.data break; case 'note': note = messageObject.data break; case 'url': url = messageObject.data break; case 'following': following = messageObject.data followers_count = followers_count + (following ? 1 : - 1) break; case 'muting': muting = messageObject.data break; case 'blocking': blocking = messageObject.data followers_count = followers_count + (blocking ? -1 : 0) break; case 'followed_by': followed_by = messageObject.data break; } } } // The effective value will be restricted by ApplicationWindow.allowedOrientations allowedOrientations: Orientation.All Component.onCompleted: { var msg if (user_id) { msg = { 'action' : "accounts/relationships/", 'params' : [ {name: "id", data: user_id}], 'conf' : Logic.conf } worker.sendMessage(msg) msg = { 'action' : "accounts/"+user_id, 'conf' : Logic.conf } worker.sendMessage(msg) } else { var instance = Logic.conf['instance'].split("//") msg = { 'action' : "accounts/search?limit=1&q="+username.replace("@"+instance[1], ""), 'conf' : Logic.conf } worker.sendMessage(msg) } } MyList { id: list header: ProfileHeader { id: profileHeader title: display_name description: username image: profileImage bg: profileBackground } clip: true mdl: ListModel {} type: "accounts/"+user_id+"/statuses" vars: {} conf: Logic.conf anchors { top: parent.top bottom: profileExpander.top left: parent.left right: parent.right } } ExpandingSectionGroup { // ProfilePage ExpandingSection id: profileExpander anchors { bottom: parent.bottom left: parent.left right: parent.right } ExpandingSection { id: expandingSection1 title: qsTr("About") content.sourceComponent: Column { height: Math.min( txtContainer, parent.height * 0.7 ) spacing: Theme.paddingLarge Item { id: txtContainer width: parent.width height: Math.min( txtNote.height, parent.height * 0.55 ) visible: { if ((note.text === "") || ( note.text === "
" )) { false } else { true } } SilicaFlickable { id: txtFlickable contentWidth: parent.width contentHeight: txtNote.height anchors.fill: parent clip: true VerticalScrollDecorator {} Label { id: txtNote text: note textFormat: Text.StyledText color: Theme.secondaryColor font.pixelSize: Theme.fontSizeExtraSmall linkColor: Theme.highlightColor wrapMode: Text.Wrap width: parent.width - ( 2 * Theme.horizontalPageMargin ) anchors.horizontalCenter: parent.horizontalCenter onLinkActivated: { var test = link.split("/") console.log(link) console.log(JSON.stringify(test)) console.log(JSON.stringify(test.length)) if (test.length === 5 && (test[3] === "tags" || test[3] === "tag") ) { pageStack.pop(pageStack.find(function(page) { var check = page.isFirstPage === true; if (check) page.onLinkActivated(link) return check; })); send(link) } else if (test.length === 4 && test[3][0] === "@" ) { pageStack.pop(pageStack.find(function(page) { var check = page.isFirstPage === true; if (check) page.onLinkActivated(link) return check; })); } else { Qt.openUrlExternally(link); } } } } } Item { // dummy item for spacing height: Theme.paddingSmall } Row { id: statsRow spacing: Theme.paddingLarge anchors.horizontalCenter: parent.horizontalCenter anchors.leftMargin: Theme.paddingLarge anchors.rightMargin: Theme.paddingLarge Text { id: txtFollowers visible: followers_count ? true : false text: followers_count+" "+qsTr("Followers") font.pixelSize: Theme.fontSizeExtraSmall color: Theme.highlightColor wrapMode: Text.Wrap } Text { id: txtFollowing visible: following_count ? true : false text: following_count+" "+qsTr("Following") font.pixelSize: Theme.fontSizeExtraSmall color: Theme.highlightColor wrapMode: Text.Wrap } Text { id: txtStatuses visible: statuses_count ? true : false text: statuses_count+" "+qsTr("Statuses") font.pixelSize: Theme.fontSizeExtraSmall color: Theme.highlightColor wrapMode: Text.Wrap } /*Text { id: txtFavourites visible: favourites_count ? true : false text: favourites_count+" "+qsTr("Favourites") font.pixelSize: Theme.fontSizeExtraSmall color: Theme.highlightColor wrapMode: Text.Wrap } */ } Item { // dummy item for spacing height: Theme.paddingSmall } ButtonLayout { id: btnLayout Button { id: btnMention preferredWidth: Theme.buttonWidthSmall text: "Mention" onClicked: { pageStack.push(Qt.resolvedUrl("ConversationPage.qml"), { headerTitle: "Mention", description: "@"+username, type: "new" }) } } Button { id: btnFollow preferredWidth: Theme.buttonWidthSmall text: (following ? qsTr("Unfollow") : (requested ? qsTr("Requested") : qsTr("Follow"))) color: (following ? highlightColor : (requested ? palette.errorColor : palette.primaryColor)) onClicked: { var msg = { 'method' : 'POST', 'params' : [], 'action' : "accounts/" + user_id + (following ? '/unfollow':'/follow'), 'conf' : Logic.conf }; worker.sendMessage(msg); // to-do: create notification banner "Follow request sent!" } } Button { id: btnMute preferredWidth: Theme.buttonWidthSmall text: (muting ? qsTr("Unmute") : qsTr("Mute")) color: (muting ? palette.errorColor : palette.primaryColor) onClicked: { var msg = { 'method' : 'POST', 'params' : [], 'action' : "accounts/" + user_id + (muting ? '/unmute':'/mute'), 'conf' : Logic.conf }; worker.sendMessage(msg); } } Button { id: btnBlock preferredWidth: Theme.buttonWidthSmall text: (blocking ? qsTr("Unblock") : qsTr("Block") ) color: (blocking ? palette.errorColor : palette.primaryColor) onClicked: { var msg = { 'method' : 'POST', 'params' : [], 'action' : "accounts/" + user_id + (blocking ? '/unblock':'/block'), 'conf' : Logic.conf }; worker.sendMessage(msg); } } } Button { id: btnBrowser text: qsTr("Open in Browser") preferredWidth: Theme.buttonWidthMedium anchors.horizontalCenter: parent.horizontalCenter onClicked: { Qt.openUrlExternally(url) } } Rectangle { // dummy item for spacing height: Theme.paddingSmall width: parent.width opacity: 0 } } } } }