2020-08-10 15:17:29 +03:00
/ *
Copyright ( C ) 2020 Sebastian J . Wolf
This file is part of Fernschreiber .
2020-08-13 18:08:14 +03:00
Fernschreiber is free software: you can redistribute it and / or modify
2020-08-10 15:17:29 +03:00
it under the terms of the GNU General Public License as published by
the Free Software Foundation , either version 3 of the License , or
( at your option ) any later version .
2020-08-13 18:08:14 +03:00
Fernschreiber is distributed in the hope that it will be useful ,
2020-08-10 15:17:29 +03:00
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with Fernschreiber . If not , see < http: //www.gnu.org/licenses/>.
* /
import QtQuick 2.5
import QtGraphicalEffects 1.0
import QtMultimedia 5.0
import Sailfish . Silica 1.0
import Nemo . Notifications 1.0
2020-08-13 11:15:26 +03:00
import WerkWolf . Fernschreiber 1.0
2020-08-19 10:55:13 +03:00
import "../components"
import "../js/twemoji.js" as Emoji
2020-08-19 17:47:59 +03:00
import "../js/functions.js" as Functions
2020-08-10 15:17:29 +03:00
Page {
id: overviewPage
allowedOrientations: Orientation . All
2020-08-18 12:11:03 +03:00
property bool initializationCompleted: false ;
2020-08-13 11:15:26 +03:00
property bool loading: true ;
2020-08-13 16:35:43 +03:00
property int authorizationState: TelegramAPI . Closed
property int connectionState: TelegramAPI . WaitingForNetwork
2020-08-20 01:24:24 +03:00
property int ownUserId ;
2020-08-20 19:45:56 +03:00
property bool chatListCreated: false ;
2020-08-13 11:15:26 +03:00
2020-08-18 12:11:03 +03:00
onStatusChanged: {
2020-08-21 19:03:51 +03:00
if ( status === PageStatus . Active && initializationCompleted && ! chatListCreated ) {
2020-08-18 12:11:03 +03:00
updateContent ( ) ;
}
}
2020-09-15 22:17:44 +03:00
Connections {
target: dBusAdaptor
onPleaseOpenMessage: {
console . log ( "[OverviewPage] Opening chat from external call..." )
if ( chatListCreated ) {
if ( status !== PageStatus . Active ) {
pageStack . pop ( pageStack . find ( function ( page ) { return ( page . _depth === 0 ) } ) , PageStackAction . Immediate ) ;
}
pageStack . push ( Qt . resolvedUrl ( "../pages/ChatPage.qml" ) , { "chatInformation" : tdLibWrapper . getChat ( chatId ) } ) ;
}
}
}
2020-08-20 19:45:56 +03:00
Timer {
id: chatListCreatedTimer
2020-09-30 22:41:49 +03:00
interval: 300
2020-08-20 19:45:56 +03:00
running: false
repeat: false
onTriggered: {
overviewPage . chatListCreated = true ;
2020-09-30 22:41:49 +03:00
chatListModel . redrawModel ( ) ;
2020-08-20 19:45:56 +03:00
}
}
2020-08-13 18:08:14 +03:00
function setPageStatus ( ) {
switch ( overviewPage . connectionState ) {
case TelegramAPI.WaitingForNetwork:
pageStatus . color = "red" ;
2020-08-13 23:32:35 +03:00
pageHeader . title = qsTr ( "Waiting for network..." ) ;
2020-08-13 18:08:14 +03:00
break ;
case TelegramAPI.Connecting:
pageStatus . color = "gold" ;
2020-08-13 23:32:35 +03:00
pageHeader . title = qsTr ( "Connecting to network..." ) ;
2020-08-13 18:08:14 +03:00
break ;
case TelegramAPI.ConnectingToProxy:
pageStatus . color = "gold" ;
2020-08-13 23:32:35 +03:00
pageHeader . title = qsTr ( "Connecting to proxy..." ) ;
2020-08-13 18:08:14 +03:00
break ;
case TelegramAPI.ConnectionReady:
pageStatus . color = "green" ;
pageHeader . title = qsTr ( "Fernschreiber" ) ;
break ;
case TelegramAPI.Updating:
pageStatus . color = "lightblue" ;
2020-08-13 23:32:35 +03:00
pageHeader . title = qsTr ( "Updating content..." ) ;
2020-08-13 18:08:14 +03:00
break ;
}
}
2020-08-13 23:32:35 +03:00
function updateContent ( ) {
2020-08-16 18:38:51 +03:00
tdLibWrapper . getChats ( ) ;
2020-08-18 00:44:37 +03:00
}
function initializePage ( ) {
overviewPage . authorizationState = tdLibWrapper . getAuthorizationState ( ) ;
2020-08-18 12:11:03 +03:00
overviewPage . handleAuthorizationState ( ) ;
overviewPage . connectionState = tdLibWrapper . getConnectionState ( ) ;
overviewPage . setPageStatus ( ) ;
}
function handleAuthorizationState ( ) {
switch ( overviewPage . authorizationState ) {
case TelegramAPI.WaitPhoneNumber:
case TelegramAPI.WaitCode:
2020-09-16 23:36:43 +03:00
case TelegramAPI.WaitPassword:
2020-10-01 01:55:26 +03:00
case TelegramAPI.WaitRegistration:
2020-09-16 23:36:43 +03:00
overviewPage . loading = false ;
pageStack . push ( Qt . resolvedUrl ( "../pages/InitializationPage.qml" ) ) ;
break ;
2020-08-18 12:11:03 +03:00
case TelegramAPI.AuthorizationReady:
overviewPage . loading = false ;
overviewPage . initializationCompleted = true ;
2020-08-18 00:44:37 +03:00
overviewPage . updateContent ( ) ;
2020-08-18 12:11:03 +03:00
break ;
default:
// Nothing ;)
2020-08-18 00:44:37 +03:00
}
2020-08-13 23:32:35 +03:00
}
2020-08-13 11:15:26 +03:00
Connections {
target: tdLibWrapper
onAuthorizationStateChanged: {
2020-08-13 16:35:43 +03:00
overviewPage . authorizationState = authorizationState ;
2020-08-18 12:11:03 +03:00
handleAuthorizationState ( ) ;
2020-08-13 11:15:26 +03:00
}
2020-08-13 16:35:43 +03:00
onConnectionStateChanged: {
overviewPage . connectionState = connectionState ;
2020-08-13 18:08:14 +03:00
setPageStatus ( ) ;
2020-08-13 16:35:43 +03:00
}
2020-08-20 01:24:24 +03:00
onOwnUserIdFound: {
overviewPage . ownUserId = ownUserId ;
}
2020-08-20 19:45:56 +03:00
onChatLastMessageUpdated: {
if ( ! overviewPage . chatListCreated ) {
2020-10-04 14:36:30 +03:00
chatListCreatedTimer . restart ( ) ;
2020-08-20 19:45:56 +03:00
}
}
2020-08-20 11:50:47 +03:00
onChatOrderUpdated: {
2020-08-20 19:45:56 +03:00
if ( ! overviewPage . chatListCreated ) {
2020-10-04 14:36:30 +03:00
chatListCreatedTimer . restart ( ) ;
2020-08-20 19:45:56 +03:00
}
2020-08-20 11:50:47 +03:00
}
2020-10-01 13:50:29 +03:00
onChatsReceived: {
if ( chats && chats . chat_ids && chats . chat_ids . length === 0 ) {
2020-10-04 14:36:30 +03:00
chatListCreatedTimer . restart ( ) ;
2020-10-01 13:50:29 +03:00
}
}
2020-08-13 16:35:43 +03:00
}
Component.onCompleted: {
2020-08-18 00:44:37 +03:00
initializePage ( ) ;
2020-08-13 11:15:26 +03:00
}
2020-08-10 15:17:29 +03:00
SilicaFlickable {
2020-08-21 15:26:56 +03:00
id: overviewContainer
2020-08-19 10:55:13 +03:00
contentHeight: parent . height
contentWidth: parent . width
2020-08-10 15:17:29 +03:00
anchors.fill: parent
2020-08-13 11:15:26 +03:00
visible: ! overviewPage . loading
2020-08-10 15:17:29 +03:00
PullDownMenu {
MenuItem {
text: qsTr ( "About Fernschreiber" )
onClicked: pageStack . push ( Qt . resolvedUrl ( "../pages/AboutPage.qml" ) )
}
2020-09-16 23:04:02 +03:00
MenuItem {
text: qsTr ( "Settings" )
onClicked: pageStack . push ( Qt . resolvedUrl ( "../pages/SettingsPage.qml" ) )
}
2020-08-10 15:17:29 +03:00
}
Column {
id: column
width: parent . width
2020-08-19 10:55:13 +03:00
height: parent . height
spacing: Theme . paddingMedium
2020-08-10 15:17:29 +03:00
2020-08-13 18:08:14 +03:00
Row {
2020-08-19 10:55:13 +03:00
id: headerRow
2020-08-13 18:08:14 +03:00
width: parent . width
GlassItem {
id: pageStatus
width: Theme . itemSizeMedium
height: Theme . itemSizeMedium
color: "red"
falloffRadius: 0.1
radius: 0.2
cache: false
}
PageHeader {
id: pageHeader
title: qsTr ( "Fernschreiber" )
width: parent . width - pageStatus . width
}
2020-08-10 15:17:29 +03:00
}
2020-08-30 14:42:22 +03:00
Item {
id: chatListItem
2020-08-19 10:55:13 +03:00
width: parent . width
height: parent . height - Theme . paddingMedium - headerRow . height
2020-08-30 14:42:22 +03:00
SilicaListView {
2020-08-19 10:55:13 +03:00
2020-08-30 14:42:22 +03:00
id: chatListView
2020-08-19 10:55:13 +03:00
2020-08-30 14:42:22 +03:00
anchors.fill: parent
2020-08-19 10:55:13 +03:00
2020-08-30 14:42:22 +03:00
clip: true
opacity: overviewPage . chatListCreated ? 1 : 0
Behavior on opacity { NumberAnimation { } }
2020-08-19 10:55:13 +03:00
2020-08-30 14:42:22 +03:00
model: chatListModel
delegate: ListItem {
2020-08-19 10:55:13 +03:00
2020-09-15 22:17:44 +03:00
id: chatListViewItem
2020-08-30 14:42:22 +03:00
contentHeight: chatListRow . height + chatListSeparator . height + 2 * Theme . paddingMedium
contentWidth: parent . width
onClicked: {
pageStack . push ( Qt . resolvedUrl ( "../pages/ChatPage.qml" ) , { "chatInformation" : display } ) ;
2020-08-21 10:29:19 +03:00
}
2020-10-01 00:59:12 +03:00
showMenuOnPressAndHold: chat_id != overviewPage . ownUserId
2020-09-16 01:15:43 +03:00
menu: ContextMenu {
MenuItem {
onClicked: {
var newNotificationSettings = display . notification_settings ;
if ( newNotificationSettings . mute_for > 0 ) {
newNotificationSettings . mute_for = 0 ;
} else {
2020-09-16 21:43:36 +03:00
newNotificationSettings . mute_for = 6666666 ;
2020-09-16 01:15:43 +03:00
}
2020-10-01 00:59:12 +03:00
tdLibWrapper . setChatNotificationSettings ( chat_id , newNotificationSettings ) ;
2020-09-16 01:15:43 +03:00
}
text: display . notification_settings . mute_for > 0 ? qsTr ( "Unmute Chat" ) : qsTr ( "Mute Chat" )
}
}
2020-10-04 17:06:20 +03:00
Connections {
target: chatListModel
onChatChanged: {
if ( overviewPage . chatListCreated && changedChatId === chat_id ) {
// Force update of some list item elements (currently only last message text seems to create problems). dataChanged() doesn't seem to trigger them all :(
chatListLastMessageText . text = last_message_text ? Emoji . emojify ( last_message_text , Theme . fontSizeExtraSmall ) : qsTr ( "Unknown" )
}
}
}
2020-08-30 14:42:22 +03:00
Column {
id: chatListColumn
width: parent . width - ( 2 * Theme . horizontalPageMargin )
spacing: Theme . paddingSmall
anchors {
horizontalCenter: parent . horizontalCenter
verticalCenter: parent . verticalCenter
}
Row {
id: chatListRow
width: parent . width
height: chatListContentColumn . height
spacing: Theme . paddingMedium
Column {
id: chatListPictureColumn
width: chatListContentColumn . height - Theme . paddingSmall
height: chatListContentColumn . height - Theme . paddingSmall
anchors.verticalCenter: parent . verticalCenter
Item {
id: chatListPictureItem
2020-08-20 21:06:59 +03:00
width: parent . width
height: parent . width
2020-08-30 14:42:22 +03:00
ProfileThumbnail {
id: chatListPictureThumbnail
2020-10-01 00:59:12 +03:00
photoData: photo_small
2020-08-30 14:42:22 +03:00
replacementStringHint: chatListNameText . text
width: parent . width
height: parent . width
forceElementUpdate: overviewPage . chatListCreated
}
2020-08-20 21:06:59 +03:00
2020-08-30 14:42:22 +03:00
Rectangle {
id: chatUnreadMessagesCountBackground
color: Theme . highlightBackgroundColor
width: Theme . fontSizeLarge
height: Theme . fontSizeLarge
anchors.right: parent . right
anchors.bottom: parent . bottom
radius: parent . width / 2
2020-10-01 00:59:12 +03:00
visible: unread_count > 0
2020-08-30 14:42:22 +03:00
}
2020-08-19 10:55:13 +03:00
2020-08-30 14:42:22 +03:00
Text {
id: chatUnreadMessagesCount
font.pixelSize: Theme . fontSizeExtraSmall
font.bold: true
color: Theme . primaryColor
anchors.centerIn: chatUnreadMessagesCountBackground
visible: chatUnreadMessagesCountBackground . visible
2020-10-01 00:59:12 +03:00
text: unread_count > 99 ? "99+" : unread_count
2020-08-19 10:55:13 +03:00
}
}
}
2020-08-30 14:42:22 +03:00
Column {
id: chatListContentColumn
width: parent . width * 5 / 6 - Theme . horizontalPageMargin
2020-08-21 13:53:03 +03:00
spacing: Theme . paddingSmall
2020-08-30 14:42:22 +03:00
2020-08-19 10:55:13 +03:00
Text {
2020-08-30 14:42:22 +03:00
id: chatListNameText
2020-10-01 00:59:12 +03:00
text: title ? Emoji . emojify ( title , Theme . fontSizeMedium ) + ( display . notification_settings . mute_for > 0 ? Emoji . emojify ( " 🔇" , Theme . fontSizeMedium ) : "" ) : qsTr ( "Unknown" )
2020-08-19 10:55:13 +03:00
textFormat: Text . StyledText
2020-08-30 14:42:22 +03:00
font.pixelSize: Theme . fontSizeMedium
color: Theme . primaryColor
elide: Text . ElideRight
width: parent . width
2020-08-19 10:55:13 +03:00
onTruncatedChanged: {
// There is obviously a bug in QML in truncating text with images.
// We simply remove Emojis then...
if ( truncated ) {
text = text . replace ( /\<img [^>]+\/\>/g , "" ) ;
}
}
}
2020-08-30 14:42:22 +03:00
Row {
id: chatListLastMessageRow
width: parent . width
spacing: Theme . paddingSmall
Text {
id: chatListLastUserText
2020-10-03 22:06:50 +03:00
text: is_channel ? "" : ( last_message_sender_id ? ( last_message_sender_id !== overviewPage . ownUserId ? Emoji . emojify ( Functions . getUserName ( tdLibWrapper . getUserInformation ( last_message_sender_id ) ) , font . pixelSize ) : qsTr ( "You" ) ) : qsTr ( "Unknown" ) )
2020-08-30 14:42:22 +03:00
font.pixelSize: Theme . fontSizeExtraSmall
color: Theme . highlightColor
textFormat: Text . StyledText
onTruncatedChanged: {
// There is obviously a bug in QML in truncating text with images.
// We simply remove Emojis then...
if ( truncated ) {
text = text . replace ( /\<img [^>]+\/\>/g , "" ) ;
}
}
}
Text {
id: chatListLastMessageText
2020-10-01 00:59:12 +03:00
text: last_message_text ? Emoji . emojify ( last_message_text , Theme . fontSizeExtraSmall ) : qsTr ( "Unknown" )
2020-08-30 14:42:22 +03:00
font.pixelSize: Theme . fontSizeExtraSmall
color: Theme . primaryColor
width: parent . width - Theme . paddingMedium - chatListLastUserText . width
elide: Text . ElideRight
textFormat: Text . StyledText
onTruncatedChanged: {
// There is obviously a bug in QML in truncating text with images.
// We simply remove Emojis then...
if ( truncated ) {
text = text . replace ( /\<img [^>]+\/\>/g , "" ) ;
}
2020-08-19 10:55:13 +03:00
}
}
}
2020-08-30 14:42:22 +03:00
Text {
id: messageContactTimeElapsedText
2020-10-01 00:59:12 +03:00
text: last_message_date ? Functions . getDateTimeElapsed ( last_message_date ) : qsTr ( "Unknown" )
2020-08-30 14:42:22 +03:00
font.pixelSize: Theme . fontSizeTiny
color: Theme . secondaryColor
}
2020-08-19 10:55:13 +03:00
}
}
2020-08-30 14:42:22 +03:00
2020-08-19 10:55:13 +03:00
}
2020-08-30 14:42:22 +03:00
Separator {
id: chatListSeparator
2020-08-19 10:55:13 +03:00
2020-08-30 14:42:22 +03:00
anchors {
top: chatListColumn . bottom
topMargin: Theme . paddingMedium
}
2020-08-19 10:55:13 +03:00
2020-08-30 14:42:22 +03:00
width: parent . width
color: Theme . primaryColor
horizontalAlignment: Qt . AlignHCenter
2020-08-19 10:55:13 +03:00
}
}
2020-10-01 13:50:29 +03:00
ViewPlaceholder {
enabled: chatListView . count === 0
text: qsTr ( "You don't have any chats yet." )
}
2020-08-30 14:42:22 +03:00
VerticalScrollDecorator { }
2020-08-19 10:55:13 +03:00
}
2020-08-30 14:42:22 +03:00
Column {
width: parent . width
height: loadingLabel . height + loadingBusyIndicator . height + Theme . paddingMedium
spacing: Theme . paddingMedium
anchors.verticalCenter: parent . verticalCenter
opacity: overviewPage . chatListCreated ? 0 : 1
Behavior on opacity { NumberAnimation { } }
visible: ! overviewPage . chatListCreated
InfoLabel {
id: loadingLabel
text: qsTr ( "Loading chat list..." )
}
BusyIndicator {
id: loadingBusyIndicator
anchors.horizontalCenter: parent . horizontalCenter
running: ! overviewPage . chatListCreated
size: BusyIndicatorSize . Large
}
}
2020-08-19 10:55:13 +03:00
}
2020-08-30 14:42:22 +03:00
2020-08-10 15:17:29 +03:00
}
}
}