diff --git a/frontend/src/app/main/refs.cljs b/frontend/src/app/main/refs.cljs index 30c431ac86..9e1c13cd58 100644 --- a/frontend/src/app/main/refs.cljs +++ b/frontend/src/app/main/refs.cljs @@ -648,3 +648,9 @@ (def progress (l/derived :progress st/state)) + +(def access-tokens + (l/derived :access-tokens st/state)) + +(def access-token-created + (l/derived :access-token-created st/state)) diff --git a/frontend/src/app/main/ui/settings/integrations.cljs b/frontend/src/app/main/ui/settings/integrations.cljs index 780f9918e3..ff4b39049e 100644 --- a/frontend/src/app/main/ui/settings/integrations.cljs +++ b/frontend/src/app/main/ui/settings/integrations.cljs @@ -34,15 +34,8 @@ [app.util.dom :as dom] [app.util.forms :as fm] [app.util.i18n :as i18n :refer [tr]] - [okulary.core :as l] [rumext.v2 :as mf])) -(def tokens-ref - (l/derived :access-tokens st/state)) - -(def token-created-ref - (l/derived :access-token-created st/state)) - (def notification-timeout 7000) (def ^:private schema:form-access-token @@ -78,7 +71,7 @@ (mf/defc token-created* {::mf/private true} [{:keys [title mcp-key?]}] - (let [token-created (mf/deref token-created-ref) + (let [token-created (mf/deref refs/access-token-created) on-copy-to-clipboard (mf/use-fn @@ -310,7 +303,7 @@ [] (let [created? (mf/use-state false) - tokens (mf/deref tokens-ref) + tokens (mf/deref refs/access-tokens) mcp-key (some #(when (= (:type %) "mcp") %) tokens) mcp-key-id (:id mcp-key) @@ -413,7 +406,7 @@ (mf/defc mcp-server-section* {::mf/private true} [] - (let [tokens (mf/deref tokens-ref) + (let [tokens (mf/deref refs/access-tokens) profile (mf/deref refs/profile) mcp-key (some #(when (= (:type %) "mcp") %) tokens) @@ -422,6 +415,8 @@ expires-at (:expires-at mcp-key) expired? (and (some? expires-at) (> (ct/now) expires-at)) + show-enabled? (and mcp-enabled? (false? expired?)) + tooltip-id (mf/use-id) @@ -511,14 +506,17 @@ (tr "integrations.mcp-server.status.expired.1")]]]) [:div {:class (stl/css :mcp-server-switch)} - [:> switch* {:label (if mcp-enabled? + [:> switch* {:label (if show-enabled? (tr "integrations.mcp-server.status.enabled") (tr "integrations.mcp-server.status.disabled")) - :default-checked mcp-enabled? + :default-checked show-enabled? :on-change handle-mcp-change}] (when (and (false? mcp-enabled?) (nil? mcp-key)) [:div {:class (stl/css :mcp-server-switch-cover) - :on-click handle-generate-mcp-key}])]]] + :on-click handle-generate-mcp-key}]) + (when (true? expired?) + [:div {:class (stl/css :mcp-server-switch-cover) + :on-click handle-regenerate-mcp-key}])]]] (when (some? mcp-key) [:div {:class (stl/css :mcp-server-key)} @@ -567,7 +565,7 @@ (mf/defc access-tokens-section* {::mf/private true} [] - (let [tokens (mf/deref tokens-ref) + (let [tokens (mf/deref refs/access-tokens) handle-click (mf/use-fn diff --git a/frontend/src/app/main/ui/workspace/main_menu.cljs b/frontend/src/app/main/ui/workspace/main_menu.cljs index 4d16c79646..674a01549d 100644 --- a/frontend/src/app/main/ui/workspace/main_menu.cljs +++ b/frontend/src/app/main/ui/workspace/main_menu.cljs @@ -43,13 +43,9 @@ [app.util.i18n :as i18n :refer [tr]] [app.util.keyboard :as kbd] [beicon.v2.core :as rx] - [okulary.core :as l] [potok.v2.core :as ptk] [rumext.v2 :as mf])) -(def tokens-ref - (l/derived :access-tokens st/state)) - (mf/defc shortcuts* {::mf/private true} [{:keys [id]}] @@ -749,14 +745,22 @@ (mf/defc mcp-menu* {::mf/private true} [{:keys [on-close]}] - (let [plugins? (features/active-feature? @st/state "plugins/runtime") - - profile (mf/deref refs/profile) - mcp (mf/deref refs/mcp) + (let [plugins? (features/active-feature? @st/state "plugins/runtime") + + profile (mf/deref refs/profile) + mcp (mf/deref refs/mcp) + tokens (mf/deref refs/access-tokens) + + expired? (some->> tokens + (some #(when (= (:type %) "mcp") %)) + :expires-at + (> (ct/now))) mcp-enabled? (true? (-> profile :props :mcp-enabled)) mcp-connected? (= "connected" (get mcp :connection-status)) + show-enabled? (and mcp-enabled? (false? expired?)) + on-nav-to-integrations (mf/use-fn (fn [] @@ -794,7 +798,7 @@ :pos-6 plugins?) :on-close on-close} - (when mcp-enabled? + (when show-enabled? [:> dropdown-menu-item* {:id "mcp-menu-toggle-mcp-plugin" :class (stl/css :base-menu-item :submenu-item) :on-click on-toggle-mcp-plugin @@ -809,7 +813,7 @@ :on-click on-nav-to-integrations :on-key-down on-nav-to-integrations-key-down} [:span {:class (stl/css :item-name)} - (if mcp-enabled? + (if show-enabled? (tr "workspace.header.menu.mcp.server.status.enabled") (tr "workspace.header.menu.mcp.server.status.disabled"))]]])) @@ -983,7 +987,7 @@ :class (stl/css :item-arrow)}]]) (when (contains? cf/flags :mcp) - (let [tokens (mf/deref tokens-ref) + (let [tokens (mf/deref refs/access-tokens) expired? (some->> tokens (some #(when (= (:type %) "mcp") %)) :expires-at