matrixion/src/ui/UserProfile.h

203 lines
5.4 KiB
C
Raw Normal View History

2021-03-05 02:35:15 +03:00
// SPDX-FileCopyrightText: 2021 Nheko Contributors
// SPDX-FileCopyrightText: 2022 Nheko Contributors
2021-03-05 02:35:15 +03:00
//
// SPDX-License-Identifier: GPL-3.0-or-later
2020-05-17 16:34:47 +03:00
#pragma once
2020-07-04 05:24:28 +03:00
#include <QAbstractListModel>
2020-05-17 16:34:47 +03:00
#include <QObject>
#include <QString>
2020-05-27 11:49:26 +03:00
#include <QVector>
#include <mtx/responses.hpp>
#include <mtx/responses/common.hpp>
2020-05-17 16:34:47 +03:00
#include "CacheCryptoStructs.h"
2021-12-28 22:09:08 +03:00
#include "timeline/TimelineModel.h"
2020-07-04 05:24:28 +03:00
namespace verification {
Q_NAMESPACE
2020-05-17 16:34:47 +03:00
2020-07-04 05:24:28 +03:00
enum Status
{
SELF,
2021-09-18 01:22:33 +03:00
VERIFIED,
UNVERIFIED,
BLOCKED,
NOT_APPLICABLE
2020-07-04 05:24:28 +03:00
};
Q_ENUM_NS(Status)
}
2020-07-05 19:03:27 +03:00
class DeviceVerificationFlow;
class TimelineViewManager;
2020-07-05 19:03:27 +03:00
2022-10-10 15:38:29 +03:00
class UserProfileFetchProxy final : public QObject
2022-08-13 17:28:41 +03:00
{
Q_OBJECT
public:
UserProfileFetchProxy(QObject *p = nullptr)
: QObject(p)
2022-09-25 21:05:08 +03:00
{
}
2022-08-13 17:28:41 +03:00
signals:
void profileFetched(mtx::responses::Profile);
};
2020-07-04 05:24:28 +03:00
class DeviceInfo
{
public:
DeviceInfo(const QString deviceID,
const QString displayName,
verification::Status verification_status_,
const QString lastIp_,
const size_t lastTs_)
: device_id(deviceID)
, display_name(displayName)
, verification_status(verification_status_)
, lastIp(lastIp_)
, lastTs(lastTs_)
2022-09-25 21:05:08 +03:00
{
}
2021-09-18 01:22:33 +03:00
DeviceInfo(const QString deviceID,
const QString displayName,
verification::Status verification_status_)
: device_id(deviceID)
, display_name(displayName)
, verification_status(verification_status_)
, lastTs(0)
2022-09-25 21:05:08 +03:00
{
}
2021-09-18 01:22:33 +03:00
DeviceInfo()
: verification_status(verification::UNVERIFIED)
2022-09-25 21:05:08 +03:00
{
}
2021-09-18 01:22:33 +03:00
QString device_id;
QString display_name;
verification::Status verification_status;
QString lastIp;
qlonglong lastTs;
2020-07-04 05:24:28 +03:00
};
2022-10-10 15:38:29 +03:00
class DeviceInfoModel final : public QAbstractListModel
2020-05-17 16:34:47 +03:00
{
2021-09-18 01:22:33 +03:00
Q_OBJECT
2020-05-17 16:34:47 +03:00
public:
2021-09-18 01:22:33 +03:00
enum Roles
{
DeviceId,
DeviceName,
VerificationStatus,
LastIp,
LastTs,
2021-09-18 01:22:33 +03:00
};
explicit DeviceInfoModel(QObject *parent = nullptr)
{
(void)parent;
connect(this, &DeviceInfoModel::queueReset, this, &DeviceInfoModel::reset);
};
QHash<int, QByteArray> roleNames() const override;
int rowCount(const QModelIndex &parent = QModelIndex()) const override
{
(void)parent;
return (int)deviceList_.size();
}
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
2020-07-04 05:24:28 +03:00
signals:
2021-09-18 01:22:33 +03:00
void queueReset(const std::vector<DeviceInfo> &deviceList);
2020-07-04 05:24:28 +03:00
public slots:
2021-09-18 01:22:33 +03:00
void reset(const std::vector<DeviceInfo> &deviceList);
2020-07-04 05:24:28 +03:00
private:
2021-09-18 01:22:33 +03:00
std::vector<DeviceInfo> deviceList_;
2021-09-18 01:22:33 +03:00
friend class UserProfile;
2020-07-04 05:24:28 +03:00
};
2022-10-10 15:38:29 +03:00
class UserProfile final : public QObject
2020-07-04 05:24:28 +03:00
{
2021-09-18 01:22:33 +03:00
Q_OBJECT
Q_PROPERTY(QString displayName READ displayName NOTIFY displayNameChanged)
Q_PROPERTY(QString userid READ userid CONSTANT)
Q_PROPERTY(QString avatarUrl READ avatarUrl NOTIFY avatarUrlChanged)
Q_PROPERTY(DeviceInfoModel *deviceList READ deviceList NOTIFY devicesChanged)
Q_PROPERTY(bool isGlobalUserProfile READ isGlobalUserProfile CONSTANT)
Q_PROPERTY(int userVerified READ getUserStatus NOTIFY userStatusChanged)
Q_PROPERTY(bool isLoading READ isLoading NOTIFY loadingChanged)
Q_PROPERTY(bool userVerificationEnabled READ userVerificationEnabled NOTIFY userStatusChanged)
Q_PROPERTY(bool isSelf READ isSelf CONSTANT)
Q_PROPERTY(TimelineModel *room READ room CONSTANT)
2020-07-04 05:24:28 +03:00
public:
UserProfile(const QString &roomid,
const QString &userid,
2021-09-18 01:22:33 +03:00
TimelineViewManager *manager_,
TimelineModel *parent = nullptr);
DeviceInfoModel *deviceList();
QString userid();
QString displayName();
QString avatarUrl();
bool isGlobalUserProfile() const;
crypto::Trust getUserStatus();
bool userVerificationEnabled() const;
bool isSelf() const;
bool isLoading() const;
TimelineModel *room() const { return model; }
Q_INVOKABLE void verify(QString device = QLatin1String(""));
Q_INVOKABLE void unverify(const QString &device = QLatin1String(""));
2021-09-18 01:22:33 +03:00
Q_INVOKABLE void fetchDeviceList(const QString &userID);
Q_INVOKABLE void refreshDevices();
2021-09-18 01:22:33 +03:00
Q_INVOKABLE void banUser();
Q_INVOKABLE void signOutDevice(const QString &deviceID);
2021-09-18 01:22:33 +03:00
// Q_INVOKABLE void ignoreUser();
Q_INVOKABLE void kickUser();
Q_INVOKABLE void startChat();
Q_INVOKABLE void startChat(bool encryptionEnabled);
Q_INVOKABLE void changeUsername(const QString &username);
Q_INVOKABLE void changeDeviceName(const QString &deviceID, const QString &deviceName);
2021-09-18 01:22:33 +03:00
Q_INVOKABLE void changeAvatar();
Q_INVOKABLE void openGlobalProfile();
2020-05-17 16:34:47 +03:00
signals:
2021-09-18 01:22:33 +03:00
void userStatusChanged();
void loadingChanged();
void displayNameChanged();
void avatarUrlChanged();
void displayError(const QString &errorMessage);
void globalUsernameRetrieved(const QString &globalUser);
void devicesChanged();
// internal
void verificationStatiChanged();
2021-02-02 14:54:08 +03:00
public slots:
2021-09-18 01:22:33 +03:00
void updateAvatarUrl();
2021-02-02 14:54:08 +03:00
private slots:
2021-09-18 01:22:33 +03:00
void setGlobalUsername(const QString &globalUser);
void updateVerificationStatus();
private:
2021-09-18 01:22:33 +03:00
void updateRoomMemberState(mtx::events::state::Member member);
void getGlobalProfileData();
2020-05-17 16:34:47 +03:00
private:
2021-09-18 01:22:33 +03:00
QString roomid_, userid_;
QString globalUsername;
QString globalAvatarUrl;
DeviceInfoModel deviceList_;
crypto::Trust isUserVerified = crypto::Trust::Unverified;
bool hasMasterKey = false;
bool isLoading_ = false;
TimelineViewManager *manager;
TimelineModel *model;
2020-07-01 15:17:10 +03:00
};