fix: "reply to message" now takes usernames with @'s & commas into consideration (#5173)

Co-authored-by: Rasmus Karlsson <rasmus.karlsson@pajlada.com>
Co-authored-by: Felanbird <41973452+Felanbird@users.noreply.github.com>
This commit is contained in:
KleberPF 2024-02-17 10:25:14 -03:00 committed by GitHub
parent 32d269dffc
commit 42e4559910
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 93 additions and 14 deletions

View file

@ -77,6 +77,7 @@
- Bugfix: Fixed avatar in usercard and moderation button triggering when releasing the mouse outside their area. (#5052) - Bugfix: Fixed avatar in usercard and moderation button triggering when releasing the mouse outside their area. (#5052)
- Bugfix: Fixed moderator-only topics being subscribed to for non-moderators. (#5056) - Bugfix: Fixed moderator-only topics being subscribed to for non-moderators. (#5056)
- Bugfix: Fixed a bug where buttons would remain in a hovered state after leaving them. (#5077) - Bugfix: Fixed a bug where buttons would remain in a hovered state after leaving them. (#5077)
- Bugfix: Fixed an issue where you had to click the `reply` button twice if you already had that users @ in your input box. (#5173)
- Bugfix: Fixed popup windows not persisting between restarts. (#5081) - Bugfix: Fixed popup windows not persisting between restarts. (#5081)
- Bugfix: Fixed splits not retaining their focus after minimizing. (#5080) - Bugfix: Fixed splits not retaining their focus after minimizing. (#5080)
- Bugfix: Fixed _Copy message_ copying the channel name in global search. (#5106) - Bugfix: Fixed _Copy message_ copying the channel name in global search. (#5106)

View file

@ -1113,16 +1113,32 @@ void SplitInput::setReply(MessagePtr reply, bool showReplyingLabel)
// Only enable reply label if inline replying // Only enable reply label if inline replying
auto replyPrefix = "@" + this->replyThread_->displayName; auto replyPrefix = "@" + this->replyThread_->displayName;
auto plainText = this->ui_.textEdit->toPlainText().trimmed(); auto plainText = this->ui_.textEdit->toPlainText().trimmed();
if (!plainText.startsWith(replyPrefix))
// This makes it so if plainText contains "@StreamerFan" and
// we are replying to "@Streamer" we don't just leave "Fan"
// in the text box
if (plainText.startsWith(replyPrefix))
{ {
if (!plainText.isEmpty()) if (plainText.length() > replyPrefix.length())
{ {
replyPrefix.append(' '); if (plainText.at(replyPrefix.length()) == ',' ||
plainText.at(replyPrefix.length()) == ' ')
{
plainText.remove(0, replyPrefix.length() + 1);
}
}
else
{
plainText.remove(0, replyPrefix.length());
} }
this->ui_.textEdit->setPlainText(replyPrefix + plainText + " ");
this->ui_.textEdit->moveCursor(QTextCursor::EndOfBlock);
this->ui_.textEdit->resetCompletion();
} }
if (!plainText.isEmpty() && !plainText.startsWith(' '))
{
replyPrefix.append(' ');
}
this->ui_.textEdit->setPlainText(replyPrefix + plainText + " ");
this->ui_.textEdit->moveCursor(QTextCursor::EndOfBlock);
this->ui_.textEdit->resetCompletion();
this->ui_.replyLabel->setText("Replying to @" + this->ui_.replyLabel->setText("Replying to @" +
this->replyThread_->displayName); this->replyThread_->displayName);
} }

View file

@ -76,10 +76,11 @@ public:
Emotes emotes; Emotes emotes;
}; };
class SplitInputFixture : public ::testing::Test class SplitInputTest
: public ::testing::TestWithParam<std::tuple<QString, QString>>
{ {
protected: public:
SplitInputFixture() SplitInputTest()
: split(new Split(nullptr)) : split(new Split(nullptr))
, input(this->split) , input(this->split)
{ {
@ -92,18 +93,79 @@ protected:
} // namespace } // namespace
TEST_F(SplitInputFixture, Reply) TEST_P(SplitInputTest, Reply)
{ {
std::tuple<QString, QString> params = this->GetParam();
auto [inputText, expected] = params;
ASSERT_EQ("", this->input.getInputText()); ASSERT_EQ("", this->input.getInputText());
this->input.setInputText("forsen"); this->input.setInputText(inputText);
ASSERT_EQ("forsen", this->input.getInputText()); ASSERT_EQ(inputText, this->input.getInputText());
auto *message = new Message(); auto *message = new Message();
message->displayName = "xd"; message->displayName = "forsen";
auto reply = MessagePtr(message); auto reply = MessagePtr(message);
this->input.setReply(reply); this->input.setReply(reply);
QString expected("@xd forsen ");
QString actual = this->input.getInputText(); QString actual = this->input.getInputText();
ASSERT_EQ(expected, actual) ASSERT_EQ(expected, actual)
<< "Input text after setReply should be '" << qUtf8Printable(expected) << "Input text after setReply should be '" << qUtf8Printable(expected)
<< "', but got '" << qUtf8Printable(actual) << "'"; << "', but got '" << qUtf8Printable(actual) << "'";
} }
INSTANTIATE_TEST_SUITE_P(
SplitInput, SplitInputTest,
testing::Values(
// Ensure message is retained
std::make_tuple<QString, QString>(
// Pre-existing text in the input
"Test message",
// Expected text after replying to forsen
"@forsen Test message "),
// Ensure mention is stripped, no message
std::make_tuple<QString, QString>(
// Pre-existing text in the input
"@forsen",
// Expected text after replying to forsen
"@forsen "),
// Ensure mention with space is stripped, no message
std::make_tuple<QString, QString>(
// Pre-existing text in the input
"@forsen ",
// Expected text after replying to forsen
"@forsen "),
// Ensure mention is stripped, retain message
std::make_tuple<QString, QString>(
// Pre-existing text in the input
"@forsen Test message",
// Expected text after replying to forsen
"@forsen Test message "),
// Ensure mention with comma is stripped, no message
std::make_tuple<QString, QString>(
// Pre-existing text in the input
"@forsen,",
// Expected text after replying to forsen
"@forsen "),
// Ensure mention with comma is stripped, retain message
std::make_tuple<QString, QString>(
// Pre-existing text in the input
"@forsen Test message",
// Expected text after replying to forsen
"@forsen Test message "),
// Ensure mention with comma and space is stripped, no message
std::make_tuple<QString, QString>(
// Pre-existing text in the input
"@forsen, ",
// Expected text after replying to forsen
"@forsen "),
// Ensure it works with no message
std::make_tuple<QString, QString>(
// Pre-existing text in the input
"",
// Expected text after replying to forsen
"@forsen ")));