From 81492b7d3a1f9339fd344d6a7f100f755245a130 Mon Sep 17 00:00:00 2001
From: John Preston <johnprestonmail@gmail.com>
Date: Fri, 11 Oct 2024 14:08:04 +0400
Subject: [PATCH] Add "when edited" context menu information.

---
 .../Resources/icons/menu/edited_status.png    | Bin 0 -> 586 bytes
 .../Resources/icons/menu/edited_status@2x.png | Bin 0 -> 1252 bytes
 .../Resources/icons/menu/edited_status@3x.png | Bin 0 -> 1825 bytes
 Telegram/SourceFiles/api/api_who_reacted.cpp  |  14 +++++++++
 Telegram/SourceFiles/api/api_who_reacted.h    |   3 ++
 .../history/history_inner_widget.cpp          |  16 +++++-----
 .../view/history_view_context_menu.cpp        |  28 ++++++++++++++++++
 .../history/view/history_view_context_menu.h  |   3 ++
 Telegram/SourceFiles/ui/chat/chat.style       |   2 ++
 .../controls/who_reacted_context_action.cpp   |   4 ++-
 .../ui/controls/who_reacted_context_action.h  |   3 +-
 11 files changed, 64 insertions(+), 9 deletions(-)
 create mode 100644 Telegram/Resources/icons/menu/edited_status.png
 create mode 100644 Telegram/Resources/icons/menu/edited_status@2x.png
 create mode 100644 Telegram/Resources/icons/menu/edited_status@3x.png

diff --git a/Telegram/Resources/icons/menu/edited_status.png b/Telegram/Resources/icons/menu/edited_status.png
new file mode 100644
index 0000000000000000000000000000000000000000..70fb24466a33f9fb18ea1d76d62250f003eb566b
GIT binary patch
literal 586
zcmV-Q0=4~#P)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00009a7bBm000XU
z000XU0RWnu7ytkP{7FPXR7i=<RUxP<Q4k%!7=(+gHf_RV7jeUaCW{z0Xc4R?yUk+I
zuEk_BD2VBzAS{>#Q8deL7Yt%hSu`zpUir%R>#q9w!W)>dGk509nc2D5MMR(v%CAo*
z|9Jq6G4lC*Z-c-|RaFJ&9Q*wq7uoOk7z_r8#bS=JL<Cy~f*_ElX*3#*=x{htKA$H^
zl1Nb$Di(`mnkLQXbL#baBnZNL3<N=dVHnVL9r1YFwz_CEip64q$z%er*K2p~-l%CB
zbX|7}x+!M4T%zCazXqVHDlE&gt-RaqLYCzlTR0qsWm!-Z<v9T79IaN%w&L}Ajchi1
zXXl)w-EKc0vZ|^y91b0a_DE{A8lBJQhrTNsV+;TwisIW0?DVZgOC%EH_xowL+dcG4
zl0>uFjAU89+HL@j$0HpM2m1Q@x(Rf-TvRTXX*?cNv)QD{WOA3BF-CzvfL5y&F~)9u
zPlw#;bg<oSkxr*=TfsTU>2yLQ5_$hOO{G!@27|WAOQjM3fOG!;7cH4g!m=zFh5^Rd
zYXE{EK-cxBS4Aik!e+C9X_}BE>9tM%6GYQASeAuWtA$J^15p&=cDq4D@OV6!PNx8X
zTrTIt(zykHU)PmN1w@2uwF&^J*Xz&P_}aqI??t>YC=?24G#b}$J9S-9J|#cvP5u}8
Y28d4pK!e(vM*si-07*qoM6N<$f{Bs<3IG5A

literal 0
HcmV?d00001

diff --git a/Telegram/Resources/icons/menu/edited_status@2x.png b/Telegram/Resources/icons/menu/edited_status@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..004167a148f30c34abcc7441be3cff13cb27c7e1
GIT binary patch
literal 1252
zcmV<A1RMK_P)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm00009a7bBm000XU
z000XU0RWnu7ytkSmPtfGRA_<iS=}qUZy3KeW8^VKNs|_nlH@HT2l8^T6E7*L6{1$k
zky?ub4(vam#7-pTK;i&J+453eOE@8^jZCw7SrPNrKHr1iZ%^NmJ<qde`%3xLRZG{)
z=X3A6@7>o;LPVe+4C!|h5Q|>{-;G}Z-;EzHKo+UQ48xF8sU)dXN^ZBCJRT1LkvXvu
z4$I5SLtkGXc6WDie}9jUczu1v#>NIrCKF0aOT$w0e-oELtJPwEfBzF<E^KXWp{c1!
zv;c`;g;1!~YBHP6R8v#K{_XksnXFbTt*xz*!{H#O(@8#`k5W=nNTpIyWo0E*R8){c
zp<rVy77OY1dOANp4}}I1AC(`iy1E*-x3}zS+H5wowY4EWKAtl+HZ~S|y&gwLM{NAV
z!vpH->i$g&wYRt9?d=T!@bdBkgTa89m>9u@qoShF+uMuh=Vt)G+uIvjT3RA2pt`!6
zCGT>%P+ndxx`zu23UGCG1px5*e5kFhjf?=bTFthN%jH5wMuuqee#^?r!o|e}0Knt%
z2+hsU(PFW%Z4-`_|7ay8C3tyx0RXJ8uZLHFR;y(<oWWoaL`<X6U}R(jnVFfKzTMs3
zY#jlcn%l{L&f9D@!5emYc^LpOI5^1ZE0f7^dU^@~I6OQIkAS?qJa$#u+S&xS#`g9$
z0AOrvjF*3FYb#qXKR=(-pYt-;(9l3c|NThK%*=4Pi^j~%3_U$P5fM>yb2Fzur-1tU
zdLkmSTCMc>_$ZPdH=drJXl`zfh=_7?b2<GvZ=*RmIYdOXy1FWknE)7#Msm4aG(JAg
z=^Io4!!X1!3=t7sUS5WU93MCw4(jgi=H(l-g_KGq``PJqiXs&$M06sP$z%aHPoa>@
z<zzOSX<%T0qNAg~^!xINVi<-!(sVkVpyN}eQekUri;eH??G=0k4-XHs@zc}Oq5Tf{
zrz@k;$h&Z3V<YbF?%3k<^Ye&}jTJ1QxVRW+XJ-HatJNBsfZg3)0Kme+0%t+FT#lik
zA(r^->njWf10)iOAmT+uMVOqNL_$IWl9Q7$H8mCNDiS<dUtb>p!0Yt}9az%R(y+I;
z7ck^#G#bIHo|KdXyWI`|I6gi`PEHP2Oz?z!uM!{oH8C+!FnOs|ilwC`{EhzpesKbb
z_+93zs;aQQzK+h$PQk?eW-^%q$S*D~LMoMt7a-<3&DUycYvJ?x*gAH*9Z5+^d}8?(
zh~z+{R;%Ihcv$jYuNQ@dg?!`r7m37385b9agM)*B*6HZz5R!v`u}BQ{6B82w<VQzG
zh2{`eFkH_nM1-!ct^o2oJ3FD|5?)x$!<OI5%F5Uw9st~KH`3G7Ls^K>zIwG<&2H?!
zH{Zg-0*po@bUGa>D=Wb;%%|9tloU7|4mR%n{T($mHKDelxE|(u+`YcO4iFI)6@`_R
zl>ncfo*pqA#0l`*SI_Go1r!z*29TefofTU<JOVx%!!XFs&i>Rwsi~<f`ID0qC=?1&
zbwYk#4;2!Lgu1%A=;GpnHa9ov=H^CRKKjQ3!i^vQPrhFP-;G}Z-;F=u^S}5#RJbz$
O0000<MNUMnLSTYz3r7C{

literal 0
HcmV?d00001

diff --git a/Telegram/Resources/icons/menu/edited_status@3x.png b/Telegram/Resources/icons/menu/edited_status@3x.png
new file mode 100644
index 0000000000000000000000000000000000000000..1acdf8ea936009cb61fb51706d8d9aa69204759d
GIT binary patch
literal 1825
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
P00000NkvXXu0mjfzB-0{

literal 0
HcmV?d00001

diff --git a/Telegram/SourceFiles/api/api_who_reacted.cpp b/Telegram/SourceFiles/api/api_who_reacted.cpp
index 6c9df39b2..b0e44cfc9 100644
--- a/Telegram/SourceFiles/api/api_who_reacted.cpp
+++ b/Telegram/SourceFiles/api/api_who_reacted.cpp
@@ -756,5 +756,19 @@ rpl::producer<Ui::WhoReadContent> WhoReacted(
 		const style::WhoRead &st) {
 	return WhoReacted(item, reaction, context, st, nullptr);
 }
+rpl::producer<Ui::WhoReadContent> WhenEdited(
+		not_null<PeerData*> author,
+		TimeId date) {
+	return rpl::single(Ui::WhoReadContent{
+		.participants = { Ui::WhoReadParticipant{
+			.name = author->name(),
+			.date = FormatReadDate(date, QDateTime::currentDateTime()),
+			.id = author->id.value,
+		} },
+		.type = Ui::WhoReadType::Edited,
+		.fullReadCount = 1,
+	});
+}
+
 
 } // namespace Api
diff --git a/Telegram/SourceFiles/api/api_who_reacted.h b/Telegram/SourceFiles/api/api_who_reacted.h
index 9a9100535..0d1cf7234 100644
--- a/Telegram/SourceFiles/api/api_who_reacted.h
+++ b/Telegram/SourceFiles/api/api_who_reacted.h
@@ -61,5 +61,8 @@ struct WhoReadList {
 	const Data::ReactionId &reaction,
 	not_null<QWidget*> context, // Cache results for this lifetime.
 	const style::WhoRead &st);
+[[nodiscard]] rpl::producer<Ui::WhoReadContent> WhenEdited(
+	not_null<PeerData*> author,
+	TimeId date);
 
 } // namespace Api
diff --git a/Telegram/SourceFiles/history/history_inner_widget.cpp b/Telegram/SourceFiles/history/history_inner_widget.cpp
index dcc9d77e8..6df845885 100644
--- a/Telegram/SourceFiles/history/history_inner_widget.cpp
+++ b/Telegram/SourceFiles/history/history_inner_widget.cpp
@@ -2252,22 +2252,22 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
 		}
 		return item;
 	};
-	const auto whoReactedItem = groupLeaderOrSelf(_dragStateItem);
-	const auto hasWhoReactedItem = whoReactedItem
-		&& Api::WhoReactedExists(whoReactedItem, Api::WhoReactedList::All);
+	const auto leaderOrSelf = groupLeaderOrSelf(_dragStateItem);
+	const auto hasWhoReactedItem = leaderOrSelf
+		&& Api::WhoReactedExists(leaderOrSelf, Api::WhoReactedList::All);
 	const auto clickedReaction = link
 		? link->property(
 			kReactionsCountEmojiProperty).value<Data::ReactionId>()
 		: Data::ReactionId();
 	_whoReactedMenuLifetime.destroy();
 	if (!clickedReaction.empty()
-		&& whoReactedItem
-		&& Api::WhoReactedExists(whoReactedItem, Api::WhoReactedList::One)) {
+		&& leaderOrSelf
+		&& Api::WhoReactedExists(leaderOrSelf, Api::WhoReactedList::One)) {
 		HistoryView::ShowWhoReactedMenu(
 			&_menu,
 			e->globalPos(),
 			this,
-			whoReactedItem,
+			leaderOrSelf,
 			clickedReaction,
 			_controller,
 			_whoReactedMenuLifetime);
@@ -2954,8 +2954,10 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
 		HistoryView::AddWhoReactedAction(
 			_menu,
 			this,
-			whoReactedItem,
+			leaderOrSelf,
 			_controller);
+	} else {
+		HistoryView::MaybeAddWhenEditedAction(_menu, leaderOrSelf);
 	}
 
 	if (_menu->empty()) {
diff --git a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp
index 82da069a7..e34cab589 100644
--- a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp
+++ b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp
@@ -22,6 +22,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 #include "history/view/history_view_cursor_state.h"
 #include "history/history.h"
 #include "history/history_item.h"
+#include "history/history_item_components.h"
 #include "history/history_item_text.h"
 #include "history/view/history_view_schedule_box.h"
 #include "history/view/media/history_view_media.h"
@@ -1286,6 +1287,8 @@ base::unique_qptr<Ui::PopupMenu> FillContextMenu(
 	}
 	if (hasWhoReactedItem) {
 		AddWhoReactedAction(result, list, item, list->controller());
+	} else if (item) {
+		MaybeAddWhenEditedAction(result, item);
 	}
 
 	return result;
@@ -1441,6 +1444,24 @@ void AddSaveSoundForNotifications(
 	}, &st::menuIconSoundAdd);
 }
 
+void AddWhenEditedActionHelper(
+		not_null<Ui::PopupMenu*> menu,
+		not_null<HistoryItem*> item,
+		bool insertSeparator) {
+	if (item->history()->peer->isUser()) {
+		if (const auto edited = item->Get<HistoryMessageEdited>()) {
+			if (!item->hideEditedBadge()) {
+				if (insertSeparator && !menu->empty()) {
+					menu->addSeparator(&st::expandedMenuSeparator);
+				}
+				menu->addAction(Ui::WhenReadContextAction(
+					menu.get(),
+					Api::WhenEdited(item->from(), edited->date)));
+			}
+		}
+	}
+}
+
 void AddWhoReactedAction(
 		not_null<Ui::PopupMenu*> menu,
 		not_null<QWidget*> context,
@@ -1486,6 +1507,7 @@ void AddWhoReactedAction(
 	if (!menu->empty()) {
 		menu->addSeparator(&st::expandedMenuSeparator);
 	}
+	AddWhenEditedActionHelper(menu, item, false);
 	if (item->history()->peer->isUser()) {
 		menu->addAction(Ui::WhenReadContextAction(
 			menu.get(),
@@ -1501,6 +1523,12 @@ void AddWhoReactedAction(
 	}
 }
 
+void MaybeAddWhenEditedAction(
+		not_null<Ui::PopupMenu*> menu,
+		not_null<HistoryItem*> item) {
+	AddWhenEditedActionHelper(menu, item, true);
+}
+
 void AddEditTagAction(
 		not_null<Ui::PopupMenu*> menu,
 		const Data::ReactionId &id,
diff --git a/Telegram/SourceFiles/history/view/history_view_context_menu.h b/Telegram/SourceFiles/history/view/history_view_context_menu.h
index 1b14804aa..1d02e64c2 100644
--- a/Telegram/SourceFiles/history/view/history_view_context_menu.h
+++ b/Telegram/SourceFiles/history/view/history_view_context_menu.h
@@ -84,6 +84,9 @@ void AddWhoReactedAction(
 	not_null<QWidget*> context,
 	not_null<HistoryItem*> item,
 	not_null<Window::SessionController*> controller);
+void MaybeAddWhenEditedAction(
+	not_null<Ui::PopupMenu*> menu,
+	not_null<HistoryItem*> item);
 void ShowWhoReactedMenu(
 	not_null<base::unique_qptr<Ui::PopupMenu>*> menu,
 	QPoint position,
diff --git a/Telegram/SourceFiles/ui/chat/chat.style b/Telegram/SourceFiles/ui/chat/chat.style
index 7633eed08..53b2ef183 100644
--- a/Telegram/SourceFiles/ui/chat/chat.style
+++ b/Telegram/SourceFiles/ui/chat/chat.style
@@ -808,6 +808,8 @@ whoReadPlayedDisabled: icon {{ "menu/read_audio", menuFgDisabled }};
 whoReadReactions: icon{{ "menu/read_reactions", windowBoldFg }};
 whoReadReactionsOver: icon{{ "menu/read_reactions", windowBoldFg }};
 whoReadReactionsDisabled: icon{{ "menu/read_reactions", menuFgDisabled }};
+whenEdited: icon {{ "menu/edited_status", windowBoldFg }};
+whenEditedOver: icon {{ "menu/edited_status", windowBoldFg }};
 
 reactionsTabAll: icon {{ "menu/read_reactions", windowFg }};
 reactionsTabAllSelected: icon {{ "menu/read_reactions", activeButtonFg }};
diff --git a/Telegram/SourceFiles/ui/controls/who_reacted_context_action.cpp b/Telegram/SourceFiles/ui/controls/who_reacted_context_action.cpp
index 37a15de62..a2f8f7229 100644
--- a/Telegram/SourceFiles/ui/controls/who_reacted_context_action.cpp
+++ b/Telegram/SourceFiles/ui/controls/who_reacted_context_action.cpp
@@ -597,7 +597,9 @@ void WhenAction::paint(Painter &p) {
 		p.fillRect(0, 0, width(), _height, _st.itemBg);
 	}
 	p.fillRect(0, 0, width(), _height, _st.itemBg);
-	const auto &icon = loading
+	const auto &icon = (_content.type == WhoReadType::Edited)
+		? (selected ? st::whenEditedOver : st::whenEdited)
+		: loading
 		? st::whoReadChecksDisabled
 		: selected
 		? st::whoReadChecksOver
diff --git a/Telegram/SourceFiles/ui/controls/who_reacted_context_action.h b/Telegram/SourceFiles/ui/controls/who_reacted_context_action.h
index 74e3f0d54..f0b2545f5 100644
--- a/Telegram/SourceFiles/ui/controls/who_reacted_context_action.h
+++ b/Telegram/SourceFiles/ui/controls/who_reacted_context_action.h
@@ -36,6 +36,7 @@ enum class WhoReadType {
 	Listened,
 	Watched,
 	Reacted,
+	Edited,
 };
 
 enum class WhoReadState : uchar {
@@ -65,7 +66,7 @@ struct WhoReadContent {
 [[nodiscard]] base::unique_qptr<Menu::ItemBase> WhenReadContextAction(
 	not_null<PopupMenu*> menu,
 	rpl::producer<WhoReadContent> content,
-	Fn<void()> showOrPremium);
+	Fn<void()> showOrPremium = nullptr);
 
 enum class WhoReactedType : uchar {
 	Viewed,