From 46b81f4302b81bf7d4bd796b6dd39e3a9fbdf42a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Wed, 22 Apr 2026 17:34:24 +0200 Subject: [PATCH] :tada: Store chosen renderer in user profile --- backend/src/app/rpc/commands/profile.clj | 1 + .../src/app/main/ui/settings/options.cljs | 48 +++++++++++-------- .../src/app/main/ui/workspace/main_menu.cljs | 13 +++-- 3 files changed, 38 insertions(+), 24 deletions(-) diff --git a/backend/src/app/rpc/commands/profile.clj b/backend/src/app/rpc/commands/profile.clj index efe99c4a70..10f21d8080 100644 --- a/backend/src/app/rpc/commands/profile.clj +++ b/backend/src/app/rpc/commands/profile.clj @@ -48,6 +48,7 @@ (def schema:props [:map {:title "ProfileProps"} [:plugins {:optional true} schema:plugin-registry] + [:renderer {:optional true} [::sm/one-of #{:svg :wasm}]] [:mcp-enabled {:optional true} ::sm/boolean] [:newsletter-updates {:optional true} ::sm/boolean] [:newsletter-news {:optional true} ::sm/boolean] diff --git a/frontend/src/app/main/ui/settings/options.cljs b/frontend/src/app/main/ui/settings/options.cljs index 2e4f48d3ba..cd99550bbc 100644 --- a/frontend/src/app/main/ui/settings/options.cljs +++ b/frontend/src/app/main/ui/settings/options.cljs @@ -89,28 +89,36 @@ (st/emit! (rt/nav :settings-feedback))) (mf/defc webgl-settings* - [{:keys [is-render-enabled]}] - [:section {:class (stl/css :webgl-container)} - [:header {:class (stl/css :webgl-header)} - [:> heading* {:class (stl/css :title) :level 2 :typography t/title-large} (tr "dashboard.webgl-switch.title")] - [:> text* {:as "span" :class (stl/css :beta) :typography t/body-small} (tr "dashboard.webgl-switch.beta")]] - [:> text* {:class (stl/css :description) :typography t/body-medium} (tr "dashboard.webgl-switch.description")] - [:form {:class (stl/css :webgl-form)} - [:> heading* {:level 3 :typography t/headline-small} (tr "dashboard.webgl-switch.status")] - [:> switch* {:label (if is-render-enabled (tr "dashboard.webgl-switch.enabled") (tr "dashboard.webgl-switch.disabled")) - :default-checked is-render-enabled}]] - [:> text* {:typography t/body-medium :class (stl/css :feedback)} [:a {:href "#" :on-click go-settings-feedback :class (stl/css :link)} (tr "dashboard.webgl-switch.feedback") [:> icon* {:icon-id "arrow-up-right" :size "s"}]]]]) + [{:keys [renderer]}] + (let [wasm-renderer? (= renderer :wasm) + handle-render-change + (mf/use-fn + (fn [enabled?] + (st/emit! (du/update-profile-props {:renderer (if enabled? :wasm :svg)}))))] + [:section {:class (stl/css :webgl-container)} + [:header {:class (stl/css :webgl-header)} + [:> heading* {:class (stl/css :title) :level 2 :typography t/title-large} (tr "dashboard.webgl-switch.title")] + [:> text* {:as "span" :class (stl/css :beta) :typography t/body-small} (tr "dashboard.webgl-switch.beta")]] + [:> text* {:class (stl/css :description) :typography t/body-medium} (tr "dashboard.webgl-switch.description")] + [:form {:class (stl/css :webgl-form)} + [:> heading* {:level 3 :typography t/headline-small} (tr "dashboard.webgl-switch.status")] + [:> switch* {:label (if wasm-renderer? (tr "dashboard.webgl-switch.enabled") (tr "dashboard.webgl-switch.disabled")) + :default-checked wasm-renderer? + :on-change handle-render-change}]] + [:> text* {:typography t/body-medium :class (stl/css :feedback)} [:a {:href "#" :on-click go-settings-feedback :class (stl/css :link)} (tr "dashboard.webgl-switch.feedback") [:> icon* {:icon-id "arrow-up-right" :size "s"}]]]])) (mf/defc options-page [] - (mf/use-effect - #(dom/set-html-title (tr "title.settings.options"))) + (let [profile (mf/deref refs/profile) + renderer (or (-> profile :props :renderer) :svg)] + (mf/use-effect + #(dom/set-html-title (tr "title.settings.options"))) - [:div {:class (stl/css :dashboard-settings)} - [:* - [:div {:class (stl/css :form-container) :data-testid "settings-form"} - [:h2 (tr "labels.settings")] - [:& options-form {}]] - (when (contains? cf/flags :render-switch) - [:> webgl-settings* {:is-render-enabled true}])]]) + [:div {:class (stl/css :dashboard-settings)} + [:* + [:div {:class (stl/css :form-container) :data-testid "settings-form"} + [:h2 (tr "labels.settings")] + [:& options-form {}]] + (when (contains? cf/flags :render-switch) + [:> webgl-settings* {:renderer renderer}])]])) diff --git a/frontend/src/app/main/ui/workspace/main_menu.cljs b/frontend/src/app/main/ui/workspace/main_menu.cljs index 8e1fb5ea2a..cde655869b 100644 --- a/frontend/src/app/main/ui/workspace/main_menu.cljs +++ b/frontend/src/app/main/ui/workspace/main_menu.cljs @@ -227,7 +227,9 @@ {::mf/private true ::mf/wrap [mf/memo]} [{:keys [layout profile toggle-flag on-close toggle-theme toggle-render]}] - (let [show-nudge-options + (let [renderer (or (-> profile :props :renderer) :svg) + + show-nudge-options (mf/use-fn #(modal/show! {:type :nudge-option}))] @@ -329,7 +331,9 @@ (when (kbd/enter? event) (toggle-render event)))} [:span {:class (stl/css :item-name)} - (tr "workspace.header.menu.enable-webgl")]])])) + (if (= renderer :wasm) + (tr "workspace.header.menu.disable-webgl") + (tr "workspace.header.menu.enable-webgl"))]])])) (mf/defc view-menu* {::mf/private true @@ -901,8 +905,9 @@ (mf/use-fn (fn [event] (dom/stop-propagation event) - (js/console.log "toggle-render") - #_(st/emit! (toggle-render)))) + (let [renderer (or (-> profile :props :renderer) :svg) + next-renderer (if (= renderer :wasm) :svg :wasm)] + (st/emit! (du/update-profile-props {:renderer next-renderer}))))) open-plugins-manager (mf/use-fn