Show self profile from groups members list.

This commit is contained in:
John Preston
2026-08-22 16:29:19 +04:00
parent f3cade6aa3
commit db5f6a258e
9 changed files with 64 additions and 27 deletions

View File

@@ -195,6 +195,13 @@ public:
, _settingsType(settingsType) {
}
// The Saved Messages chat info page, not a self profile page.
[[nodiscard]] static Section SavedMessages() {
auto result = Section(Type::Profile);
result._savedMessages = true;
return result;
}
[[nodiscard]] Type type() const {
return _type;
}
@@ -208,11 +215,15 @@ public:
return _settingsType;
}
[[nodiscard]] bool savedMessages() const {
return _savedMessages;
}
private:
Type _type;
MediaType _mediaType = MediaType();
SettingsType _settingsType = SettingsType();
bool _savedMessages = false;
};

View File

@@ -181,7 +181,7 @@ std::vector<std::shared_ptr<ContentMemento>> Memento::DefaultStack(
Section Memento::DefaultSection(not_null<PeerData*> peer) {
if (peer->savedSublistsInfo()) {
return Profile::UseProfileMediaTabs()
? Section(Section::Type::Profile)
? Section::SavedMessages()
: Section(Section::Type::SavedSublists);
} else if (peer->sharedMediaInfo()) {
return Section(Section::MediaType::Photo);
@@ -206,7 +206,9 @@ std::shared_ptr<ContentMemento> Memento::DefaultContent(
case Section::Type::Profile:
return std::make_shared<Profile::Memento>(
peer,
migratedPeerId);
migratedPeerId,
Profile::Origin(),
section.savedMessages());
case Section::Type::Media:
if (section.mediaType() == Storage::SharedMediaType::Poll) {
return std::make_shared<Polls::ListMemento>(

View File

@@ -951,6 +951,7 @@ bool WrapWidget::returnToFirstStackFrame(
auto firstSection = _historyStack.front().section->section();
if (firstPeer == memento->peer()
&& firstSection.type() == memento->section().type()
&& firstSection.savedMessages() == memento->section().savedMessages()
&& firstSection.type() == Section::Type::Profile) {
_historyStack.resize(1);
_controller->showBackFromStack();

View File

@@ -177,6 +177,7 @@ InnerWidget::InnerWidget(
, _migrated(_controller->migrated())
, _topic(_controller->key().topic())
, _sublist(_controller->key().sublist())
, _savedMessages(_controller->section().savedMessages())
, _content(setupContent(this, origin)) {
_content->heightValue(
) | rpl::on_next([this](int height) {
@@ -211,8 +212,7 @@ object_ptr<Ui::RpWidget> InnerWidget::setupContent(
auto result = object_ptr<Ui::VerticalLayout>(parent);
const auto savedMessages = _peer->isSelf() && !_topic && !_sublist;
if (!savedMessages) {
if (!_savedMessages) {
const auto musicPeer = _sublist
? _sublist->sublistPeer().get()
: _peer.get();
@@ -232,7 +232,7 @@ object_ptr<Ui::RpWidget> InnerWidget::setupContent(
return result;
}
if (!savedMessages) {
if (!_savedMessages) {
BuildProfileDetailsSections(
stack,
_controller,
@@ -308,10 +308,10 @@ object_ptr<Ui::RpWidget> InnerWidget::setupContent(
addSplit(Type::Photo);
addSplit(Type::Video);
};
if (savedMessages) {
if (_savedMessages) {
tabs.push_back(MakeChatsTabDescriptor());
}
if (!_topic && !savedMessages) {
if (!_topic && !_savedMessages) {
tabs.push_back(MakeStoriesTabDescriptor(tabsPeer));
if (!_sublist) {
tabs.push_back(MakeGiftsTabDescriptor(_peer));
@@ -326,7 +326,7 @@ object_ptr<Ui::RpWidget> InnerWidget::setupContent(
MembersInTabValue(_peer)));
}
addMediaTabs();
if (!_topic && !savedMessages) {
if (!_topic && !_savedMessages) {
tabs.push_back(MakeSavedTabDescriptor(tabsPeer));
}
addTab(Storage::SharedMediaType::File);
@@ -340,7 +340,7 @@ object_ptr<Ui::RpWidget> InnerWidget::setupContent(
Storage::SharedMediaType::Poll) | rpl::map(_1 > 0)));
addTab(Storage::SharedMediaType::RoundVoiceFile);
addTab(Storage::SharedMediaType::GIF);
if (!_topic && !_sublist && !savedMessages) {
if (!_topic && !_sublist && !_savedMessages) {
if (const auto user = _peer->asUser()) {
tabs.push_back(MakeCommonGroupsTabDescriptor(user));
}
@@ -379,10 +379,10 @@ object_ptr<Ui::RpWidget> InnerWidget::setupContent(
.shown = raw->heightValue() | rpl::map(_1 > 0),
});
};
if (_topic || _sublist || savedMessages) {
if (_topic || _sublist || _savedMessages) {
if (tabs) {
addTabsHost();
if (savedMessages) {
if (_savedMessages) {
// The bar is pinned at its minimum height there, so the
// tabs behave as docked from the very start.
_tabsDocked = true;
@@ -497,7 +497,7 @@ void InnerWidget::visibleTopBottomUpdated(
}
}
_tabsHost->setVisibleRegion(visibleTop - top, visibleBottom - top);
_tabsDocked = (_peer->isSelf() && !_topic && !_sublist)
_tabsDocked = _savedMessages
|| ((top > 0) && (visibleTop >= top));
}
}
@@ -576,7 +576,6 @@ bool InnerWidget::hasFlexibleTopBar() const {
base::weak_qptr<Ui::RpWidget> InnerWidget::createPinnedToTop(
not_null<Ui::RpWidget*> parent) {
const auto savedMessages = _peer->isSelf() && !_topic && !_sublist;
const auto content = Ui::CreateChild<TopBar>(
parent,
TopBar::Descriptor{
@@ -586,9 +585,10 @@ base::weak_qptr<Ui::RpWidget> InnerWidget::createPinnedToTop(
.peer = _sublist ? _sublist->sublistPeer().get() : nullptr,
.backToggles = _backToggles.value(),
.showFinished = _showFinished.events(),
.customStatus = (savedMessages
.customStatus = (_savedMessages
? SavedChatsCountStatus(&_peer->session())
: rpl::producer<TextWithEntities>()),
.savedMessages = _savedMessages,
});
content->backRequest(
) | rpl::start_to_stream(_backClicks, content->lifetime());

View File

@@ -104,6 +104,7 @@ private:
PeerData * const _migrated = nullptr;
Data::ForumTopic * const _topic = nullptr;
Data::SavedSublist * const _sublist = nullptr;
const bool _savedMessages = false;
bool _inResize = false;
int _lastDesiredHeight = -1;

View File

@@ -343,10 +343,7 @@ TopBar::TopBar(
, _wrap(std::move(descriptor.wrap))
, _st(st::infoTopBar)
, _source(descriptor.source)
, _savedMessages(descriptor.source == Source::Profile
&& !_topic
&& !_key.sublist()
&& _peer->isSelf())
, _savedMessages(descriptor.savedMessages)
, _badgeTooltipHide(
std::make_unique<base::Timer>([=] { hideBadgeTooltip(); }))
, _botVerify(std::make_unique<Badge>(

View File

@@ -109,6 +109,7 @@ public:
rpl::producer<bool> backToggles;
rpl::producer<> showFinished;
rpl::producer<TextWithEntities> customStatus;
bool savedMessages = false;
};
struct AnimatedPatternPoint {

View File

@@ -41,14 +41,22 @@ Memento::Memento(not_null<Controller*> controller)
controller->topic(),
controller->sublist(),
controller->migratedPeerId(),
{ v::null }) {
{ v::null },
controller->section().savedMessages()) {
}
Memento::Memento(
not_null<PeerData*> peer,
PeerId migratedPeerId,
Origin origin)
: Memento(peer, nullptr, nullptr, migratedPeerId, origin) {
Origin origin,
bool savedMessages)
: Memento(
peer,
nullptr,
nullptr,
migratedPeerId,
origin,
savedMessages) {
}
Memento::Memento(
@@ -56,9 +64,11 @@ Memento::Memento(
Data::ForumTopic *topic,
Data::SavedSublist *sublist,
PeerId migratedPeerId,
Origin origin)
Origin origin,
bool savedMessages)
: ContentMemento(peer, topic, sublist, migratedPeerId)
, _origin(origin) {
, _origin(origin)
, _savedMessages(savedMessages) {
}
Memento::Memento(not_null<Data::ForumTopic*> topic)
@@ -70,7 +80,9 @@ Memento::Memento(not_null<Data::SavedSublist*> sublist)
}
Info::Section Memento::section() const {
return Info::Section(Info::Section::Type::Profile);
return _savedMessages
? Info::Section::SavedMessages()
: Info::Section(Info::Section::Type::Profile);
}
object_ptr<ContentWidget> Memento::createWidget(
@@ -325,7 +337,7 @@ rpl::producer<QString> Widget::title() {
return tr::lng_profile_direct_messages();
}
const auto peer = controller()->key().peer();
if (peer->isSelf() && !controller()->key().sublist()) {
if (controller()->section().savedMessages()) {
return tr::lng_saved_messages();
} else if (const auto user = peer->asUser()) {
return (user->isBot() && !user->isSupport())
@@ -356,6 +368,12 @@ bool Widget::showInternal(not_null<ContentMemento*> memento) {
return false;
}
if (auto profileMemento = dynamic_cast<Memento*>(memento.get())) {
if (profileMemento->savedMessages()
!= controller()->section().savedMessages()) {
// The Saved Messages page and the self profile page
// are built differently, so a new content is required.
return false;
}
restoreState(profileMemento);
return true;
}

View File

@@ -35,7 +35,8 @@ public:
Memento(
not_null<PeerData*> peer,
PeerId migratedPeerId,
Origin origin = { v::null });
Origin origin = { v::null },
bool savedMessages = false);
explicit Memento(not_null<Data::ForumTopic*> topic);
explicit Memento(not_null<Data::SavedSublist*> sublist);
@@ -49,6 +50,9 @@ public:
[[nodiscard]] Origin origin() const {
return _origin;
}
[[nodiscard]] bool savedMessages() const {
return _savedMessages;
}
void setMembersState(std::unique_ptr<MembersState> state);
[[nodiscard]] std::unique_ptr<MembersState> membersState();
@@ -68,10 +72,12 @@ private:
Data::ForumTopic *topic,
Data::SavedSublist *sublist,
PeerId migratedPeerId,
Origin origin);
Origin origin,
bool savedMessages);
std::unique_ptr<MembersState> _membersState;
Origin _origin;
bool _savedMessages = false;
QString _activeTab;
};