| |
| /* |
| * Copyright (C) 2020 by Savoir-faire Linux |
| * Author: Mingrui Zhang <mingrui.zhang@savoirfairelinux.com> |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * 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. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * 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 this program. If not, see <https://www.gnu.org/licenses/>. |
| */ |
| import QtQuick 2.14 |
| import QtQuick.Controls 2.14 |
| import QtQuick.Layouts 1.14 |
| import QtWebEngine 1.10 |
| import QtWebChannel 1.14 |
| import net.jami.Models 1.0 |
| |
| import "../../commoncomponents" |
| |
| |
| Rectangle { |
| id: messageWebViewRect |
| |
| property int messageWebViewHeaderPreferredHeight: 64 |
| property string headerUserAliasLabelText: "" |
| property string headerUserUserNameLabelText: "" |
| |
| signal needToGoBackToWelcomeView |
| signal needToHideConversationInCall |
| signal needToSendContactRequest |
| |
| signal sendMessageContentSaved(string arg) |
| signal messagesCleared |
| signal messagesLoaded |
| |
| |
| function webViewRunJavaScript(arg) { |
| messageWebView.runJavaScript(arg) |
| } |
| |
| function setSendContactRequestButtonVisible(visible) { |
| messageWebViewHeader.sendContactRequestButtonVisible = visible |
| } |
| |
| function setMessagingHeaderButtonsVisible(visible) { |
| messageWebViewHeader.toggleMessagingHeaderButtonsVisible(visible) |
| } |
| |
| function resetMessagingHeaderBackButtonSource(reset) { |
| messageWebViewHeader.resetBackToWelcomeViewButtonSource(reset) |
| } |
| |
| JamiFileDialog { |
| id: jamiFileDialog |
| |
| mode: JamiFileDialog.Mode.OpenFiles |
| |
| onAccepted: { |
| var filePaths = jamiFileDialog.files |
| for (var index = 0; index < filePaths.length; ++index) { |
| var path = ClientWrapper.utilsAdaptor.getAbsPath(filePaths[index]) |
| MessagesAdapter.setNewMessagesContent(path) |
| } |
| } |
| } |
| |
| MessageWebViewHeader { |
| |
| DropArea{ |
| anchors.fill: parent |
| onDropped: { |
| var path = ClientWrapper.utilsAdaptor.getAbsPath(drop.text.toString()) |
| MessagesAdapter.setNewMessagesContent(path) |
| } |
| } |
| |
| id: messageWebViewHeader |
| |
| anchors.top: messageWebViewRect.top |
| anchors.left: messageWebViewRect.left |
| |
| width: messageWebViewRect.width |
| height: messageWebViewHeaderPreferredHeight |
| |
| userAliasLabelText: headerUserAliasLabelText |
| userUserNameLabelText: headerUserUserNameLabelText |
| |
| onBackToWelcomeViewButtonClicked: { |
| MessagesAdapter.updateDraft() |
| messageWebViewRect.needToGoBackToWelcomeView() |
| } |
| |
| onNeedToHideConversationInCall: { |
| messageWebViewRect.needToHideConversationInCall() |
| } |
| |
| onSendContactRequestButtonClicked: { |
| MessagesAdapter.sendContactRequest() |
| } |
| } |
| |
| QtObject { |
| id: jsBridgeObject |
| |
| |
| /* |
| * ID, under which this object will be known at chatview.js side. |
| */ |
| WebChannel.id: "jsbridge" |
| |
| |
| /* |
| * Functions that are exposed, return code can be derived from js side |
| * by setting callback function. |
| */ |
| function deleteInteraction(arg) { |
| MessagesAdapter.deleteInteraction(arg) |
| } |
| |
| function retryInteraction(arg) { |
| MessagesAdapter.retryInteraction(arg) |
| } |
| |
| function openFile(arg) { |
| MessagesAdapter.openFile(arg) |
| } |
| |
| function acceptFile(arg) { |
| MessagesAdapter.acceptFile(arg) |
| } |
| |
| function refuseFile(arg) { |
| MessagesAdapter.refuseFile(arg) |
| } |
| |
| function sendMessage(arg) { |
| MessagesAdapter.sendMessage(arg) |
| } |
| |
| function sendImage(arg) { |
| MessagesAdapter.sendImage(arg) |
| } |
| |
| function sendFile(arg) { |
| MessagesAdapter.sendFile(arg) |
| } |
| |
| function selectFile() { |
| jamiFileDialog.open() |
| } |
| |
| function acceptInvitation() { |
| MessagesAdapter.acceptInvitation() |
| } |
| |
| function refuseInvitation() { |
| MessagesAdapter.refuseInvitation() |
| } |
| |
| function blockConversation() { |
| MessagesAdapter.blockConversation() |
| } |
| |
| function emitMessagesCleared() { |
| messageWebViewRect.messagesCleared() |
| } |
| |
| function emitMessagesLoaded() { |
| messageWebViewRect.messagesLoaded() |
| } |
| |
| function emitPasteKeyDetected() { |
| MessagesAdapter.pasteKeyDetected() |
| } |
| |
| function openAudioRecorder(spikePosX, spikePosY) { |
| recordBox.openRecorder(spikePosX, spikePosY, false) |
| } |
| |
| function openVideoRecorder(spikePosX, spikePosY) { |
| recordBox.openRecorder(spikePosX, spikePosY, true) |
| } |
| |
| function saveSendMessageContent(arg) { |
| messageWebViewRect.sendMessageContentSaved(arg) |
| } |
| |
| function onComposing(isComposing) { |
| MessagesAdapter.onComposing(isComposing) |
| } |
| } |
| |
| WebEngineView { |
| |
| id: messageWebView |
| |
| anchors.top: messageWebViewHeader.bottom |
| anchors.topMargin: 1 |
| anchors.left: messageWebViewRect.left |
| |
| width: messageWebViewRect.width |
| height: messageWebViewRect.height - messageWebViewHeaderPreferredHeight |
| |
| settings.javascriptEnabled: true |
| settings.javascriptCanOpenWindows: true |
| settings.fullScreenSupportEnabled: true |
| settings.allowRunningInsecureContent: true |
| settings.localContentCanAccessRemoteUrls: true |
| settings.localContentCanAccessFileUrls: true |
| settings.errorPageEnabled: false |
| settings.pluginsEnabled: false |
| settings.screenCaptureEnabled: false |
| settings.linksIncludedInFocusChain: false |
| settings.localStorageEnabled: false |
| |
| webChannel: messageWebViewChannel |
| profile: messageWebViewProfile |
| |
| DropArea{ |
| anchors.fill: parent |
| onDropped: { |
| var path = ClientWrapper.utilsAdaptor.getAbsPath(drop.text.toString()) |
| MessagesAdapter.setNewMessagesContent(path) |
| } |
| } |
| |
| onLoadingChanged: { |
| if (loadRequest.status == WebEngineView.LoadSucceededStatus) { |
| messageWebView.runJavaScript(ClientWrapper.utilsAdaptor.getStyleSheet( |
| "chatcss", |
| ClientWrapper.utilsAdaptor.qStringFromFile( |
| ":/chatview.css"))) |
| messageWebView.runJavaScript(ClientWrapper.utilsAdaptor.getStyleSheet( |
| "chatwin", |
| ClientWrapper.utilsAdaptor.qStringFromFile( |
| ":/chatview-windows.css"))) |
| |
| messageWebView.runJavaScript(ClientWrapper.utilsAdaptor.qStringFromFile( |
| ":/jed.js")) |
| messageWebView.runJavaScript(ClientWrapper.utilsAdaptor.qStringFromFile( |
| ":/linkify.js")) |
| messageWebView.runJavaScript(ClientWrapper.utilsAdaptor.qStringFromFile( |
| ":/linkify-html.js")) |
| messageWebView.runJavaScript(ClientWrapper.utilsAdaptor.qStringFromFile( |
| ":/linkify-string.js")) |
| messageWebView.runJavaScript(ClientWrapper.utilsAdaptor.qStringFromFile( |
| ":/qwebchannel.js")) |
| messageWebView.runJavaScript(ClientWrapper.utilsAdaptor.qStringFromFile( |
| ":/chatview.js")) |
| messageWebView.runJavaScript("init_i18n();") |
| messageWebView.runJavaScript("displayNavbar(false);") |
| } |
| } |
| Component.onCompleted: { |
| messageWebView.loadHtml(ClientWrapper.utilsAdaptor.qStringFromFile( |
| ":/chatview.html"), ":/chatview.html") |
| messageWebView.url = "qrc:/chatview.html" |
| } |
| } |
| |
| |
| /* |
| * Provide WebEngineProfile. |
| */ |
| WebEngineProfile { |
| id: messageWebViewProfile |
| |
| cachePath: ClientWrapper.utilsAdaptor.getCachePath() |
| persistentStoragePath: ClientWrapper.utilsAdaptor.getCachePath() |
| persistentCookiesPolicy: WebEngineProfile.NoPersistentCookies |
| httpCacheType: WebEngineProfile.NoCache |
| httpUserAgent: "jami-windows" |
| } |
| |
| |
| /* |
| * Provide WebChannel by registering jsBridgeObject. |
| */ |
| WebChannel { |
| id: messageWebViewChannel |
| registeredObjects: [jsBridgeObject] |
| } |
| } |