add user search to invite dialog (#1253)
This commit is contained in:
parent
3abb49c4a2
commit
5ed3bfc8f8
12 changed files with 437 additions and 99 deletions
105
src/UserDirectoryModel.cpp
Normal file
105
src/UserDirectoryModel.cpp
Normal file
|
|
@ -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;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue