From d7efdd90c0cf336cdfee27809243ebe35db4a348 Mon Sep 17 00:00:00 2001
From: Aleksandr Lesnenko <alxnddr@users.noreply.github.com>
Date: Wed, 21 Jun 2023 11:12:56 -0300
Subject: [PATCH] Hide metabot (#31750)

---
 .../scenarios/admin/settings/settings.cy.spec.js     |  2 +-
 e2e/test/scenarios/onboarding/metabot.cy.spec.js     | 12 ++++++++++++
 .../admin/settings/containers/SettingsEditorApp.jsx  |  4 ++--
 frontend/src/metabase/admin/settings/selectors.js    | 11 ++++-------
 frontend/src/metabase/route-guards.jsx               |  5 +++--
 src/metabase/metabot/settings.clj                    |  2 +-
 6 files changed, 23 insertions(+), 13 deletions(-)

diff --git a/e2e/test/scenarios/admin/settings/settings.cy.spec.js b/e2e/test/scenarios/admin/settings/settings.cy.spec.js
index ad260a608f5..4fdcc2ef662 100644
--- a/e2e/test/scenarios/admin/settings/settings.cy.spec.js
+++ b/e2e/test/scenarios/admin/settings/settings.cy.spec.js
@@ -238,7 +238,7 @@ describe("scenarios > admin > settings", () => {
     "should display the order of the settings items consistently between OSS/EE versions (metabase#15441)",
     { tags: "@OSS" },
     () => {
-      const lastItem = isEE ? "Appearance" : "Metabot";
+      const lastItem = isEE ? "Appearance" : "Caching";
 
       cy.visit("/admin/settings/setup");
       cy.get(".AdminList .AdminList-item")
diff --git a/e2e/test/scenarios/onboarding/metabot.cy.spec.js b/e2e/test/scenarios/onboarding/metabot.cy.spec.js
index 662c1d5de2d..c6b616ea98e 100644
--- a/e2e/test/scenarios/onboarding/metabot.cy.spec.js
+++ b/e2e/test/scenarios/onboarding/metabot.cy.spec.js
@@ -8,6 +8,7 @@ import {
   openQuestionActions,
   resetSnowplow,
   restore,
+  sidebar,
   visitModel,
 } from "e2e/support/helpers";
 import { SAMPLE_DB_ID } from "e2e/support/cypress_data";
@@ -64,6 +65,17 @@ describe("scenarios > metabot", () => {
     });
   });
 
+  it("should not show metabot if it is disabled", () => {
+    cy.visit("/admin");
+    sidebar().findByText("Metabot").should("not.exist");
+
+    cy.visit("/metabot/database/1");
+    cy.url().should("eq", `${location.origin}/`);
+
+    cy.visit("/metabot/model/1");
+    cy.url().should("eq", `${location.origin}/`);
+  });
+
   it("should allow to submit prompts based on the database", () => {
     cy.createQuestion(MODEL_DETAILS);
     enableMetabot();
diff --git a/frontend/src/metabase/admin/settings/containers/SettingsEditorApp.jsx b/frontend/src/metabase/admin/settings/containers/SettingsEditorApp.jsx
index 3523200a1e7..8776d345c13 100644
--- a/frontend/src/metabase/admin/settings/containers/SettingsEditorApp.jsx
+++ b/frontend/src/metabase/admin/settings/containers/SettingsEditorApp.jsx
@@ -248,11 +248,11 @@ class SettingsEditorApp extends Component {
     );
 
     return (
-      <div className="MetadataEditor-table-list AdminList flex-no-shrink">
+      <aside className="MetadataEditor-table-list AdminList flex-no-shrink">
         <ul className="AdminList-items pt1">
           <ErrorBoundary>{renderedSections}</ErrorBoundary>
         </ul>
-      </div>
+      </aside>
     );
   }
 
diff --git a/frontend/src/metabase/admin/settings/selectors.js b/frontend/src/metabase/admin/settings/selectors.js
index 30bf8c75955..f801f64c97a 100644
--- a/frontend/src/metabase/admin/settings/selectors.js
+++ b/frontend/src/metabase/admin/settings/selectors.js
@@ -661,13 +661,8 @@ const SECTIONS = updateSectionsWithPlugins({
   metabot: {
     name: t`Metabot`,
     order: 130,
+    getHidden: settings => !settings["is-metabot-enabled"],
     settings: [
-      {
-        key: "is-metabot-enabled",
-        display_name: t`Enable Metabot`,
-        description: t`Metabot is in alpha, and in general you should always examine SQL queries generated by large language models (LLMs) before using their results in critical applications. By using Metabot, you agree to share your prompts and their resultant queries with Metabase to help us improve Metabot’s performance.`,
-        type: "boolean",
-      },
       {
         key: "openai-api-key",
         display_name: t`OpenAI API Key`,
@@ -741,7 +736,9 @@ export const getSections = createSelector(
     const settingsByKey = _.groupBy(settings, "key");
     const sectionsWithAPISettings = {};
     for (const [slug, section] of Object.entries(SECTIONS)) {
-      if (section.adminOnly && !isAdmin) {
+      const isHidden = section.getHidden?.(derivedSettingValues);
+
+      if (isHidden || (section.adminOnly && !isAdmin)) {
         continue;
       }
 
diff --git a/frontend/src/metabase/route-guards.jsx b/frontend/src/metabase/route-guards.jsx
index 8f610b9f305..13911ffd883 100644
--- a/frontend/src/metabase/route-guards.jsx
+++ b/frontend/src/metabase/route-guards.jsx
@@ -2,6 +2,7 @@ import { routerActions } from "react-router-redux";
 import { UserAuthWrapper } from "redux-auth-wrapper";
 import MetabaseSettings from "metabase/lib/settings";
 import { getAdminPaths } from "metabase/admin/app/selectors";
+import { getIsMetabotEnabled } from "metabase/home/selectors";
 
 const MetabaseIsSetup = UserAuthWrapper({
   predicate: authData => authData.hasUserSetup,
@@ -48,9 +49,9 @@ const UserCanAccessSettings = UserAuthWrapper({
 });
 
 export const UserCanAccessMetabot = UserAuthWrapper({
-  predicate: isMetabotEnabled => true, // FIXME [AL]: fix this guard
+  predicate: isMetabotEnabled => isMetabotEnabled,
   failureRedirectPath: "/",
-  authSelector: () => MetabaseSettings.isMetabotEnabled(),
+  authSelector: state => getIsMetabotEnabled(state),
   allowRedirectBack: false,
   wrapperDisplayName: "UserCanAccessMetabot",
   redirectAction: routerActions.replace,
diff --git a/src/metabase/metabot/settings.clj b/src/metabase/metabot/settings.clj
index 212ec4886ba..fb30720bb6f 100644
--- a/src/metabase/metabot/settings.clj
+++ b/src/metabase/metabot/settings.clj
@@ -38,7 +38,7 @@
 (defsetting is-metabot-enabled
   (deferred-tru "Is Metabot enabled?")
   :type :boolean
-  :visibility :authenticated
+  :visibility :public
   :default false)
 
 (defsetting num-metabot-choices
-- 
GitLab