summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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
6 files changed, 70 insertions, 119 deletions
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();