Skip to content
Snippets Groups Projects
Select Git revision
  • 6cbda2cea14626b49b5979b8ac7263bf2e2517a0
  • master default protected
  • nightly/20250806.0
  • nightly/20250805.0
  • beta/202508051403
  • beta/202508051107
  • nightly/20250722.0
  • beta/202507211539
  • stable/20250718.0
  • nightly/20250718.0
  • nightly/20250714.0
  • beta/202507141552
  • beta/202506161038
  • stable/20250613.0
  • nightly/20250613.0
  • beta/202506101658
  • stable/20250610.0
  • nightly/20250610.0
  • beta/202506091027
  • beta/202506061543
  • nightly/20250605.0
  • beta/202506051039
22 results

LinkDeviceDialog.qml

  • cberthet's avatar
    Capucine Berthet authored and Sébastien Blin committed
    GitLab: #1417
    Change-Id: I8039355efcac28bf6ccc39dea1c785ef7f86b9f4
    6cbda2ce
    History
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    LinkDeviceDialog.qml 14.48 KiB
    /*
     * Copyright (C) 2020-2023 Savoir-faire Linux Inc.
     * Author: Yang Wang <yang.wang@savoirfairelinux.com>
     * Author: Albert Babí <albert.babi@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
    import QtQuick.Controls
    import QtQuick.Layouts
    import net.jami.Models 1.1
    import net.jami.Adapters 1.1
    import net.jami.Constants 1.1
    import "../../commoncomponents"
    import "../../mainview/components"
    
    BaseModalDialog {
        id: root
    
        signal accepted
    
        title: JamiStrings.linkNewDevice
    
        property bool darkTheme: UtilsAdapter.useApplicationTheme()
    
        popupContent: StackLayout {
            id: stackedWidget
    
            function setGeneratingPage() {
                if (passwordEdit.length === 0 && CurrentAccount.hasArchivePassword) {
                    setExportPage(NameDirectory.ExportOnRingStatus.WRONG_PASSWORD, "");
                    return;
                }
                stackedWidget.currentIndex = exportingSpinnerPage.pageIndex;
                spinnerMovie.playing = true;
                timerForExport.restart();
            }
    
            function setExportPage(status, pin) {
                if (status === NameDirectory.ExportOnRingStatus.SUCCESS) {
                    infoLabel.success = true;
                    pinRectangle.visible = true
                    exportedPIN.text = pin;
                } else {
                    pinRectangle.success = false;
                    infoLabel.visible = true;
                    switch (status) {
                    case NameDirectory.ExportOnRingStatus.WRONG_PASSWORD:
                        infoLabel.text = JamiStrings.incorrectPassword;
                        break;
                    case NameDirectory.ExportOnRingStatus.NETWORK_ERROR:
                        infoLabel.text = JamiStrings.linkDeviceNetWorkError;
                        break;
                    case NameDirectory.ExportOnRingStatus.INVALID:
                        infoLabel.text = JamiStrings.somethingWentWrong;
                        break;
                    }
                }
                stackedWidget.currentIndex = exportingInfoPage.pageIndex;
                stackedWidget.height = exportingLayout.implicitHeight;
            }
    
            Timer {
                id: timerForExport
    
                repeat: false
                interval: 200
    
                onTriggered: {
                    AccountAdapter.model.exportOnRing(LRCInstance.currentAccountId, passwordEdit.dynamicText);
                }
            }
    
            Connections {
                target: NameDirectory
    
                function onExportOnRingEnded(status, pin) {
                    stackedWidget.setExportPage(status, pin);
                }
            }
    
            onVisibleChanged: {
                if (visible) {
                    if (CurrentAccount.hasArchivePassword) {
                        stackedWidget.currentIndex = enterPasswordPage.pageIndex;
                    } else {
                        setGeneratingPage();
                    }
                }
            }
    
            // Index = 0
            Item {
                id: enterPasswordPage
    
                readonly property int pageIndex: 0
    
                Component.onCompleted: passwordEdit.forceActiveFocus()
    
                onHeightChanged: {
                    stackedWidget.height = passwordLayout.implicitHeight
                }
    
                ColumnLayout {
                    id: passwordLayout
                    spacing: JamiTheme.preferredMarginSize
                    anchors.centerIn: parent
    
                    Label {
                        Layout.alignment: Qt.AlignCenter
                        Layout.maximumWidth: root.width - 4 * JamiTheme.preferredMarginSize
                        wrapMode: Text.Wrap
    
                        text: JamiStrings.enterPasswordPinCode
                        color: JamiTheme.textColor
                        font.pointSize: JamiTheme.textFontSize
                        font.kerning: true
                        horizontalAlignment: Text.AlignHCenter
                        verticalAlignment: Text.AlignVCenter
                    }
    
                    RowLayout {
                        Layout.topMargin: 10
                        Layout.leftMargin: JamiTheme.cornerIconSize
                        Layout.rightMargin: JamiTheme.cornerIconSize
                        spacing: JamiTheme.preferredMarginSize
                        Layout.bottomMargin: JamiTheme.preferredMarginSize
    
                        PasswordTextEdit {
                            id: passwordEdit
    
                            firstEntry: true
                            placeholderText: JamiStrings.password
    
                            Layout.alignment: Qt.AlignLeft
                            Layout.fillWidth: true
    
                            KeyNavigation.up: btnConfirm
                            KeyNavigation.down: KeyNavigation.up
    
                            onDynamicTextChanged: {
                                btnConfirm.enabled = dynamicText.length > 0;
                                btnConfirm.hoverEnabled = dynamicText.length > 0;
                            }
                            onAccepted: btnConfirm.clicked()
                        }
    
                        JamiPushButton {
                            id: btnConfirm
    
                            Layout.alignment: Qt.AlignCenter
                            height: 36
                            width: 36
    
                            hoverEnabled: false
                            enabled: false
    
                            imageColor: JamiTheme.secondaryBackgroundColor
                            hoveredColor: JamiTheme.buttonTintedBlueHovered
                            source: JamiResources.check_black_24dp_svg
                            normalColor: JamiTheme.tintedBlue
    
                            onClicked: stackedWidget.setGeneratingPage()
    
                        }
                    }
                }
            }
    
            // Index = 1
            Item {
                id: exportingSpinnerPage
    
                readonly property int pageIndex: 1
    
                onHeightChanged: {
                    stackedWidget.height = spinnerLayout.implicitHeight
                }
                onWidthChanged: stackedWidget.width = exportingLayout.implicitWidth
    
                ColumnLayout {
                    id: spinnerLayout
    
                    spacing: JamiTheme.preferredMarginSize
                    anchors.centerIn: parent
    
                    Label {
                        Layout.alignment: Qt.AlignCenter
    
                        text: JamiStrings.linkDevice
                        color: JamiTheme.textColor
                        font.pointSize: JamiTheme.headerFontSize
                        font.kerning: true
                        horizontalAlignment: Text.AlignLeft
                        verticalAlignment: Text.AlignVCenter
                    }
    
                    AnimatedImage {
                        id: spinnerMovie
    
                        Layout.alignment: Qt.AlignCenter
    
                        Layout.preferredWidth: 30
                        Layout.preferredHeight: 30
    
                        source: JamiResources.jami_rolling_spinner_gif
                        playing: visible
                        fillMode: Image.PreserveAspectFit
                        mipmap: true
                    }
                }
            }
    
            // Index = 2
            Item {
                id: exportingInfoPage
    
                readonly property int pageIndex: 2
    
                width: childrenRect.width
                height: childrenRect.height
    
                onHeightChanged: {
                    stackedWidget.height = exportingLayout.implicitHeight
                }
                onWidthChanged: stackedWidget.width = exportingLayout.implicitWidth
    
                ColumnLayout {
                    id: exportingLayout
    
                    spacing: JamiTheme.preferredMarginSize
    
                    Label {
                        id: instructionLabel
    
                        Layout.maximumWidth: Math.min(root.maximumPopupWidth, root.width) - 2 * root.popupMargins
                        Layout.alignment: Qt.AlignLeft
    
                        color: JamiTheme.textColor
    
                        wrapMode: Text.Wrap
                        text: JamiStrings.linkingInstructions
                        font.pointSize: JamiTheme.textFontSize
                        font.kerning: true
                        verticalAlignment: Text.AlignVCenter
    
                    }
    
                    RowLayout {
                        spacing: 10
                        Layout.maximumWidth: Math.min(root.maximumPopupWidth, root.width) - 2 * root.popupMargins
    
                        Rectangle {
                            Layout.alignment: Qt.AlignCenter
    
                            radius: 5
                            color: JamiTheme.backgroundRectangleColor
                            width: 100
                            height: 100
    
                            Rectangle {
                                width: qrImage.width + 4
                                height: qrImage.height + 4
                                anchors.centerIn: parent
                                radius: 5
                                color: JamiTheme.darkTheme ? JamiTheme.whiteColor : JamiTheme.jamiButtonBorderColor
                                Image {
                                     id: qrImage
                                     anchors.centerIn: parent
                                     mipmap: false
                                     smooth: false
                                     source: "image://qrImage/raw_" + exportedPIN.text
                                     sourceSize.width: 80
                                     sourceSize.height: 80
                                }
                            }
    
                        }
    
                        Rectangle {
                            id: pinRectangle
    
                            radius: 5
                            color: JamiTheme.backgroundRectangleColor
                            Layout.fillWidth: true
                            height: 100
                            Layout.minimumWidth: exportedPIN.width + 20
    
                            Layout.alignment: Qt.AlignCenter
    
                            MaterialLineEdit {
                                id: exportedPIN
    
                                padding: 10
                                anchors.centerIn: parent
    
                                text: JamiStrings.pin
                                wrapMode: Text.NoWrap
    
                                backgroundColor: JamiTheme.backgroundRectangleColor
    
                                color: darkTheme ? JamiTheme.editLineColor : JamiTheme.darkTintedBlue
                                selectByMouse: true
                                readOnly: true
                                font.pointSize: JamiTheme.tinyCreditsTextSize
                                font.kerning: true
                                horizontalAlignment: Text.AlignHCenter
                                verticalAlignment: Text.AlignVCenter
                            }
                        }
                    }
    
                    Rectangle {
                        radius: 5
                        color: JamiTheme.infoRectangleColor
                        Layout.fillWidth: true
                        Layout.preferredHeight: infoLabels.height + 38
    
                        RowLayout {
                            id: infoLayout
    
                            anchors.centerIn: parent
                            anchors.fill: parent
                            anchors.margins: 14
                            spacing: 10
    
                            ResponsiveImage{
                                Layout.fillWidth: true
    
                                source: JamiResources.outline_info_24dp_svg
                                fillMode: Image.PreserveAspectFit
    
                                color: darkTheme ? JamiTheme.editLineColor : JamiTheme.darkTintedBlue
                                Layout.fillHeight: true
                            }
    
                            ColumnLayout{
                                id: infoLabels
    
                                Layout.fillHeight: true
                                Layout.fillWidth: true
    
                                Label {
                                    id: otherDeviceLabel
    
                                    Layout.alignment: Qt.AlignLeft
                                    color: JamiTheme.textColor
                                    text: JamiStrings.onAnotherDevice
    
                                    font.pointSize: JamiTheme.smallFontSize
                                    font.kerning: true
                                    font.bold: true
                                }
    
                                Label {
                                    id: otherInstructionLabel
    
                                    Layout.fillWidth: true
                                    Layout.alignment: Qt.AlignLeft
    
                                    wrapMode: Text.Wrap
                                    color: JamiTheme.textColor
                                    text: JamiStrings.onAnotherDeviceInstruction
    
                                    font.pointSize: JamiTheme.smallFontSize
                                    font.kerning: true
                                }
                            }
                        }
                    }
    
                    // Displays error messages
                    Label {
                        id: infoLabel
    
                        visible: false
    
                        property bool success: false
                        property int borderWidth: success ? 1 : 0
                        property int borderRadius: success ? 15 : 0
                        property string backgroundColor: success ? "whitesmoke" : "transparent"
                        property string borderColor: success ? "lightgray" : "transparent"
    
                        Layout.maximumWidth: JamiTheme.preferredDialogWidth
                        Layout.margins: JamiTheme.preferredMarginSize
    
                        Layout.alignment: Qt.AlignCenter
    
                        color: success ? JamiTheme.successLabelColor : JamiTheme.redColor
                        padding: success ? 8 : 0
    
                        wrapMode: Text.Wrap
                        font.pointSize: success ? JamiTheme.textFontSize : JamiTheme.textFontSize + 3
                        font.kerning: true
                        horizontalAlignment: Text.AlignHCenter
                        verticalAlignment: Text.AlignVCenter
    
                        background: Rectangle {
                            id: infoLabelBackground
    
                            border.width: infoLabel.borderWidth
                            border.color: infoLabel.borderColor
                            radius: infoLabel.borderRadius
                            color: JamiTheme.secondaryBackgroundColor
                        }
                    }
                }
            }
        }
    }