diff --git a/resources/qml/UserProfile.qml b/resources/qml/UserProfile.qml index 8328f4a5..2a06b955 100644 --- a/resources/qml/UserProfile.qml +++ b/resources/qml/UserProfile.qml @@ -58,6 +58,40 @@ ApplicationWindow { onClicked: profile.verify() } + Button { + id: changeUsername + + text: (profile.roomid_ == "") ? qsTr("Change global username") : qsTr("Change room username") + Layout.alignment: Qt.AlignHCenter + enabled : profile.isSelf + visible: profile.isSelf + onClicked: changeUsernameDialog.open() + + Dialog { + id: changeUsernameDialog + modal: true + title: (profile.roomid_ == "") ? qsTr("Change global username") : qsTr("Change room username") + onAccepted: profile.changeUsername(usernameEdit.text) + + Column { + anchors.fill: parent + + Text { + text: "New Username" + anchors.horizontalCenter: parent.horizontalCenter + } + TextField { + id: usernameEdit + focus: true + wrapMode: TextEdit.Wrap + anchors.horizontalCenter: parent.horizontalCenter + } + } + + standardButtons: Dialog.Ok | Dialog.Cancel + } + } + Image { Layout.preferredHeight: 16 Layout.preferredWidth: 16 diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp index 4346b0b2..79cf5184 100644 --- a/src/timeline/TimelineModel.cpp +++ b/src/timeline/TimelineModel.cpp @@ -799,9 +799,9 @@ TimelineModel::viewDecryptedRawMessage(QString id) const } void -TimelineModel::openUserProfile(QString userid) +TimelineModel::openUserProfile(QString userid, bool global) { - emit openProfile(new UserProfile(room_id_, userid, manager_, this)); + emit openProfile(new UserProfile(global ? "" : room_id_, userid, manager_, this)); } void diff --git a/src/timeline/TimelineModel.h b/src/timeline/TimelineModel.h index 35e62eb4..51b8049e 100644 --- a/src/timeline/TimelineModel.h +++ b/src/timeline/TimelineModel.h @@ -212,7 +212,7 @@ public: Q_INVOKABLE void viewRawMessage(QString id) const; Q_INVOKABLE void viewDecryptedRawMessage(QString id) const; - Q_INVOKABLE void openUserProfile(QString userid); + Q_INVOKABLE void openUserProfile(QString userid, bool global = false); Q_INVOKABLE void replyAction(QString id); Q_INVOKABLE void readReceiptsAction(QString id) const; Q_INVOKABLE void redactEvent(QString id); diff --git a/src/ui/UserProfile.cpp b/src/ui/UserProfile.cpp index 08219a38..503f314c 100644 --- a/src/ui/UserProfile.cpp +++ b/src/ui/UserProfile.cpp @@ -4,6 +4,7 @@ #include "DeviceVerificationFlow.h" #include "Logging.h" #include "Utils.h" +#include #include "mtx/responses/crypto.hpp" #include "timeline/TimelineModel.h" #include "timeline/TimelineViewManager.h" @@ -213,6 +214,44 @@ UserProfile::startChat() ChatPage::instance()->startChat(this->userid_); } +void +UserProfile::changeUsername(QString username) +{ + // change room username + mtx::events::state::Member member; + member.display_name = username.toStdString(); + member.avatar_url = + cache::avatarUrl(roomid_, + QString::fromStdString(http::client()->user_id().to_string())) + .toStdString(); + member.membership = mtx::events::state::Membership::Join; + + http::client()->send_state_event(roomid_.toStdString(), + http::client()->user_id().to_string(), + member, + [](mtx::responses::EventId, mtx::http::RequestErr err) { + if (err) + nhlog::net()->error( + "Failed to set room displayname: {}", + err->matrix_error.error); + }); + + /*connect(modal, &EditModal::nameChanged, this, [this](const QString &newName) { + if (roomNameLabel_) + roomNameLabel_->setText(newName); + });*/ + + /*std::string newName = "jedi18"; + // change user name + http::client()->set_displayname( + newName, [this]( mtx::http::RequestErr err) { + if (err) { + nhlog::net()->warn("could not change username"); + return; + } + });*/ +} + void UserProfile::verify(QString device) { diff --git a/src/ui/UserProfile.h b/src/ui/UserProfile.h index 19527310..df90e5a1 100644 --- a/src/ui/UserProfile.h +++ b/src/ui/UserProfile.h @@ -109,6 +109,7 @@ public: // Q_INVOKABLE void ignoreUser(); Q_INVOKABLE void kickUser(); Q_INVOKABLE void startChat(); + Q_INVOKABLE void changeUsername(QString username); signals: void userStatusChanged();