Add proof-of-concept webview-bots attach menu.
This commit is contained in:
parent
273f2f7ce9
commit
426be943a2
|
@ -139,6 +139,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
#include "window/window_slide_animation.h"
|
#include "window/window_slide_animation.h"
|
||||||
#include "window/window_peer_menu.h"
|
#include "window/window_peer_menu.h"
|
||||||
#include "inline_bots/inline_results_widget.h"
|
#include "inline_bots/inline_results_widget.h"
|
||||||
|
#include "inline_bots/bot_attach_web_view.h"
|
||||||
#include "info/profile/info_profile_values.h" // SharedMediaCountValue.
|
#include "info/profile/info_profile_values.h" // SharedMediaCountValue.
|
||||||
#include "chat_helpers/emoji_suggestions_widget.h"
|
#include "chat_helpers/emoji_suggestions_widget.h"
|
||||||
#include "core/crash_reports.h"
|
#include "core/crash_reports.h"
|
||||||
|
@ -478,6 +479,27 @@ HistoryWidget::HistoryWidget(
|
||||||
_botKeyboardHide->hide();
|
_botKeyboardHide->hide();
|
||||||
_botCommandStart->hide();
|
_botCommandStart->hide();
|
||||||
|
|
||||||
|
session().attachWebView().requestBots();
|
||||||
|
session().attachWebView().attachBotsUpdates(
|
||||||
|
) | rpl::start_with_next([=] {
|
||||||
|
const auto list = [=] {
|
||||||
|
return session().attachWebView().attachBots();
|
||||||
|
};
|
||||||
|
if (session().attachWebView().attachBots().empty()) {
|
||||||
|
_attachBotsMenu = nullptr;
|
||||||
|
return;
|
||||||
|
} else if (!_attachBotsMenu) {
|
||||||
|
_attachBotsMenu = InlineBots::MakeAttachBotsMenu(
|
||||||
|
this,
|
||||||
|
controller);
|
||||||
|
_attachBotsMenu->setOrigin(
|
||||||
|
Ui::PanelAnimation::Origin::BottomLeft);
|
||||||
|
if (_history && _history->peer->isUser()) {
|
||||||
|
_attachToggle->installEventFilter(_attachBotsMenu.get());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, lifetime());
|
||||||
|
|
||||||
_botKeyboardShow->addClickHandler([=] { toggleKeyboard(); });
|
_botKeyboardShow->addClickHandler([=] { toggleKeyboard(); });
|
||||||
_botKeyboardHide->addClickHandler([=] { toggleKeyboard(); });
|
_botKeyboardHide->addClickHandler([=] { toggleKeyboard(); });
|
||||||
_botCommandStart->addClickHandler([=] { startBotCommand(); });
|
_botCommandStart->addClickHandler([=] { startBotCommand(); });
|
||||||
|
@ -2329,6 +2351,15 @@ void HistoryWidget::setHistory(History *history) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const auto was = _attachBotsMenu && _history && _history->peer->isUser();
|
||||||
|
const auto now = _attachBotsMenu && history && history->peer->isUser();
|
||||||
|
if (was && !now) {
|
||||||
|
_attachToggle->removeEventFilter(_attachBotsMenu.get());
|
||||||
|
_attachBotsMenu->hideFast();
|
||||||
|
} else if (now && !was) {
|
||||||
|
_attachToggle->installEventFilter(_attachBotsMenu.get());
|
||||||
|
}
|
||||||
|
|
||||||
const auto unloadHeavyViewParts = [](History *history) {
|
const auto unloadHeavyViewParts = [](History *history) {
|
||||||
if (history) {
|
if (history) {
|
||||||
history->owner().unloadHeavyViewParts(
|
history->owner().unloadHeavyViewParts(
|
||||||
|
@ -4681,6 +4712,11 @@ void HistoryWidget::moveFieldControls() {
|
||||||
if (_tabbedPanel) {
|
if (_tabbedPanel) {
|
||||||
_tabbedPanel->moveBottomRight(buttonsBottom, width());
|
_tabbedPanel->moveBottomRight(buttonsBottom, width());
|
||||||
}
|
}
|
||||||
|
if (_attachBotsMenu) {
|
||||||
|
_attachBotsMenu->moveToLeft(
|
||||||
|
0,
|
||||||
|
buttonsBottom - _attachBotsMenu->height());
|
||||||
|
}
|
||||||
|
|
||||||
const auto fullWidthButtonRect = myrtlrect(
|
const auto fullWidthButtonRect = myrtlrect(
|
||||||
0,
|
0,
|
||||||
|
|
|
@ -51,6 +51,7 @@ class ItemBase;
|
||||||
class Widget;
|
class Widget;
|
||||||
} // namespace Layout
|
} // namespace Layout
|
||||||
struct ResultSelected;
|
struct ResultSelected;
|
||||||
|
class AttachBotsList;
|
||||||
} // namespace InlineBots
|
} // namespace InlineBots
|
||||||
|
|
||||||
namespace Support {
|
namespace Support {
|
||||||
|
@ -765,6 +766,7 @@ private:
|
||||||
|
|
||||||
object_ptr<InlineBots::Layout::Widget> _inlineResults = { nullptr };
|
object_ptr<InlineBots::Layout::Widget> _inlineResults = { nullptr };
|
||||||
std::unique_ptr<TabbedPanel> _tabbedPanel;
|
std::unique_ptr<TabbedPanel> _tabbedPanel;
|
||||||
|
std::unique_ptr<Ui::DropdownMenu> _attachBotsMenu;
|
||||||
|
|
||||||
DragArea::Areas _attachDragAreas;
|
DragArea::Areas _attachDragAreas;
|
||||||
|
|
||||||
|
|
|
@ -14,15 +14,19 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
#include "storage/storage_domain.h"
|
#include "storage/storage_domain.h"
|
||||||
#include "info/profile/info_profile_values.h"
|
#include "info/profile/info_profile_values.h"
|
||||||
#include "ui/boxes/confirm_box.h"
|
#include "ui/boxes/confirm_box.h"
|
||||||
|
#include "ui/widgets/dropdown_menu.h"
|
||||||
#include "ui/toasts/common_toasts.h"
|
#include "ui/toasts/common_toasts.h"
|
||||||
#include "ui/chat/attach/attach_bot_webview.h"
|
#include "ui/chat/attach/attach_bot_webview.h"
|
||||||
#include "window/themes/window_theme.h"
|
#include "window/themes/window_theme.h"
|
||||||
#include "window/window_controller.h"
|
#include "window/window_controller.h"
|
||||||
|
#include "window/window_session_controller.h"
|
||||||
#include "core/application.h"
|
#include "core/application.h"
|
||||||
|
#include "history/history.h"
|
||||||
#include "lang/lang_keys.h"
|
#include "lang/lang_keys.h"
|
||||||
#include "base/random.h"
|
#include "base/random.h"
|
||||||
#include "base/timer_rpl.h"
|
#include "base/timer_rpl.h"
|
||||||
#include "apiwrap.h"
|
#include "apiwrap.h"
|
||||||
|
#include "styles/style_menu_icons.h"
|
||||||
|
|
||||||
namespace InlineBots {
|
namespace InlineBots {
|
||||||
namespace {
|
namespace {
|
||||||
|
@ -137,6 +141,38 @@ void AttachWebView::cancel() {
|
||||||
_botUsername = QString();
|
_botUsername = QString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AttachWebView::requestBots() {
|
||||||
|
if (_botsRequestId) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_botsRequestId = _session->api().request(MTPmessages_GetAttachMenuBots(
|
||||||
|
MTP_long(_botsHash)
|
||||||
|
)).done([=](const MTPAttachMenuBots &result) {
|
||||||
|
_botsRequestId = 0;
|
||||||
|
result.match([&](const MTPDattachMenuBotsNotModified &) {
|
||||||
|
}, [&](const MTPDattachMenuBots &data) {
|
||||||
|
_session->data().processUsers(data.vusers());
|
||||||
|
_botsHash = data.vhash().v;
|
||||||
|
_attachBots.clear();
|
||||||
|
_attachBots.reserve(data.vbots().v.size());
|
||||||
|
for (const auto &bot : data.vbots().v) {
|
||||||
|
bot.match([&](const MTPDattachMenuBot &data) {
|
||||||
|
if (data.is_inactive()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_attachBots.push_back({
|
||||||
|
.user = _session->data().user(data.vbot_id()),
|
||||||
|
.name = qs(data.vattach_menu_name()),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
_attachBotsUpdates.fire({});
|
||||||
|
});
|
||||||
|
}).fail([=] {
|
||||||
|
_botsRequestId = 0;
|
||||||
|
}).send();
|
||||||
|
}
|
||||||
|
|
||||||
void AttachWebView::resolve() {
|
void AttachWebView::resolve() {
|
||||||
if (!_bot) {
|
if (!_bot) {
|
||||||
requestByUsername();
|
requestByUsername();
|
||||||
|
@ -318,10 +354,37 @@ void AttachWebView::toggleInMenu(bool enabled, Fn<void()> callback) {
|
||||||
MTP_bool(enabled)
|
MTP_bool(enabled)
|
||||||
)).done([=] {
|
)).done([=] {
|
||||||
_requestId = 0;
|
_requestId = 0;
|
||||||
|
requestBots();
|
||||||
callback();
|
callback();
|
||||||
}).fail([=] {
|
}).fail([=] {
|
||||||
cancel();
|
cancel();
|
||||||
}).send();
|
}).send();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<Ui::DropdownMenu> MakeAttachBotsMenu(
|
||||||
|
not_null<QWidget*> parent,
|
||||||
|
not_null<Window::SessionController*> controller) {
|
||||||
|
auto result = std::make_unique<Ui::DropdownMenu>(
|
||||||
|
parent,
|
||||||
|
st::dropdownMenuWithIcons);
|
||||||
|
const auto bots = &controller->session().attachWebView();
|
||||||
|
const auto raw = result.get();
|
||||||
|
const auto refresh = [=] {
|
||||||
|
raw->clearActions();
|
||||||
|
for (const auto &bot : bots->attachBots()) {
|
||||||
|
raw->addAction(bot.name, [=, bot = bot.user]{
|
||||||
|
const auto active = controller->activeChatCurrent();
|
||||||
|
if (const auto history = active.history()) {
|
||||||
|
bots->request(history->peer, bot);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
refresh();
|
||||||
|
bots->attachBotsUpdates(
|
||||||
|
) | rpl::start_with_next(refresh, raw->lifetime());
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace InlineBots
|
} // namespace InlineBots
|
||||||
|
|
|
@ -12,6 +12,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui {
|
||||||
class GenericBox;
|
class GenericBox;
|
||||||
|
class DropdownMenu;
|
||||||
} // namespace Ui
|
} // namespace Ui
|
||||||
|
|
||||||
namespace Ui::BotWebView {
|
namespace Ui::BotWebView {
|
||||||
|
@ -22,8 +23,17 @@ namespace Main {
|
||||||
class Session;
|
class Session;
|
||||||
} // namespace Main
|
} // namespace Main
|
||||||
|
|
||||||
|
namespace Window {
|
||||||
|
class SessionController;
|
||||||
|
} // namespace Window
|
||||||
|
|
||||||
namespace InlineBots {
|
namespace InlineBots {
|
||||||
|
|
||||||
|
struct AttachWebViewBot {
|
||||||
|
not_null<UserData*> user;
|
||||||
|
QString name;
|
||||||
|
};
|
||||||
|
|
||||||
class AttachWebView final : public base::has_weak_ptr {
|
class AttachWebView final : public base::has_weak_ptr {
|
||||||
public:
|
public:
|
||||||
explicit AttachWebView(not_null<Main::Session*> session);
|
explicit AttachWebView(not_null<Main::Session*> session);
|
||||||
|
@ -44,6 +54,14 @@ public:
|
||||||
|
|
||||||
void cancel();
|
void cancel();
|
||||||
|
|
||||||
|
void requestBots();
|
||||||
|
[[nodiscard]] const std::vector<AttachWebViewBot> &attachBots() const {
|
||||||
|
return _attachBots;
|
||||||
|
}
|
||||||
|
[[nodiscard]] rpl::producer<> attachBotsUpdates() const {
|
||||||
|
return _attachBotsUpdates.events();
|
||||||
|
}
|
||||||
|
|
||||||
static void ClearAll();
|
static void ClearAll();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -74,8 +92,18 @@ private:
|
||||||
mtpRequestId _requestId = 0;
|
mtpRequestId _requestId = 0;
|
||||||
mtpRequestId _prolongId = 0;
|
mtpRequestId _prolongId = 0;
|
||||||
|
|
||||||
|
uint64 _botsHash = 0;
|
||||||
|
mtpRequestId _botsRequestId = 0;
|
||||||
|
|
||||||
|
std::vector<AttachWebViewBot> _attachBots;
|
||||||
|
rpl::event_stream<> _attachBotsUpdates;
|
||||||
|
|
||||||
std::unique_ptr<Ui::BotWebView::Panel> _panel;
|
std::unique_ptr<Ui::BotWebView::Panel> _panel;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
[[nodiscard]] std::unique_ptr<Ui::DropdownMenu> MakeAttachBotsMenu(
|
||||||
|
not_null<QWidget*> parent,
|
||||||
|
not_null<Window::SessionController*> controller);
|
||||||
|
|
||||||
} // namespace InlineBots
|
} // namespace InlineBots
|
||||||
|
|
Loading…
Reference in New Issue