/* This file is part of Telegram Desktop, the official desktop version of Telegram messaging app, see https://telegram.org Telegram Desktop is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. It is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. In addition, as a special exception, the copyright holders give permission to link the code of portions of this program with the OpenSSL library. Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org */ #include "info/profile/info_profile_values.h" #include #include #include #include #include "observer_peer.h" #include "messenger.h" #include "ui/wrap/slide_wrap.h" #include "history/history_shared_media.h" namespace Info { namespace Profile { rpl::producer PeerUpdateViewer( Notify::PeerUpdate::Flags flags) { return [=](const rpl::consumer &consumer) { auto lifetime = rpl::lifetime(); lifetime.make_state( Notify::PeerUpdated().add_subscription({ flags, [=]( const Notify::PeerUpdate &update) { consumer.put_next_copy(update); }})); return lifetime; }; } rpl::producer PeerUpdateViewer( not_null peer, Notify::PeerUpdate::Flags flags) { return PeerUpdateViewer(flags) | rpl::filter([=](const Notify::PeerUpdate &update) { return (update.peer == peer); }); } rpl::producer PeerUpdateValue( not_null peer, Notify::PeerUpdate::Flags flags) { auto initial = Notify::PeerUpdate(peer); initial.flags = flags; return rpl::single(initial) | then(PeerUpdateViewer(peer, flags)); } rpl::producer PhoneValue( not_null user) { return PeerUpdateValue( user, Notify::PeerUpdate::Flag::UserPhoneChanged) | rpl::map([user](auto&&) { return App::formatPhone(user->phone()); }) | WithEmptyEntities(); } rpl::producer BioValue( not_null user) { return PeerUpdateValue( user, Notify::PeerUpdate::Flag::AboutChanged) | rpl::map([user](auto&&) { return user->about(); }) | WithEmptyEntities(); } rpl::producer PlainUsernameViewer( not_null peer) { return PeerUpdateValue( peer, Notify::PeerUpdate::Flag::UsernameChanged) | rpl::map([peer](auto&&) { return peer->userName(); }); } rpl::producer UsernameValue( not_null user) { return PlainUsernameViewer(user) | rpl::map([](QString &&username) { return username.isEmpty() ? QString() : ('@' + username); }) | WithEmptyEntities(); } rpl::producer AboutValue( not_null peer) { if (auto channel = peer->asChannel()) { return PeerUpdateValue( channel, Notify::PeerUpdate::Flag::AboutChanged) | rpl::map([channel](auto&&) { return channel->about(); }) | WithEmptyEntities(); } return rpl::single(TextWithEntities{}); } rpl::producer LinkValue( not_null peer) { return PlainUsernameViewer(peer) | rpl::map([](QString &&username) { return username.isEmpty() ? QString() : Messenger::Instance().createInternalLink(username); }) | WithEmptyEntities(); } rpl::producer NotificationsEnabledValue( not_null peer) { return PeerUpdateValue( peer, Notify::PeerUpdate::Flag::NotificationsEnabled) | rpl::map([peer](auto&&) { return !peer->isMuted(); }); } rpl::producer IsContactValue( not_null user) { return PeerUpdateValue( user, Notify::PeerUpdate::Flag::UserIsContact) | rpl::map([user](auto&&) { return user->isContact(); }); } rpl::producer CanShareContactValue( not_null user) { return PeerUpdateValue( user, Notify::PeerUpdate::Flag::UserCanShareContact) | rpl::map([user](auto&&) { return user->canShareThisContact(); }); } rpl::producer CanAddContactValue( not_null user) { using namespace rpl::mappers; return rpl::combine( IsContactValue(user), CanShareContactValue(user), !$1 && $2); } rpl::producer MembersCountValue( not_null peer) { if (auto chat = peer->asChat()) { return PeerUpdateValue( peer, Notify::PeerUpdate::Flag::MembersChanged) | rpl::map([chat](auto&&) { return chat->amIn() ? qMax(chat->count, chat->participants.size()) : 0; }); } else if (auto channel = peer->asChannel()) { return PeerUpdateValue( peer, Notify::PeerUpdate::Flag::MembersChanged) | rpl::map([channel](auto &&) { auto canViewCount = channel->canViewMembers() || !channel->isMegagroup(); return canViewCount ? qMax(channel->membersCount(), 1) : 0; }); } Unexpected("User in MembersCountViewer()."); } rpl::producer SharedMediaCountValue( not_null peer, Storage::SharedMediaType type) { auto initial = peer->migrateFrom() ? peer->migrateFrom() : peer; auto migrated = initial->migrateTo(); auto aroundId = 0; auto limit = 0; auto updated = SharedMediaMergedViewer( SharedMediaMergedSlice::Key( peer->id, migrated ? migrated->id : 0, type, aroundId), limit, limit) | rpl::map([](const SharedMediaMergedSlice &slice) { return slice.fullCount(); }) | rpl::filter_optional(); return rpl::single(0) | rpl::then(std::move(updated)); } rpl::producer CommonGroupsCountValue( not_null user) { return PeerUpdateValue( user, Notify::PeerUpdate::Flag::UserCommonChatsChanged) | rpl::map([user](auto&&) { return user->commonChatsCount(); }); } rpl::producer CanAddMemberValue( not_null peer) { if (auto chat = peer->asChat()) { return PeerUpdateValue( chat, Notify::PeerUpdate::Flag::ChatCanEdit) | rpl::map([chat](auto&&) { return chat->canEdit(); }); } else if (auto channel = peer->asChannel()) { return PeerUpdateValue( channel, Notify::PeerUpdate::Flag::ChannelRightsChanged) | rpl::map([channel](auto&&) { return channel->canAddMembers(); }); } return rpl::single(false); } rpl::producer MultiLineTracker::atLeastOneShownValue() const { auto shown = std::vector>(); shown.reserve(_widgets.size()); for (auto &widget : _widgets) { shown.push_back(widget->shownValue()); } return rpl::combine( std::move(shown), [](const std::vector &values) { return base::find(values, true) != values.end(); }); } } // namespace Profile } // namespace Info