diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp index 4dd9f9eff..2af61065b 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp @@ -161,6 +161,7 @@ private: object_ptr createPhotoEdit(); object_ptr createDescriptionEdit(); void refreshHistoryVisibility(bool instant); + void showEditPeerTypeBox(std::optional error = std::nullopt); void fillPrivacyTypeButton(); void fillInviteLinkButton(); void fillSignaturesButton(); @@ -217,6 +218,8 @@ private: std::deque> _saveStagesQueue; Saving _savingData; + const rpl::event_stream _updadePrivacyType; + rpl::lifetime _lifetime; }; @@ -395,10 +398,26 @@ void Controller::refreshHistoryVisibility(bool instant = false) { return; } _controls.historyVisibilityWrap->toggle( - _privacySavedValue == Privacy::Private, + _privacySavedValue != Privacy::Public, instant ? anim::type::instant : anim::type::normal); }; +void Controller::showEditPeerTypeBox(std::optional error) { + const auto boxCallback = [=](Privacy checked, QString publicLink) { + _updadePrivacyType.fire(std::move(checked)); + _privacySavedValue = checked; + _usernameSavedValue = publicLink; + refreshHistoryVisibility(); + }; + Ui::show(Box( + _peer, + boxCallback, + _privacySavedValue, + _usernameSavedValue, + error + ), LayerOption::KeepOther); +} + void Controller::fillPrivacyTypeButton() { Expects(_controls.buttonsLayout != nullptr); // Create Privacy Button. @@ -407,21 +426,8 @@ void Controller::fillPrivacyTypeButton() { ? Privacy::Public : Privacy::Private; - const auto updateType = std::make_shared>(); - - const auto boxCallback = [=](Privacy checked, QString publicLink) { - updateType->fire(std::move(checked)); - _privacySavedValue = checked; - _usernameSavedValue = publicLink; - refreshHistoryVisibility(); - }; const auto buttonCallback = [=] { - Ui::show(Box( - _peer, - boxCallback, - _privacySavedValue, - _usernameSavedValue - ), LayerOption::KeepOther); + showEditPeerTypeBox(); }; AddButtonWithText( @@ -430,7 +436,7 @@ void Controller::fillPrivacyTypeButton() { ? lng_manage_peer_group_type : lng_manage_peer_channel_type)), - updateType->events( + _updadePrivacyType.events( ) | rpl::map([](Privacy flag) { return lang(Privacy::Public == flag ? lng_manage_public_peer_title @@ -438,7 +444,7 @@ void Controller::fillPrivacyTypeButton() { }), buttonCallback); - updateType->fire(std::move(_privacySavedValue.value())); + _updadePrivacyType.fire(std::move(_privacySavedValue.value())); } void Controller::fillInviteLinkButton() { @@ -915,12 +921,12 @@ void Controller::saveUsername() { return lng_create_channel_link_invalid; } else if (type == qstr("USERNAME_OCCUPIED") || type == qstr("USERNAMES_UNAVAILABLE")) { - return lng_create_channel_link_invalid; + return lng_create_channel_link_occupied; } return lng_create_channel_link_invalid; }(); - // Probably never happend. - // showUsernameError(Lang::Viewer(errorKey)); + // Very rare case. + showEditPeerTypeBox(errorKey); cancelSave(); }).send(); } diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_type_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_type_box.cpp index d53a62179..8cf9dc2ac 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_type_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_type_box.cpp @@ -52,7 +52,8 @@ public: not_null container, not_null peer, std::optional privacySavedValue, - std::optional usernameSavedValue); + std::optional usernameSavedValue, + std::optional usernameError); void createContent(); QString getUsernameInput(); @@ -139,6 +140,7 @@ private: not_null _peer; std::optional _privacySavedValue = std::nullopt; std::optional _usernameSavedValue = std::nullopt; + std::optional _usernameError = std::nullopt; bool _isGroup = false; bool _isInviteLink = false; @@ -158,10 +160,12 @@ Controller::Controller( not_null container, not_null peer, std::optional privacySavedValue, - std::optional usernameSavedValue) + std::optional usernameSavedValue, + std::optional usernameError) : _peer(peer) , _privacySavedValue(privacySavedValue) , _usernameSavedValue(usernameSavedValue) +, _usernameError(usernameError) , _isGroup(_peer->isChat() || _peer->isMegagroup()) , _isInviteLink(!_privacySavedValue.has_value() && !_usernameSavedValue.has_value()) , _isAllowSave(!_usernameSavedValue.value_or(QString()).isEmpty()) @@ -204,6 +208,13 @@ void Controller::createContent() { if (_controls.privacy->value() == Privacy::Private) { checkUsernameAvailability(); } + + if (_usernameError.has_value()) { + showUsernameError(Lang::Viewer(_usernameError.value())); + // Not focused actually. + _controls.usernameInput->setDisplayFocused(true); + setFocusUsername(); + } } @@ -508,6 +519,7 @@ void Controller::usernameChanged() { } void Controller::showUsernameError(rpl::producer &&error) { + _isAllowSave = false; showUsernameResult(std::move(error), &st::editPeerUsernameError); } @@ -720,11 +732,13 @@ EditPeerTypeBox::EditPeerTypeBox( not_null peer, FnMut savedCallback, std::optional privacySaved, - std::optional usernameSaved) + std::optional usernameSaved, + std::optional usernameError) : _peer(peer) , _savedCallback(std::move(savedCallback)) , _privacySavedValue(privacySaved) -, _usernameSavedValue(usernameSaved) { +, _usernameSavedValue(usernameSaved) +, _usernameError(usernameError) { } void EditPeerTypeBox::prepare() { @@ -737,7 +751,8 @@ void EditPeerTypeBox::prepare() { content, _peer, _privacySavedValue, - _usernameSavedValue); + _usernameSavedValue, + _usernameError); _focusRequests.events( ) | rpl::start_with_next( [=] { controller->setFocusUsername(); }, diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_type_box.h b/Telegram/SourceFiles/boxes/peers/edit_peer_type_box.h index c3ff28d4f..38dad0075 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_type_box.h +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_type_box.h @@ -10,6 +10,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "boxes/abstract_box.h" #include "base/timer.h" +enum LangKey : int; + namespace style { struct InfoProfileCountButton; } // namespace style @@ -43,7 +45,8 @@ public: not_null p, FnMut savedCallback, std::optional privacySaved = std::nullopt, - std::optional usernameSaved = std::nullopt); + std::optional usernameSaved = std::nullopt, + std::optional usernameError = std::nullopt); protected: void prepare() override; @@ -56,6 +59,7 @@ private: std::optional _privacySavedValue = std::nullopt; std::optional _usernameSavedValue = std::nullopt; + std::optional _usernameError = std::nullopt; rpl::event_stream<> _focusRequests;