diff --git a/src/UserDirectoryModel.cpp b/src/UserDirectoryModel.cpp
new file mode 100644
index 00000000..2c44df40
--- /dev/null
+++ b/src/UserDirectoryModel.cpp
@@ -0,0 +1,105 @@
+// SPDX-FileCopyrightText: 2021 Nheko Contributors
+// SPDX-FileCopyrightText: 2022 Nheko Contributors
+// SPDX-FileCopyrightText: 2023 Nheko Contributors
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "UserDirectoryModel.h"
+
+#include "Cache.h"
+#include "Logging.h"
+#include <QSharedPointer>
+#include "MatrixClient.h"
+#include "mtx/responses/users.hpp"
+
+UserDirectoryModel::UserDirectoryModel(QObject *parent)
+ : QAbstractListModel{parent}
+{
+}
+
+QHash<int, QByteArray>
+UserDirectoryModel::roleNames() const
+{
+ return {
+ {Roles::DisplayName, "displayName"},
+ {Roles::Mxid, "userid"},
+ {Roles::AvatarUrl, "avatarUrl"},
+ };
+}
+
+void
+UserDirectoryModel::setSearchString(const QString &f)
+{
+ userSearchString_ = f.toStdString();
+ nhlog::ui()->debug("Received user directory query: {}", userSearchString_);
+ beginResetModel();
+ results_.clear();
+ if (userSearchString_ == "")
+ nhlog::ui()->debug("Rejecting empty search string");
+ else
+ canFetchMore_ = true;
+ endResetModel();
+}
+
+void
+UserDirectoryModel::fetchMore(const QModelIndex &)
+{
+ if (!canFetchMore_)
+ return;
+
+ nhlog::net()->debug("Fetching users from mtxclient...");
+ std::string searchTerm = userSearchString_;
+ searchingUsers_ = true;
+ emit searchingUsersChanged();
+ auto job = QSharedPointer<FetchUsersFromDirectoryJob>::create();
+ connect(job.data(),
+ &FetchUsersFromDirectoryJob::fetchedSearchResults,
+ this,
+ &UserDirectoryModel::displaySearchResults);
+ http::client()->search_user_directory(
+ searchTerm,
+ [job, searchTerm](const mtx::responses::Users &res, mtx::http::RequestErr err) {
+ if (err) {
+ nhlog::net()->error("Failed to retrieve users from mtxclient - {} - {} - {}",
+ mtx::errors::to_string(err->matrix_error.errcode),
+ err->matrix_error.error,
+ err->parse_error);
+ } else {
+ emit job->fetchedSearchResults(res.results, searchTerm);
+ }
+ },
+ 50);
+}
+
+QVariant
+UserDirectoryModel::data(const QModelIndex &index, int role) const
+{
+ if (!index.isValid() || index.row() >= (int)results_.size() || index.row() < 0)
+ return {};
+ switch (role) {
+ case Roles::DisplayName:
+ return QString::fromStdString(results_[index.row()].display_name);
+ case Roles::Mxid:
+ return QString::fromStdString(results_[index.row()].user_id);
+ case Roles::AvatarUrl:
+ return QString::fromStdString(results_[index.row()].avatar_url);
+ }
+ return {};
+}
+
+void
+UserDirectoryModel::displaySearchResults(std::vector<mtx::responses::User> results, const std::string &searchTerm)
+{
+ if (searchTerm != this->userSearchString_)
+ return;
+ searchingUsers_ = false;
+ emit searchingUsersChanged();
+ if (results.empty()) {
+ nhlog::net()->debug("mtxclient helper thread yielded no results!");
+ return;
+ }
+ beginInsertRows(QModelIndex(), 0, static_cast<int>(results.size()) - 1);
+ results_ = results;
+ endInsertRows();
+ canFetchMore_ = false;
+}
|