diff --git a/assets/javascripts/discourse/components/ai-bot-header-icon.gjs b/assets/javascripts/discourse/components/ai-bot-header-icon.gjs
new file mode 100644
index 00000000..70f4aeed
--- /dev/null
+++ b/assets/javascripts/discourse/components/ai-bot-header-icon.gjs
@@ -0,0 +1,50 @@
+import Component from "@glimmer/component";
+import { action } from "@ember/object";
+import { service } from "@ember/service";
+import { gt } from "truth-helpers";
+import DButton from "discourse/components/d-button";
+import i18n from "discourse-common/helpers/i18n";
+import DMenu from "float-kit/components/d-menu";
+import { composeAiBotMessage } from "../lib/ai-bot-helper";
+import AiBotHeaderPanel from "./ai-bot-header-panel";
+
+export default class AiBotHeaderIcon extends Component {
+ @service siteSettings;
+ @service composer;
+
+ get bots() {
+ return this.siteSettings.ai_bot_add_to_header
+ ? this.siteSettings.ai_bot_enabled_chat_bots.split("|").filter(Boolean)
+ : [];
+ }
+
+ @action
+ compose() {
+ composeAiBotMessage(this.bots[0], this.composer);
+ }
+
+
+ {{#if (gt this.bots.length 0)}}
+
+ {{#if (gt this.bots.length 1)}}
+
+ <:content as |args|>
+
+
+
+ {{else}}
+
+ {{/if}}
+
+ {{/if}}
+
+}
diff --git a/assets/javascripts/discourse/components/ai-bot-header-panel.hbs b/assets/javascripts/discourse/components/ai-bot-header-panel.hbs
index 8b6dabf0..d67526ae 100644
--- a/assets/javascripts/discourse/components/ai-bot-header-panel.hbs
+++ b/assets/javascripts/discourse/components/ai-bot-header-panel.hbs
@@ -1,18 +1,10 @@
-
+ {{#each this.botNames as |bot|}}
+
+ {{/each}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/widgets/ai-bot-header-panel-wrapper.js b/assets/javascripts/discourse/widgets/ai-bot-header-panel-wrapper.js
deleted file mode 100644
index 653ad501..00000000
--- a/assets/javascripts/discourse/widgets/ai-bot-header-panel-wrapper.js
+++ /dev/null
@@ -1,31 +0,0 @@
-import { action } from "@ember/object";
-import { hbs } from "ember-cli-htmlbars";
-import RenderGlimmer from "discourse/widgets/render-glimmer";
-import Widget from "discourse/widgets/widget";
-
-export default class AiBotHeaderPanelWrapper extends Widget {
- buildAttributes() {
- return { "data-click-outside": true };
- }
-
- html() {
- return [
- new RenderGlimmer(
- this,
- "div.widget-component-connector",
- hbs``,
- { closePanel: this.closePanel }
- ),
- ];
- }
-
- @action
- closePanel() {
- this.sendWidgetAction("hideAiBotPanel");
- }
-
- @action
- clickOutside() {
- this.closePanel();
- }
-}
diff --git a/assets/javascripts/initializers/ai-bot-replies.js b/assets/javascripts/initializers/ai-bot-replies.js
index 9e8c875a..ad962c02 100644
--- a/assets/javascripts/initializers/ai-bot-replies.js
+++ b/assets/javascripts/initializers/ai-bot-replies.js
@@ -3,12 +3,11 @@ import { ajax } from "discourse/lib/ajax";
import { popupAjaxError } from "discourse/lib/ajax-error";
import { withPluginApi } from "discourse/lib/plugin-api";
import { registerWidgetShim } from "discourse/widgets/render-glimmer";
-import { composeAiBotMessage } from "discourse/plugins/discourse-ai/discourse/lib/ai-bot-helper";
import ShareModal from "../discourse/components/modal/share-modal";
import streamText from "../discourse/lib/ai-streamer";
import copyConversation from "../discourse/lib/copy-conversation";
-
const AUTO_COPY_THRESHOLD = 4;
+import AiBotHeaderIcon from "../discourse/components/ai-bot-header-icon";
let enabledChatBotIds = [];
function isGPTBot(user) {
@@ -16,51 +15,7 @@ function isGPTBot(user) {
}
function attachHeaderIcon(api) {
- const settings = api.container.lookup("service:site-settings");
-
- const enabledBots = settings.ai_bot_add_to_header
- ? settings.ai_bot_enabled_chat_bots.split("|").filter(Boolean)
- : [];
- if (enabledBots.length > 0) {
- api.attachWidgetAction("header", "showAiBotPanel", function () {
- this.state.botSelectorVisible = true;
- });
-
- api.attachWidgetAction("header", "hideAiBotPanel", function () {
- this.state.botSelectorVisible = false;
- });
-
- api.decorateWidget("header-icons:before", (helper) => {
- return helper.attach("header-dropdown", {
- title: "discourse_ai.ai_bot.shortcut_title",
- icon: "robot",
- action: "clickStartAiBotChat",
- active: false,
- classNames: ["ai-bot-button"],
- });
- });
-
- if (enabledBots.length === 1) {
- api.attachWidgetAction("header", "clickStartAiBotChat", function () {
- composeAiBotMessage(
- enabledBots[0],
- api.container.lookup("service:composer")
- );
- });
- } else {
- api.attachWidgetAction("header", "clickStartAiBotChat", function () {
- this.sendWidgetAction("showAiBotPanel");
- });
- }
-
- api.addHeaderPanel(
- "ai-bot-header-panel-wrapper",
- "botSelectorVisible",
- function () {
- return {};
- }
- );
- }
+ api.headerIcons.add("ai", AiBotHeaderIcon);
}
function initializeAIBotReplies(api) {
@@ -194,14 +149,11 @@ export default {
name: "discourse-ai-bot-replies",
initialize(container) {
- const settings = container.lookup("service:site-settings");
const user = container.lookup("service:current-user");
if (user?.ai_enabled_chat_bots) {
enabledChatBotIds = user.ai_enabled_chat_bots.map((bot) => bot.id);
- if (settings.ai_bot_add_to_header) {
- withPluginApi("1.6.0", attachHeaderIcon);
- }
+ withPluginApi("1.6.0", attachHeaderIcon);
withPluginApi("1.6.0", initializeAIBotReplies);
withPluginApi("1.6.0", initializePersonaDecorator);
withPluginApi("1.22.0", (api) => initializeShareButton(api, container));
diff --git a/assets/stylesheets/modules/ai-bot/common/bot-replies.scss b/assets/stylesheets/modules/ai-bot/common/bot-replies.scss
index 84f0f3cc..71fbc476 100644
--- a/assets/stylesheets/modules/ai-bot/common/bot-replies.scss
+++ b/assets/stylesheets/modules/ai-bot/common/bot-replies.scss
@@ -80,10 +80,14 @@ article.streaming .cooked {
}
.ai-bot-available-bot-options {
+ padding: 0.5em;
+
.ai-bot-available-bot-content {
color: var(--primary-high);
display: flex;
width: 100%;
+ min-width: 320px;
+ padding: 0.5em;
.d-button-label {
flex: 1;
text-align: left;