// SPDX-FileCopyrightText: 2023 Tobias Fella // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include #include #include #include #include #include #include #include #include #include using namespace Qt::StringLiterals; namespace Quotient { class CheckUsernameAvailabilityJob; } class NeoChatConnection; class NeoChatRegisterJob : public Quotient::BaseJob { public: explicit NeoChatRegisterJob(const QString &kind = u"user"_s, const std::optional &auth = {}, const QString &username = {}, const QString &password = {}, const QString &deviceId = {}, const QString &initialDeviceDisplayName = {}, std::optional inhibitLogin = {}); QString userId() const { return loadFromJson(u"user_id"_s); } QString accessToken() const { return loadFromJson(u"access_token"_s); } QString homeServer() const { return loadFromJson(u"home_server"_s); } QString deviceId() const { return loadFromJson(u"device_id"_s); } }; class Registration : public QObject { Q_OBJECT QML_ELEMENT QML_SINGLETON Q_PROPERTY(QString homeserver READ homeserver WRITE setHomeserver NOTIFY homeserverChanged) Q_PROPERTY(QString username READ username WRITE setUsername NOTIFY usernameChanged) Q_PROPERTY(QString recaptchaSiteKey READ recaptchaSiteKey WRITE setRecaptchaSiteKey NOTIFY recaptchaSiteKeyChanged) Q_PROPERTY(QString recaptchaResponse READ recaptchaResponse WRITE setRecaptchaResponse NOTIFY recaptchaResponseChanged) Q_PROPERTY(QString password READ password WRITE setPassword NOTIFY passwordChanged) Q_PROPERTY(QString email READ email WRITE setEmail NOTIFY emailChanged) Q_PROPERTY(QString nextStep READ nextStep WRITE setNextStep NOTIFY nextStepChanged) Q_PROPERTY(QList terms READ terms NOTIFY termsChanged) Q_PROPERTY(Status status READ status NOTIFY statusChanged) Q_PROPERTY(QString statusString READ statusString NOTIFY statusChanged) public: enum Status { NoServer, TestingHomeserver, InvalidServer, ServerNoRegistration, NoUsername, TestingUsername, UsernameTaken, Ready, Working, }; Q_ENUM(Status); static Registration &instance() { static Registration _instance; return _instance; } static Registration *create(QQmlEngine *engine, QJSEngine *) { engine->setObjectOwnership(&instance(), QQmlEngine::CppOwnership); return &instance(); } Q_INVOKABLE void registerAccount(); Q_INVOKABLE void registerEmail(); void setRecaptchaSiteKey(const QString &recaptchaSiteKey); QString recaptchaSiteKey() const; void setRecaptchaResponse(const QString &response); QString recaptchaResponse() const; void setHomeserver(const QString &url); QString homeserver() const; QString username() const; void setUsername(const QString &username); QString password() const; void setPassword(const QString &password); [[nodiscard]] QString email() const; void setEmail(const QString &email); QString nextStep() const; void setNextStep(const QString &nextStep); QList terms() const; Status status() const; QString statusString() const; Q_SIGNALS: void recaptchaSiteKeyChanged(); void recaptchaResponseChanged(); void homeserverChanged(); void homeserverAvailableChanged(); void testingChanged(); void usernameChanged(); void usernameAvailableChanged(); void testingUsernameChanged(); void flowsChanged(); void termsChanged(); void passwordChanged(); void emailChanged(); void nextStepChanged(); void statusChanged(); private: QString m_recaptchaSiteKey; QString m_recaptchaResponse; QString m_homeserver; QString m_username; QString m_password; QList m_terms; QString m_email; Status m_status = NoServer; QString m_nextStep; QString m_session; QString m_sid; QString m_emailSecret; QPointer m_usernameJob; QPointer m_testServerJob; QList> m_flows; QPointer m_connection; void testHomeserver(); void testUsername(); void setStatus(Status status); Registration(); };