AddFriendDialog.cpp 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. #include "AddFriendDialog.h"
  2. #include "TitleBar.h"
  3. #include "UiHelpers.h"
  4. #include "ImClient.h"
  5. #include "Protocol.h"
  6. #include "AvatarCache.h"
  7. #include "common/protocol_def.h"
  8. #include <QJsonObject>
  9. #include <QHBoxLayout>
  10. #include <QLabel>
  11. #include <QLineEdit>
  12. #include <QPointer>
  13. #include <QPushButton>
  14. #include <QVBoxLayout>
  15. AddFriendDialog::AddFriendDialog(QWidget *parent)
  16. : QDialog(parent)
  17. {
  18. setObjectName(QStringLiteral("ChromeWindow"));
  19. setWindowTitle(QStringLiteral("添加好友"));
  20. setFixedSize(400, 460);
  21. UiHelpers::setupFramelessDialog(this);
  22. auto *root = new QVBoxLayout(this);
  23. root->setContentsMargins(0, 0, 0, 0);
  24. root->setSpacing(0);
  25. auto *bar = new TitleBar(this);
  26. bar->setTitle(QStringLiteral("添加好友"));
  27. bar->setTheme(TitleBar::Light);
  28. bar->setMaximizable(false);
  29. bar->bind(this, false);
  30. root->addWidget(bar);
  31. auto *page = new QWidget(this);
  32. auto *lay = new QVBoxLayout(page);
  33. lay->setContentsMargins(24, 18, 24, 22);
  34. lay->setSpacing(10);
  35. auto *row = new QHBoxLayout();
  36. row->setSpacing(8);
  37. m_keyword = UiHelpers::lineEdit(QStringLiteral("输入账号搜索"), page);
  38. auto *search = UiHelpers::primaryButton(QStringLiteral("搜索"), page);
  39. search->setFixedWidth(72);
  40. search->setMinimumWidth(72);
  41. row->addWidget(m_keyword, 1);
  42. row->addWidget(search);
  43. m_error = UiHelpers::errorLabel(page);
  44. m_result = new QWidget(page);
  45. m_result->setObjectName(QStringLiteral("FriendResult"));
  46. m_result->setStyleSheet(QStringLiteral(
  47. "QWidget#FriendResult { background:#F7F7F7; border:none; }"
  48. "QLabel { background:transparent; border:none; }"));
  49. auto *rLay = new QVBoxLayout(m_result);
  50. rLay->setContentsMargins(12, 12, 12, 12);
  51. rLay->setSpacing(8);
  52. auto *top = new QHBoxLayout();
  53. top->setSpacing(10);
  54. m_avatar = new QLabel(m_result);
  55. m_avatar->setFixedSize(44, 44);
  56. m_avatar->setStyleSheet(QStringLiteral("background:transparent; border:none;"));
  57. auto *info = new QVBoxLayout();
  58. info->setSpacing(2);
  59. info->setContentsMargins(0, 0, 0, 0);
  60. m_name = new QLabel(m_result);
  61. m_name->setStyleSheet(QStringLiteral(
  62. "QLabel { font-size:14px; color:#1A1A1A; background:transparent; border:none; }"));
  63. m_account = new QLabel(m_result);
  64. m_account->setStyleSheet(QStringLiteral(
  65. "QLabel { font-size:12px; color:#9A9A9A; background:transparent; border:none; }"));
  66. info->addWidget(m_name);
  67. info->addWidget(m_account);
  68. m_addBtn = UiHelpers::primaryButton(QStringLiteral("添加"), m_result);
  69. m_addBtn->setFixedSize(72, 32);
  70. top->addWidget(m_avatar, 0, Qt::AlignTop);
  71. top->addLayout(info, 1);
  72. top->addWidget(m_addBtn, 0, Qt::AlignTop);
  73. m_status = new QLabel(m_result);
  74. m_status->setWordWrap(true);
  75. m_status->setStyleSheet(QStringLiteral(
  76. "QLabel { color:#FA5151; font-size:12px; background:transparent; border:none; }"));
  77. m_status->hide();
  78. m_verify = UiHelpers::lineEdit(QStringLiteral("验证信息(选填)"), m_result);
  79. m_verify->setMaxLength(50);
  80. m_verify->hide();
  81. rLay->addLayout(top);
  82. rLay->addWidget(m_status);
  83. rLay->addWidget(m_verify);
  84. m_result->hide();
  85. lay->addLayout(row);
  86. lay->addWidget(m_error);
  87. lay->addWidget(m_result);
  88. lay->addStretch();
  89. root->addWidget(page, 1);
  90. connect(search, &QPushButton::clicked, this, &AddFriendDialog::onSearch);
  91. connect(m_keyword, &QLineEdit::returnPressed, this, &AddFriendDialog::onSearch);
  92. connect(m_addBtn, &QPushButton::clicked, this, &AddFriendDialog::onAdd);
  93. m_keyword->setFocus();
  94. }
  95. void AddFriendDialog::clearResult()
  96. {
  97. m_uid = 0;
  98. m_userAccount.clear();
  99. m_result->hide();
  100. m_status->hide();
  101. m_status->clear();
  102. m_verify->hide();
  103. m_verify->clear();
  104. m_addBtn->show();
  105. }
  106. void AddFriendDialog::showResult(const QJsonObject &user)
  107. {
  108. m_uid = Proto::jsonI64(user, QStringLiteral("uid"));
  109. m_userAccount = user.value(QStringLiteral("account")).toString();
  110. QString name = user.value(QStringLiteral("nickname")).toString();
  111. if (name.isEmpty())
  112. name = m_userAccount;
  113. m_name->setText(name);
  114. m_account->setText(QStringLiteral("账号 %1").arg(m_userAccount));
  115. const int ver = static_cast<int>(Proto::jsonI64(user, QStringLiteral("avatar_ver")));
  116. AvatarCache::instance().applyTo(m_avatar, m_uid, ver, name, 44);
  117. const int rel = user.value(QStringLiteral("relation")).toInt();
  118. const int allowAdd = user.value(QStringLiteral("allow_add")).toInt(1);
  119. QString status;
  120. bool canAdd = false;
  121. if (m_uid == ImClient::instance().uid())
  122. status = QStringLiteral("这是你自己的账号");
  123. else if (rel == im::FriendRel::Friend)
  124. status = QStringLiteral("已是好友");
  125. else if (rel == im::FriendRel::Pending)
  126. status = QStringLiteral("已发送申请,等待对方处理");
  127. else if (rel == im::FriendRel::Incoming)
  128. status = QStringLiteral("对方已申请添加你,请到「新的朋友」处理");
  129. else if (allowAdd == 0)
  130. status = QStringLiteral("对方不允许添加好友");
  131. else
  132. canAdd = true;
  133. m_addBtn->setVisible(canAdd);
  134. m_addBtn->setEnabled(canAdd);
  135. m_addBtn->setText(QStringLiteral("添加"));
  136. m_verify->setVisible(canAdd);
  137. if (canAdd)
  138. {
  139. m_status->hide();
  140. m_status->clear();
  141. m_verify->setFocus();
  142. }
  143. else
  144. {
  145. m_status->setText(status);
  146. m_status->show();
  147. }
  148. m_result->show();
  149. }
  150. void AddFriendDialog::onSearch()
  151. {
  152. const QString key = m_keyword->text().trimmed();
  153. UiHelpers::setError(m_error, QString());
  154. clearResult();
  155. if (key.isEmpty())
  156. {
  157. UiHelpers::setError(m_error, QStringLiteral("请输入账号或手机号"));
  158. return;
  159. }
  160. QPointer<AddFriendDialog> self(this);
  161. ImClient::instance().searchUser(key, [self](const QJsonObject &reply) {
  162. if (!self)
  163. return;
  164. if (!ImClient::ok(reply))
  165. {
  166. UiHelpers::setError(self->m_error, ImClient::messageOf(reply));
  167. return;
  168. }
  169. self->showResult(reply);
  170. });
  171. }
  172. void AddFriendDialog::onAdd()
  173. {
  174. if (m_uid <= 0)
  175. return;
  176. m_addBtn->setEnabled(false);
  177. const QString message = m_verify->text().trimmed();
  178. QPointer<AddFriendDialog> self(this);
  179. ImClient::instance().addFriend(m_uid, message, [self](const QJsonObject &reply) {
  180. if (!self)
  181. return;
  182. if (!ImClient::ok(reply))
  183. {
  184. self->m_addBtn->setEnabled(true);
  185. UiHelpers::setError(self->m_error, ImClient::messageOf(reply));
  186. return;
  187. }
  188. self->m_addBtn->hide();
  189. self->m_verify->hide();
  190. self->m_status->setText(QStringLiteral("已发送好友申请,等待对方同意"));
  191. self->m_status->show();
  192. UiHelpers::showToast(self, QStringLiteral("已发送好友申请,等待对方同意"));
  193. });
  194. }