mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-04-11 11:47:09 +02:00
Show new-peer-info photo/name change.
This commit is contained in:
parent
b6a31979f2
commit
72a35ba58b
5 changed files with 108 additions and 0 deletions
|
@ -349,6 +349,8 @@ enum class MessageFlag : uint64 {
|
|||
EstimatedDate = (1ULL << 49),
|
||||
|
||||
ReactionsAllowed = (1ULL << 50),
|
||||
|
||||
HideDisplayDate = (1ULL << 51),
|
||||
};
|
||||
inline constexpr bool is_flag_type(MessageFlag) { return true; }
|
||||
using MessageFlags = base::flags<MessageFlag>;
|
||||
|
|
|
@ -137,6 +137,10 @@ void History::setHasPendingResizedItems() {
|
|||
void History::itemRemoved(not_null<HistoryItem*> item) {
|
||||
if (item == _joinedMessage) {
|
||||
_joinedMessage = nullptr;
|
||||
} else if (item == _newPeerNameChange) {
|
||||
_newPeerNameChange = nullptr;
|
||||
} else if (item == _newPeerPhotoChange) {
|
||||
_newPeerPhotoChange = nullptr;
|
||||
}
|
||||
item->removeMainView();
|
||||
if (_lastServerMessage == item) {
|
||||
|
@ -1229,6 +1233,8 @@ void History::mainViewRemoved(
|
|||
not_null<HistoryBlock*> block,
|
||||
not_null<HistoryView::Element*> view) {
|
||||
Expects(_joinedMessage != view->data());
|
||||
Expects(_newPeerNameChange != view->data());
|
||||
Expects(_newPeerPhotoChange != view->data());
|
||||
|
||||
if (_firstUnreadView == view) {
|
||||
getNextFirstUnreadMessage();
|
||||
|
@ -3243,6 +3249,85 @@ HistoryItem *History::insertJoinedMessage() {
|
|||
return _joinedMessage;
|
||||
}
|
||||
|
||||
void History::checkNewPeerMessages() {
|
||||
if (!loadedAtTop()) {
|
||||
return;
|
||||
}
|
||||
const auto user = peer->asUser();
|
||||
if (!user) {
|
||||
return;
|
||||
}
|
||||
const auto photo = user->photoChangeDate();
|
||||
const auto name = user->nameChangeDate();
|
||||
if (!photo && _newPeerPhotoChange) {
|
||||
_newPeerPhotoChange->destroy();
|
||||
}
|
||||
if (!name && _newPeerNameChange) {
|
||||
_newPeerNameChange->destroy();
|
||||
}
|
||||
if ((!photo || _newPeerPhotoChange) && (!name || _newPeerNameChange)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const auto when = [](TimeId date) {
|
||||
const auto now = base::unixtime::now();
|
||||
const auto passed = now - date;
|
||||
if (passed < 3600) {
|
||||
return tr::lng_new_contact_updated_now(tr::now);
|
||||
} else if (passed < 24 * 3600) {
|
||||
return tr::lng_new_contact_updated_hours(
|
||||
tr::now,
|
||||
lt_count,
|
||||
(passed / 3600));
|
||||
} else if (passed < 60 * 24 * 3600) {
|
||||
return tr::lng_new_contact_updated_days(
|
||||
tr::now,
|
||||
lt_count,
|
||||
(passed / (24 * 3600)));
|
||||
}
|
||||
return tr::lng_new_contact_updated_months(
|
||||
tr::now,
|
||||
lt_count,
|
||||
(passed / (30 * 24 * 3600)));
|
||||
};
|
||||
|
||||
auto firstDate = TimeId();
|
||||
for (const auto &block : blocks) {
|
||||
for (const auto &message : block->messages) {
|
||||
const auto item = message->data();
|
||||
if (item != _newPeerPhotoChange && item != _newPeerNameChange) {
|
||||
firstDate = item->date();
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (firstDate) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!firstDate) {
|
||||
firstDate = base::unixtime::serialize(
|
||||
QDateTime(QDate(2013, 8, 1), QTime(0, 0)));
|
||||
}
|
||||
const auto add = [&](tr::phrase<lngtag_when> phrase, TimeId date) {
|
||||
const auto result = makeMessage({
|
||||
.id = owner().nextLocalMessageId(),
|
||||
.flags = MessageFlag::Local | MessageFlag::HideDisplayDate,
|
||||
.date = (--firstDate),
|
||||
}, PreparedServiceText{ TextWithEntities{
|
||||
phrase(tr::now, lt_when, when(date)),
|
||||
} });
|
||||
insertMessageToBlocks(result);
|
||||
return result;
|
||||
};
|
||||
|
||||
if (photo && !_newPeerPhotoChange) {
|
||||
_newPeerPhotoChange = add(tr::lng_new_contact_updated_photo, photo);
|
||||
}
|
||||
if (name && !_newPeerNameChange) {
|
||||
_newPeerNameChange = add(tr::lng_new_contact_updated_name, name);
|
||||
}
|
||||
}
|
||||
|
||||
void History::insertMessageToBlocks(not_null<HistoryItem*> item) {
|
||||
Expects(item->mainView() == nullptr);
|
||||
|
||||
|
@ -3296,6 +3381,8 @@ void History::checkLocalMessages() {
|
|||
&& peer->asChannel()->inviter
|
||||
&& goodDate(peer->asChannel()->inviteDate)) {
|
||||
insertJoinedMessage();
|
||||
} else {
|
||||
checkNewPeerMessages();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3309,6 +3396,15 @@ void History::removeJoinedMessage() {
|
|||
}
|
||||
}
|
||||
|
||||
void History::removeNewPeerMessages() {
|
||||
if (_newPeerNameChange) {
|
||||
_newPeerNameChange->destroy();
|
||||
}
|
||||
if (_newPeerPhotoChange) {
|
||||
_newPeerPhotoChange->destroy();
|
||||
}
|
||||
}
|
||||
|
||||
void History::reactionsEnabledChanged(bool enabled) {
|
||||
if (!enabled) {
|
||||
for (const auto &item : _items) {
|
||||
|
|
|
@ -82,6 +82,7 @@ public:
|
|||
[[nodiscard]] HistoryItem *joinedMessageInstance() const;
|
||||
void checkLocalMessages();
|
||||
void removeJoinedMessage();
|
||||
void removeNewPeerMessages();
|
||||
|
||||
void reactionsEnabledChanged(bool enabled);
|
||||
|
||||
|
@ -545,6 +546,7 @@ private:
|
|||
|
||||
HistoryItem *insertJoinedMessage();
|
||||
void insertMessageToBlocks(not_null<HistoryItem*> item);
|
||||
void checkNewPeerMessages();
|
||||
|
||||
[[nodiscard]] Dialogs::BadgesState computeBadgesState() const;
|
||||
[[nodiscard]] Dialogs::BadgesState adjustBadgesStateByFolder(
|
||||
|
@ -563,6 +565,8 @@ private:
|
|||
Element *_unreadBarView = nullptr;
|
||||
Element *_firstUnreadView = nullptr;
|
||||
HistoryItem *_joinedMessage = nullptr;
|
||||
HistoryItem *_newPeerNameChange = nullptr;
|
||||
HistoryItem *_newPeerPhotoChange = nullptr;
|
||||
bool _loadedAtTop = false;
|
||||
bool _loadedAtBottom = true;
|
||||
|
||||
|
|
|
@ -322,6 +322,9 @@ public:
|
|||
[[nodiscard]] bool hideEditedBadge() const {
|
||||
return (_flags & MessageFlag::HideEdited);
|
||||
}
|
||||
[[nodiscard]] bool hideDisplayDate() const {
|
||||
return (_flags & MessageFlag::HideDisplayDate);
|
||||
}
|
||||
[[nodiscard]] bool isLocal() const {
|
||||
return _flags & MessageFlag::Local;
|
||||
}
|
||||
|
|
|
@ -1427,6 +1427,9 @@ bool Element::countIsTopicRootReply() const {
|
|||
|
||||
void Element::setDisplayDate(bool displayDate) {
|
||||
const auto item = data();
|
||||
if (item->hideDisplayDate()) {
|
||||
displayDate = false;
|
||||
}
|
||||
if (displayDate && !Has<DateBadge>()) {
|
||||
AddComponents(DateBadge::Bit());
|
||||
Get<DateBadge>()->init(
|
||||
|
|
Loading…
Add table
Reference in a new issue