settings_privacy_controllers.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. /*
  2. This file is part of Telegram Desktop,
  3. the official desktop application for the Telegram messaging service.
  4. For license and copyright information please follow this link:
  5. https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
  6. */
  7. #pragma once
  8. #include "boxes/peer_list_box.h"
  9. #include "boxes/edit_privacy_box.h"
  10. #include "history/view/history_view_element.h"
  11. #include "api/api_blocked_peers.h"
  12. namespace Window {
  13. class SessionController;
  14. } // namespace Window
  15. namespace Ui {
  16. class ChatStyle;
  17. namespace Toast {
  18. class Instance;
  19. } // namespace Toast
  20. } // namespace Ui
  21. namespace Settings {
  22. class BlockedBoxController final : public PeerListController {
  23. public:
  24. explicit BlockedBoxController(
  25. not_null<Window::SessionController*> window);
  26. ::Main::Session &session() const override;
  27. void prepare() override;
  28. void rowClicked(not_null<PeerListRow*> row) override;
  29. void rowRightActionClicked(not_null<PeerListRow*> row) override;
  30. void loadMoreRows() override;
  31. [[nodiscard]] rpl::producer<int> rowsCountChanges() const;
  32. static void BlockNewPeer(not_null<Window::SessionController*> window);
  33. private:
  34. void applySlice(const Api::BlockedPeers::Slice &slice);
  35. void handleBlockedEvent(not_null<PeerData*> peer);
  36. bool appendRow(not_null<PeerData*> peer);
  37. bool prependRow(not_null<PeerData*> peer);
  38. std::unique_ptr<PeerListRow> createRow(not_null<PeerData*> peer) const;
  39. const not_null<Window::SessionController*> _window;
  40. int _offset = 0;
  41. bool _allLoaded = false;
  42. base::has_weak_ptr _guard;
  43. rpl::event_stream<int> _rowsCountChanges;
  44. };
  45. class PhoneNumberPrivacyController final : public EditPrivacyController {
  46. public:
  47. using Option = EditPrivacyBox::Option;
  48. using Exception = EditPrivacyBox::Exception;
  49. explicit PhoneNumberPrivacyController(
  50. not_null<Window::SessionController*> controller);
  51. Key key() const override;
  52. rpl::producer<QString> title() const override;
  53. rpl::producer<QString> optionsTitleKey() const override;
  54. rpl::producer<TextWithEntities> warning() const override;
  55. void prepareWarningLabel(not_null<Ui::FlatLabel*> warning) const override;
  56. rpl::producer<QString> exceptionButtonTextKey(
  57. Exception exception) const override;
  58. rpl::producer<QString> exceptionBoxTitle(
  59. Exception exception) const override;
  60. rpl::producer<QString> exceptionsDescription() const override;
  61. object_ptr<Ui::RpWidget> setupMiddleWidget(
  62. not_null<Window::SessionController*> controller,
  63. not_null<QWidget*> parent,
  64. rpl::producer<Option> optionValue) override;
  65. void saveAdditional() override;
  66. private:
  67. const not_null<Window::SessionController*> _controller;
  68. rpl::variable<Option> _phoneNumberOption = { Option::Contacts };
  69. rpl::variable<Option> _addedByPhone = { Option::Everyone };
  70. Fn<void()> _saveAdditional;
  71. };
  72. class LastSeenPrivacyController final : public EditPrivacyController {
  73. public:
  74. using Option = EditPrivacyBox::Option;
  75. using Exception = EditPrivacyBox::Exception;
  76. explicit LastSeenPrivacyController(not_null<::Main::Session*> session);
  77. Key key() const override;
  78. rpl::producer<QString> title() const override;
  79. rpl::producer<QString> optionsTitleKey() const override;
  80. rpl::producer<TextWithEntities> warning() const override;
  81. rpl::producer<QString> exceptionButtonTextKey(
  82. Exception exception) const override;
  83. rpl::producer<QString> exceptionBoxTitle(
  84. Exception exception) const override;
  85. rpl::producer<QString> exceptionsDescription() const override;
  86. void handleExceptionsChange(
  87. Exception exception,
  88. rpl::producer<int> value) override;
  89. object_ptr<Ui::RpWidget> setupBelowWidget(
  90. not_null<Window::SessionController*> controller,
  91. not_null<QWidget*> parent,
  92. rpl::producer<Option> option) override;
  93. void confirmSave(
  94. bool someAreDisallowed,
  95. Fn<void()> saveCallback) override;
  96. void saveAdditional() override;
  97. private:
  98. const not_null<::Main::Session*> _session;
  99. rpl::variable<Option> _option;
  100. rpl::variable<int> _exceptionsNever;
  101. bool _hideReadTime = false;
  102. };
  103. class GroupsInvitePrivacyController final : public EditPrivacyController {
  104. public:
  105. using Option = EditPrivacyBox::Option;
  106. using Exception = EditPrivacyBox::Exception;
  107. Key key() const override;
  108. rpl::producer<QString> title() const override;
  109. rpl::producer<QString> optionsTitleKey() const override;
  110. rpl::producer<QString> exceptionButtonTextKey(
  111. Exception exception) const override;
  112. rpl::producer<QString> exceptionBoxTitle(
  113. Exception exception) const override;
  114. rpl::producer<QString> exceptionsDescription() const override;
  115. bool allowPremiumsToggle(Exception exception) const override;
  116. };
  117. class CallsPrivacyController final : public EditPrivacyController {
  118. public:
  119. using Option = EditPrivacyBox::Option;
  120. using Exception = EditPrivacyBox::Exception;
  121. Key key() const override;
  122. rpl::producer<QString> title() const override;
  123. rpl::producer<QString> optionsTitleKey() const override;
  124. rpl::producer<QString> exceptionButtonTextKey(
  125. Exception exception) const override;
  126. rpl::producer<QString> exceptionBoxTitle(
  127. Exception exception) const override;
  128. rpl::producer<QString> exceptionsDescription() const override;
  129. object_ptr<Ui::RpWidget> setupBelowWidget(
  130. not_null<Window::SessionController*> controller,
  131. not_null<QWidget*> parent,
  132. rpl::producer<Option> option) override;
  133. };
  134. class CallsPeer2PeerPrivacyController final : public EditPrivacyController {
  135. public:
  136. using Option = EditPrivacyBox::Option;
  137. using Exception = EditPrivacyBox::Exception;
  138. Key key() const override;
  139. rpl::producer<QString> title() const override;
  140. rpl::producer<QString> optionsTitleKey() const override;
  141. QString optionLabel(EditPrivacyBox::Option option) const override;
  142. rpl::producer<TextWithEntities> warning() const override;
  143. rpl::producer<QString> exceptionButtonTextKey(
  144. Exception exception) const override;
  145. rpl::producer<QString> exceptionBoxTitle(
  146. Exception exception) const override;
  147. rpl::producer<QString> exceptionsDescription() const override;
  148. };
  149. class ForwardsPrivacyController final
  150. : public EditPrivacyController
  151. , private HistoryView::SimpleElementDelegate {
  152. public:
  153. using Option = EditPrivacyBox::Option;
  154. using Exception = EditPrivacyBox::Exception;
  155. explicit ForwardsPrivacyController(
  156. not_null<Window::SessionController*> controller);
  157. Key key() const override;
  158. rpl::producer<QString> title() const override;
  159. rpl::producer<QString> optionsTitleKey() const override;
  160. rpl::producer<TextWithEntities> warning() const override;
  161. rpl::producer<QString> exceptionButtonTextKey(
  162. Exception exception) const override;
  163. rpl::producer<QString> exceptionBoxTitle(
  164. Exception exception) const override;
  165. rpl::producer<QString> exceptionsDescription() const override;
  166. object_ptr<Ui::RpWidget> setupAboveWidget(
  167. not_null<Window::SessionController*> controller,
  168. not_null<QWidget*> parent,
  169. rpl::producer<Option> optionValue,
  170. not_null<QWidget*> outerContainer) override;
  171. private:
  172. using Element = HistoryView::Element;
  173. not_null<HistoryView::ElementDelegate*> delegate();
  174. HistoryView::Context elementContext() override;
  175. const not_null<Window::SessionController*> _controller;
  176. const std::unique_ptr<Ui::ChatStyle> _chatStyle;
  177. };
  178. class ProfilePhotoPrivacyController final : public EditPrivacyController {
  179. public:
  180. using Option = EditPrivacyBox::Option;
  181. using Exception = EditPrivacyBox::Exception;
  182. Key key() const override;
  183. rpl::producer<QString> title() const override;
  184. rpl::producer<QString> optionsTitleKey() const override;
  185. rpl::producer<QString> exceptionButtonTextKey(
  186. Exception exception) const override;
  187. rpl::producer<QString> exceptionBoxTitle(
  188. Exception exception) const override;
  189. rpl::producer<QString> exceptionsDescription() const override;
  190. void handleExceptionsChange(
  191. Exception exception,
  192. rpl::producer<int> value) override;
  193. object_ptr<Ui::RpWidget> setupAboveWidget(
  194. not_null<Window::SessionController*> controller,
  195. not_null<QWidget*> parent,
  196. rpl::producer<Option> optionValue,
  197. not_null<QWidget*> outerContainer) override;
  198. object_ptr<Ui::RpWidget> setupMiddleWidget(
  199. not_null<Window::SessionController*> controller,
  200. not_null<QWidget*> parent,
  201. rpl::producer<Option> optionValue) override;
  202. void saveAdditional() override;
  203. private:
  204. Fn<void()> _saveAdditional;
  205. rpl::variable<Option> _option;
  206. rpl::variable<int> _exceptionsNever;
  207. };
  208. class VoicesPrivacyController final : public EditPrivacyController {
  209. public:
  210. using Option = EditPrivacyBox::Option;
  211. using Exception = EditPrivacyBox::Exception;
  212. explicit VoicesPrivacyController(not_null<::Main::Session*> session);
  213. Key key() const override;
  214. rpl::producer<QString> title() const override;
  215. rpl::producer<QString> optionsTitleKey() const override;
  216. rpl::producer<QString> exceptionButtonTextKey(
  217. Exception exception) const override;
  218. rpl::producer<QString> exceptionBoxTitle(
  219. Exception exception) const override;
  220. rpl::producer<QString> exceptionsDescription() const override;
  221. object_ptr<Ui::RpWidget> setupBelowWidget(
  222. not_null<Window::SessionController*> controller,
  223. not_null<QWidget*> parent,
  224. rpl::producer<Option> option) override;
  225. Fn<void()> premiumClickedCallback(
  226. Option option,
  227. not_null<Window::SessionController*> controller) override;
  228. private:
  229. base::weak_ptr<Ui::Toast::Instance> _toastInstance;
  230. rpl::lifetime _lifetime;
  231. };
  232. class AboutPrivacyController final : public EditPrivacyController {
  233. public:
  234. using Option = EditPrivacyBox::Option;
  235. using Exception = EditPrivacyBox::Exception;
  236. Key key() const override;
  237. rpl::producer<QString> title() const override;
  238. rpl::producer<QString> optionsTitleKey() const override;
  239. rpl::producer<QString> exceptionButtonTextKey(
  240. Exception exception) const override;
  241. rpl::producer<QString> exceptionBoxTitle(
  242. Exception exception) const override;
  243. rpl::producer<QString> exceptionsDescription() const override;
  244. };
  245. class BirthdayPrivacyController final : public EditPrivacyController {
  246. public:
  247. using Option = EditPrivacyBox::Option;
  248. using Exception = EditPrivacyBox::Exception;
  249. Key key() const override;
  250. rpl::producer<QString> title() const override;
  251. rpl::producer<QString> optionsTitleKey() const override;
  252. rpl::producer<QString> exceptionButtonTextKey(
  253. Exception exception) const override;
  254. rpl::producer<QString> exceptionBoxTitle(
  255. Exception exception) const override;
  256. rpl::producer<QString> exceptionsDescription() const override;
  257. object_ptr<Ui::RpWidget> setupAboveWidget(
  258. not_null<Window::SessionController*> controller,
  259. not_null<QWidget*> parent,
  260. rpl::producer<Option> optionValue,
  261. not_null<QWidget*> outerContainer) override;
  262. };
  263. class GiftsAutoSavePrivacyController final : public EditPrivacyController {
  264. public:
  265. using Option = EditPrivacyBox::Option;
  266. using Exception = EditPrivacyBox::Exception;
  267. Key key() const override;
  268. rpl::producer<QString> title() const override;
  269. rpl::producer<QString> optionsTitleKey() const override;
  270. rpl::producer<QString> exceptionButtonTextKey(
  271. Exception exception) const override;
  272. rpl::producer<QString> exceptionBoxTitle(
  273. Exception exception) const override;
  274. rpl::producer<QString> exceptionsDescription() const override;
  275. bool allowMiniAppsToggle(Exception exception) const override;
  276. };
  277. } // namespace Settings