File indexing completed on 2024-12-08 04:34:12

0001 /*
0002    SPDX-FileCopyrightText: 2023-2024 Laurent Montel <montel.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "createnewservercheckurlwidget.h"
0008 #include "ddpapi/ddpclient.h"
0009 #include "rocketchataccount.h"
0010 #include "rocketchatbackend.h"
0011 #include <KBusyIndicatorWidget>
0012 #include <KLineEditEventHandler>
0013 #include <KLocalizedString>
0014 #include <KMessageWidget>
0015 #include <QHBoxLayout>
0016 #include <QLabel>
0017 #include <QLineEdit>
0018 #include <QPushButton>
0019 
0020 CreateNewServerCheckUrlWidget::CreateNewServerCheckUrlWidget(QWidget *parent)
0021     : QWidget{parent}
0022     , mServerUrl(new QLineEdit(this))
0023     , mBusyIndicatorWidget(new KBusyIndicatorWidget(this))
0024     , mFailedError(new KMessageWidget(this))
0025     , mConnectionPushButton(new QPushButton(i18n("Connection"), this))
0026 {
0027     auto topLayout = new QVBoxLayout(this);
0028     topLayout->setObjectName(QStringLiteral("topLayout"));
0029     topLayout->setContentsMargins({});
0030 
0031     auto serverUrlLayout = new QHBoxLayout;
0032     serverUrlLayout->setObjectName(QStringLiteral("serverUrlLayout"));
0033     serverUrlLayout->setContentsMargins({});
0034     topLayout->addLayout(serverUrlLayout);
0035 
0036     auto label = new QLabel(i18n("Server Url:"), this);
0037     label->setObjectName(QStringLiteral("label"));
0038     serverUrlLayout->addWidget(label);
0039 
0040     mServerUrl->setObjectName(QStringLiteral("mServerUrl"));
0041     serverUrlLayout->addWidget(mServerUrl);
0042     mServerUrl->setClearButtonEnabled(true);
0043     KLineEditEventHandler::catchReturnKey(mServerUrl);
0044 
0045     mConnectionPushButton->setObjectName(QStringLiteral("connectionPushButton"));
0046     mConnectionPushButton->setEnabled(false);
0047     serverUrlLayout->addWidget(mConnectionPushButton);
0048 
0049     connect(mConnectionPushButton, &QPushButton::clicked, this, [this]() {
0050         mConnectionPushButton->setEnabled(false);
0051         slotTestConnection();
0052     });
0053     connect(mServerUrl, &QLineEdit::textChanged, this, [this](const QString &str) {
0054         mConnectionPushButton->setEnabled(!str.trimmed().isEmpty());
0055     });
0056 
0057     mBusyIndicatorWidget->setObjectName(QStringLiteral("mBusyIndicatorWidget"));
0058     serverUrlLayout->addWidget(mBusyIndicatorWidget);
0059 
0060     mFailedError->setObjectName(QStringLiteral("mFailedError"));
0061     mFailedError->setMessageType(KMessageWidget::Error);
0062     mFailedError->setCloseButtonVisible(false);
0063 
0064     topLayout->addWidget(mFailedError);
0065     topLayout->addStretch(1);
0066 
0067     // Hide by default
0068     mBusyIndicatorWidget->hide();
0069     mFailedError->hide();
0070 }
0071 
0072 CreateNewServerCheckUrlWidget::~CreateNewServerCheckUrlWidget() = default;
0073 
0074 void CreateNewServerCheckUrlWidget::slotTestConnection()
0075 {
0076     const QString serverUrl{mServerUrl->text().trimmed()};
0077     if (!serverUrl.isEmpty()) {
0078         mFailedError->hide();
0079         mBusyIndicatorWidget->show();
0080         auto account = new RocketChatAccount();
0081         account->setServerUrl(mServerUrl->text());
0082         auto ddpClient = new DDPClient(account, this);
0083         connect(ddpClient, &DDPClient::wsClosedSocketError, this, [this, ddpClient, account]() {
0084             mBusyIndicatorWidget->hide();
0085             mConnectionPushButton->setEnabled(true);
0086             slotErrorConnection();
0087             ddpClient->deleteLater();
0088             account->deleteLater();
0089         });
0090         connect(ddpClient, &DDPClient::socketError, this, [this, ddpClient, account](QAbstractSocket::SocketError error, const QString &strError) {
0091             Q_UNUSED(error);
0092             Q_UNUSED(strError);
0093             mConnectionPushButton->setEnabled(true);
0094             mBusyIndicatorWidget->hide();
0095             slotErrorConnection();
0096             ddpClient->deleteLater();
0097             account->deleteLater();
0098         });
0099         connect(account, &RocketChatAccount::publicSettingChanged, this, [this, ddpClient, account]() {
0100             mBusyIndicatorWidget->hide();
0101             ddpClient->deleteLater();
0102             account->deleteLater();
0103             ServerInfo info;
0104             info.authenticationInfos = account->authenticationMethodInfos();
0105 
0106             const bool allowResetPassword = account->allowPasswordReset() && account->allowPasswordChange();
0107             info.url = mServerUrl->text().trimmed();
0108             info.canResetPassword = allowResetPassword;
0109             info.canRegisterAccount = account->registrationFormEnabled();
0110             Q_EMIT serverUrlFound(info);
0111         });
0112 
0113         ddpClient->setServerUrl(mServerUrl->text());
0114         ddpClient->start();
0115         account->rocketChatBackend()->loadPublicSettings();
0116     }
0117 }
0118 
0119 void CreateNewServerCheckUrlWidget::slotErrorConnection()
0120 {
0121     mFailedError->setText(i18n("Impossible to access to server."));
0122     mFailedError->animatedShow();
0123 }
0124 
0125 #include "moc_createnewservercheckurlwidget.cpp"