summary refs log tree commit diff
diff options
context:
space:
mode:
authorLoren Burkholder <computersemiexpert@outlook.com>2023-07-13 12:53:51 -0400
committerLoren Burkholder <computersemiexpert@outlook.com>2023-07-14 13:16:43 -0400
commit0634d3f09c6e427e0b5091ebd9ba770099057951 (patch)
treedd193ed2d07110ae3b5f0157753fdce96be118e1
parentUpdate german translation (diff)
downloadnheko-0634d3f09c6e427e0b5091ebd9ba770099057951.tar.xz
QML the fallback auth dialog
-rw-r--r--CMakeLists.txt9
-rw-r--r--resources/qml/Root.qml12
-rw-r--r--resources/qml/dialogs/FallbackAuthDialog.qml63
-rw-r--r--src/FallbackAuth.cpp29
-rw-r--r--src/FallbackAuth.h32
-rw-r--r--src/dialogs/FallbackAuth.cpp75
-rw-r--r--src/dialogs/FallbackAuth.h30
-rw-r--r--src/ui/UIA.cpp21
-rw-r--r--src/ui/UIA.h2
9 files changed, 149 insertions, 124 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2bc6806b..d05bd111 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -350,10 +350,6 @@ configure_file(cmake/nheko.h config/nheko.h)
 # Declare source and header files.
 #
 set(SRC_FILES
-	# Dialogs
-	src/dialogs/FallbackAuth.cpp
-	src/dialogs/FallbackAuth.h
-
 	# Emoji
 	src/emoji/Provider.cpp
 	src/emoji/Provider.h
@@ -463,6 +459,8 @@ set(SRC_FILES
 	src/Config.h
 	src/EventAccessors.cpp
 	src/EventAccessors.h
+        src/FallbackAuth.cpp
+        src/FallbackAuth.h
 	src/ImagePackListModel.cpp
 	src/ImagePackListModel.h
 	src/InviteesModel.cpp
@@ -764,8 +762,9 @@ set(QML_SOURCES
         resources/qml/dialogs/ConfirmJoinRoomDialog.qml
         resources/qml/dialogs/CreateDirect.qml
         resources/qml/dialogs/CreateRoom.qml
+        resources/qml/dialogs/FallbackAuthDialog.qml
         resources/qml/dialogs/HiddenEventsDialog.qml
-				resources/qml/dialogs/EventExpirationDialog.qml
+        resources/qml/dialogs/EventExpirationDialog.qml
         resources/qml/dialogs/ImageOverlay.qml
         resources/qml/dialogs/ImagePackEditorDialog.qml
         resources/qml/dialogs/ImagePackSettingsDialog.qml
diff --git a/resources/qml/Root.qml b/resources/qml/Root.qml
index fb0c6036..1e8a6a27 100644
--- a/resources/qml/Root.qml
+++ b/resources/qml/Root.qml
@@ -385,6 +385,18 @@ Pane {
                 console.error("Failed to create component: " + component.errorString());
             }
         }
+        function onFallbackAuth(fallback) {
+            var component = Qt.createComponent("qrc:/resources/qml/dialogs/FallbackAuthDialog.qml");
+            if (component.status == Component.Ready) {
+                var dialog = component.createObject(timelineRoot, {
+                        "fallback": fallback
+                    });
+                dialog.show();
+                destroyOnClose(dialog);
+            } else {
+                console.error("Failed to create component: " + component.errorString());
+            }
+        }
 
         target: UIA
     }
diff --git a/resources/qml/dialogs/FallbackAuthDialog.qml b/resources/qml/dialogs/FallbackAuthDialog.qml
new file mode 100644
index 00000000..d9a7ac8f
--- /dev/null
+++ b/resources/qml/dialogs/FallbackAuthDialog.qml
@@ -0,0 +1,63 @@
+// SPDX-FileCopyrightText: Nheko Contributors
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+import QtQuick
+import QtQuick.Controls
+import im.nheko
+
+ApplicationWindow {
+    id: fallbackRoot
+
+    required property FallbackAuth fallback
+
+    function accept() {
+        fallback.confirm();
+        fallbackRoot.close();
+    }
+
+    function reject() {
+        fallback.cancel();
+        fallbackRoot.close();
+    }
+
+    color: palette.window
+    title: qsTr("Fallback authentication")
+    flags: Qt.Tool | Qt.WindowStaysOnTopHint | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
+    height: msg.implicitHeight + footer.implicitHeight
+    width: Math.max(msg.implicitWidth, footer.implicitWidth)
+
+    Shortcut {
+        sequence: StandardKey.Cancel
+        onActivated: fallbackRoot.reject()
+    }
+
+    Label {
+        id: msg
+
+        anchors.fill: parent
+        padding: 8
+        text: qsTr("Open the fallback, follow the steps, and confirm after completing them.")
+    }
+
+    footer: DialogButtonBox {
+        onAccepted: fallbackRoot.accept()
+        onRejected: fallbackRoot.reject()
+
+        Button {
+            text: qsTr("Open Fallback in Browser")
+            onClicked: fallback.openFallbackAuth()
+        }
+
+        Button {
+            text: qsTr("Cancel")
+            DialogButtonBox.buttonRole: DialogButtonBox.RejectRole
+        }
+
+        Button {
+            text: qsTr("Confirm")
+            DialogButtonBox.buttonRole: DialogButtonBox.AcceptRole
+        }
+    }
+
+}
diff --git a/src/FallbackAuth.cpp b/src/FallbackAuth.cpp
new file mode 100644
index 00000000..5b668310
--- /dev/null
+++ b/src/FallbackAuth.cpp
@@ -0,0 +1,29 @@
+// SPDX-FileCopyrightText: Nheko Contributors
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "FallbackAuth.h"
+
+#include <QDesktopServices>
+#include <QUrl>
+
+#include "MatrixClient.h"
+
+FallbackAuth::FallbackAuth(const QString &session, const QString &authType, QObject *parent)
+  : QObject{parent}
+  , m_session{session}
+  , m_authType{authType}
+{
+}
+
+void
+FallbackAuth::openFallbackAuth()
+{
+    const auto url = QString("https://%1:%2/_matrix/client/r0/auth/%4/"
+                             "fallback/web?session=%3")
+                       .arg(QString::fromStdString(http::client()->server()))
+                       .arg(http::client()->port())
+                       .arg(m_session, m_authType);
+
+    QDesktopServices::openUrl(url);
+}
diff --git a/src/FallbackAuth.h b/src/FallbackAuth.h
new file mode 100644
index 00000000..c3b042ce
--- /dev/null
+++ b/src/FallbackAuth.h
@@ -0,0 +1,32 @@
+// SPDX-FileCopyrightText: Nheko Contributors
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include <QQmlEngine>
+
+class FallbackAuth : public QObject
+{
+    Q_OBJECT
+    QML_ELEMENT
+    QML_UNCREATABLE("")
+
+    Q_PROPERTY(QString authType MEMBER m_authType CONSTANT)
+    Q_PROPERTY(QString session MEMBER m_session CONSTANT)
+
+public:
+    FallbackAuth(const QString &session, const QString &authType, QObject *parent = nullptr);
+
+    Q_INVOKABLE void openFallbackAuth();
+    Q_INVOKABLE void confirm() { emit confirmation(); }
+    Q_INVOKABLE void cancel() { emit cancelled(); }
+
+signals:
+    void confirmation();
+    void cancelled();
+
+private:
+    const QString m_session;
+    const QString m_authType;
+};
diff --git a/src/dialogs/FallbackAuth.cpp b/src/dialogs/FallbackAuth.cpp
deleted file mode 100644
index 9d59fc97..00000000
--- a/src/dialogs/FallbackAuth.cpp
+++ /dev/null
@@ -1,75 +0,0 @@
-// SPDX-FileCopyrightText: Nheko Contributors
-//
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-#include <QDesktopServices>
-#include <QLabel>
-#include <QPushButton>
-#include <QUrl>
-#include <QVBoxLayout>
-
-#include "dialogs/FallbackAuth.h"
-
-#include "Config.h"
-#include "MatrixClient.h"
-
-using namespace dialogs;
-
-FallbackAuth::FallbackAuth(const QString &authType, const QString &session, QWidget *parent)
-  : QWidget(parent)
-{
-    setAutoFillBackground(true);
-    setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint);
-    setWindowModality(Qt::WindowModal);
-    setAttribute(Qt::WA_DeleteOnClose, true);
-
-    auto layout = new QVBoxLayout(this);
-    layout->setSpacing(conf::modals::WIDGET_SPACING);
-    layout->setContentsMargins(conf::modals::WIDGET_MARGIN,
-                               conf::modals::WIDGET_MARGIN,
-                               conf::modals::WIDGET_MARGIN,
-                               conf::modals::WIDGET_MARGIN);
-
-    auto buttonLayout = new QHBoxLayout();
-    buttonLayout->setSpacing(8);
-    buttonLayout->setContentsMargins(0, 0, 0, 0);
-
-    openBtn_    = new QPushButton(tr("Open Fallback in Browser"), this);
-    cancelBtn_  = new QPushButton(tr("Cancel"), this);
-    confirmBtn_ = new QPushButton(tr("Confirm"), this);
-    confirmBtn_->setDefault(true);
-
-    buttonLayout->addStretch(1);
-    buttonLayout->addWidget(openBtn_);
-    buttonLayout->addWidget(cancelBtn_);
-    buttonLayout->addWidget(confirmBtn_);
-
-    QFont font;
-    font.setPointSizeF(font.pointSizeF() * conf::modals::LABEL_MEDIUM_SIZE_RATIO);
-
-    auto label = new QLabel(
-      tr("Open the fallback, follow the steps, and confirm after completing them."), this);
-    label->setFont(font);
-
-    layout->addWidget(label);
-    layout->addLayout(buttonLayout);
-
-    connect(openBtn_, &QPushButton::clicked, [session, authType]() {
-        const auto url = QString("https://%1:%2/_matrix/client/r0/auth/%4/"
-                                 "fallback/web?session=%3")
-                           .arg(QString::fromStdString(http::client()->server()))
-                           .arg(http::client()->port())
-                           .arg(session, authType);
-
-        QDesktopServices::openUrl(url);
-    });
-
-    connect(confirmBtn_, &QPushButton::clicked, this, [this]() {
-        emit confirmation();
-        emit close();
-    });
-    connect(cancelBtn_, &QPushButton::clicked, this, [this]() {
-        emit cancel();
-        emit close();
-    });
-}
diff --git a/src/dialogs/FallbackAuth.h b/src/dialogs/FallbackAuth.h
deleted file mode 100644
index 62092b08..00000000
--- a/src/dialogs/FallbackAuth.h
+++ /dev/null
@@ -1,30 +0,0 @@
-// SPDX-FileCopyrightText: Nheko Contributors
-//
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-#pragma once
-
-#include <QWidget>
-
-class QPushButton;
-class QLabel;
-
-namespace dialogs {
-
-class FallbackAuth final : public QWidget
-{
-    Q_OBJECT
-
-public:
-    FallbackAuth(const QString &authType, const QString &session, QWidget *parent = nullptr);
-
-signals:
-    void confirmation();
-    void cancel();
-
-private:
-    QPushButton *openBtn_;
-    QPushButton *confirmBtn_;
-    QPushButton *cancelBtn_;
-};
-} // dialogs
diff --git a/src/ui/UIA.cpp b/src/ui/UIA.cpp
index 9654c9aa..4c1d35b9 100644
--- a/src/ui/UIA.cpp
+++ b/src/ui/UIA.cpp
@@ -13,8 +13,6 @@
 
 #include "Logging.h"
 #include "MatrixClient.h"
-#include "ReCaptcha.h"
-#include "dialogs/FallbackAuth.h"
 
 UIA *
 UIA::instance()
@@ -132,23 +130,18 @@ UIA::genericHandler(QString context)
                 }
             } else {
                 // use fallback
-                auto dialog = new dialogs::FallbackAuth(QString::fromStdString(current_stage),
-                                                        QString::fromStdString(u.session),
-                                                        nullptr);
-                dialog->setWindowTitle(context);
-
-                connect(dialog, &dialogs::FallbackAuth::confirmation, this, [h, u, dialog]() {
-                    dialog->close();
-                    dialog->deleteLater();
+                auto fallback = new FallbackAuth(QString::fromStdString(u.session),
+                                                 QString::fromStdString(current_stage),
+                                                 nullptr);
+                QQmlEngine::setObjectOwnership(fallback, QQmlEngine::JavaScriptOwnership);
+                connect(fallback, &FallbackAuth::confirmation, this, [h, u]() {
                     h.next(mtx::user_interactive::Auth{u.session,
                                                        mtx::user_interactive::auth::Fallback{}});
                 });
-
-                connect(dialog, &dialogs::FallbackAuth::cancel, this, [this]() {
+                connect(fallback, &FallbackAuth::cancelled, this, [this]() {
                     emit error(tr("Registration aborted"));
                 });
-
-                dialog->show();
+                emit fallbackAuth(fallback);
             }
         });
     });
diff --git a/src/ui/UIA.h b/src/ui/UIA.h
index 5b5eb9f4..2bff6948 100644
--- a/src/ui/UIA.h
+++ b/src/ui/UIA.h
@@ -9,6 +9,7 @@
 
 #include <mtxclient/http/client.hpp>
 
+#include "FallbackAuth.h"
 #include "ReCaptcha.h"
 
 class UIA final : public QObject
@@ -62,6 +63,7 @@ signals:
     void email();
     void phoneNumber();
     void reCaptcha(ReCaptcha *recaptcha);
+    void fallbackAuth(FallbackAuth *fallback);
 
     void confirm3pidToken();
     void prompt3pidToken();