1
0
mirror of https://github.com/chylex/Nextcloud-Desktop.git synced 2024-09-29 00:42:45 +02:00
Nextcloud-Desktop/src/gui/userstatus.cpp
Camila 8d2264e027 Display the user status emoji separated from the message.
It allows to align the emoji with the message.

Signed-off-by: Camila <hello@camila.codes>
2021-05-25 06:55:53 +00:00

144 lines
4.1 KiB
C++

/*
* Copyright (C) by Camila <hello@camila.codes>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
#include "userstatus.h"
#include "account.h"
#include "accountstate.h"
#include "networkjobs.h"
#include "folderman.h"
#include "creds/abstractcredentials.h"
#include "theme.h"
#include "capabilities.h"
#include <QTimer>
#include <QJsonDocument>
#include <QJsonObject>
namespace OCC {
Q_LOGGING_CATEGORY(lcUserStatus, "nextcloud.gui.userstatus", QtInfoMsg)
namespace {
UserStatus::Status stringToEnum(const QString &status)
{
// it needs to match the Status enum
const QHash<QString, UserStatus::Status> preDefinedStatus{
{"online", UserStatus::Status::Online},
{"dnd", UserStatus::Status::DoNotDisturb},
{"away", UserStatus::Status::Away},
{"offline", UserStatus::Status::Offline},
{"invisible", UserStatus::Status::Invisible}
};
// api should return invisible, dnd,... toLower() it is to make sure
// it matches _preDefinedStatus, otherwise the default is online (0)
return preDefinedStatus.value(status.toLower(), UserStatus::Status::Online);
}
QString enumToString(UserStatus::Status status)
{
switch (status) {
case UserStatus::Status::Away:
return QObject::tr("Away");
case UserStatus::Status::DoNotDisturb:
return QObject::tr("Do not disturb");
case UserStatus::Status::Invisible:
case UserStatus::Status::Offline:
return QObject::tr("Offline");
case UserStatus::Status::Online:
return QObject::tr("Online");
}
Q_UNREACHABLE();
}
}
UserStatus::UserStatus(QObject *parent)
: QObject(parent)
{
}
void UserStatus::fetchUserStatus(AccountPtr account)
{
if (!account->capabilities().userStatus()) {
return;
}
if (_job) {
_job->deleteLater();
}
_job = new JsonApiJob(account, QStringLiteral("/ocs/v2.php/apps/user_status/api/v1/user_status"), this);
connect(_job.data(), &JsonApiJob::jsonReceived, this, &UserStatus::slotFetchUserStatusFinished);
_job->start();
}
void UserStatus::slotFetchUserStatusFinished(const QJsonDocument &json, int statusCode)
{
const QJsonObject defaultValues {
{"icon", ""},
{"message", ""},
{"status", "online"},
{"messageIsPredefined", "false"},
{"statusIsUserDefined", "false"}
};
if (statusCode != 200) {
qCInfo(lcUserStatus) << "Slot fetch UserStatus finished with status code" << statusCode;
qCInfo(lcUserStatus) << "Using then default values as if user has not set any status" << defaultValues;
}
const auto retrievedData = json.object().value("ocs").toObject().value("data").toObject(defaultValues);
_emoji = retrievedData.value("icon").toString().trimmed();
_status = stringToEnum(retrievedData.value("status").toString());
_message = retrievedData.value("message").toString().trimmed();
emit fetchUserStatusFinished();
}
UserStatus::Status UserStatus::status() const
{
return _status;
}
QString UserStatus::message() const
{
return _message;
}
QString UserStatus::emoji() const
{
return _emoji;
}
QUrl UserStatus::icon() const
{
switch (_status) {
case Status::Away:
return Theme::instance()->statusAwayImageSource();
case Status::DoNotDisturb:
return Theme::instance()->statusDoNotDisturbImageSource();
case Status::Invisible:
case Status::Offline:
return Theme::instance()->statusInvisibleImageSource();
case Status::Online:
return Theme::instance()->statusOnlineImageSource();
}
Q_UNREACHABLE();
}
} // namespace OCC