moment/src/gui/Pages/Chat/ChatPage.qml
2020-08-21 12:10:21 -04:00

129 lines
3.0 KiB
QML

// SPDX-License-Identifier: LGPL-3.0-or-later
import QtQuick 2.12
import QtQuick.Layouts 1.12
import "../../Base"
import "AutoCompletion"
import "Banners"
import "Composer"
import "FileTransfer"
import "Timeline"
HColumnPage {
id: chatPage
property bool loadedOnce: false
property var loadMembersFuture: null
readonly property alias composer: composer
readonly property bool loadEventList:
mainUI.mainPane.collapse ?
! mainUI.mainPane.visible : ! pageLoader.appearAnimation.running
padding: 0
column.spacing: 0
onLoadEventListChanged: if (loadEventList) loadedOnce = true
Component.onDestruction: if (loadMembersFuture) loadMembersFuture.cancel()
Timer {
interval: 200
running: true
onTriggered: loadMembersFuture = py.callClientCoro(
chat.userId,
"load_all_room_members",
[chat.roomId],
() => { loadMembersFuture = null },
)
}
RoomHeader {
Layout.fillWidth: true
}
HLoader {
id: eventListLoader
opacity: loadEventList ? 1 : 0
sourceComponent:
loadedOnce || loadEventList ? evListComponent : placeholder
Layout.fillWidth: true
Layout.fillHeight: true
Behavior on opacity { HNumberAnimation {} }
Component {
id: placeholder
Item {}
}
Component {
id: evListComponent
EventList {}
}
}
TypingMembersBar {
typingMembers: JSON.parse(chat.roomInfo.typing_members)
Layout.fillWidth: true
}
ReplyBar {
replyToEventId: chat.replyToEventId
replyToUserId: chat.replyToUserId
replyToDisplayName: chat.replyToDisplayName
onCancel: {
chat.replyToEventId = ""
chat.replyToUserId = ""
chat.replyToDisplayName = ""
}
Layout.fillWidth: true
}
TransferList {
Layout.fillWidth: true
Layout.minimumHeight: implicitHeight
Layout.preferredHeight: implicitHeight * transferCount
Layout.maximumHeight: chatPage.height / 6
Behavior on Layout.preferredHeight { HNumberAnimation {} }
}
UserAutoCompletion {
id: userCompletion
textArea: composer.messageArea
clip: true
Layout.fillWidth: true
Layout.maximumHeight: chatPage.height / 4
}
InviteBanner {
id: inviteBanner
visible: ! chat.roomInfo.left && inviterId
inviterId: chat.roomInfo.inviter_id
Layout.fillWidth: true
}
LeftBanner {
id: leftBanner
visible: chat.roomInfo.left
Layout.fillWidth: true
}
Composer {
id: composer
userCompletion: userCompletion
eventList: loadEventList ? eventListLoader.item.eventList : null
visible: ! chat.roomInfo.left && ! chat.roomInfo.inviter_id
Layout.fillWidth: true
Layout.maximumHeight: parent.height / 2
}
}