// 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 namespace Quotient { class Connection; class CheckUsernameAvailabilityJob; } class NeoChatRegisterJob : public Quotient::BaseJob { public: explicit NeoChatRegisterJob(const QString &kind = QStringLiteral("user"), const Quotient::Omittable &auth = Quotient::none, const QString &username = {}, const QString &password = {}, const QString &deviceId = {}, const QString &initialDeviceDisplayName = {}, Quotient::Omittable inhibitLogin = Quotient::none); QString userId() const { return loadFromJson(QStringLiteral("user_id")); } QString accessToken() const { return loadFromJson(QStringLiteral("access_token")); } QString homeServer() const { return loadFromJson(QStringLiteral("home_server")); } QString deviceId() const { return loadFromJson(QStringLiteral("device_id")); } }; class Registration : public QObject { Q_OBJECT 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(QVector 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; } 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); QVector 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; QVector 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; QVector> m_flows; QPointer m_connection; void testHomeserver(); void testUsername(); void setStatus(Status status); Registration(); };