diff --git a/CHANGES.md b/CHANGES.md index d43da1fdb7..1b293aed7e 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -83,6 +83,7 @@ is a number of cores) - Fix problem with onboarding to a team [Taiga #10143](https://tree.taiga.io/project/penpot/issue/10143) - Fix problem with grid layout crashing [Taiga #10127](https://tree.taiga.io/project/penpot/issue/10127) - Fix rename locked boards [Taiga #10174](https://tree.taiga.io/project/penpot/issue/10174) +- Fix update-libraries dialog disappear when clicking outside [Taiga #10238](https://tree.taiga.io/project/penpot/issue/10238) ## 2.4.3 diff --git a/common/src/app/common/types/component.cljc b/common/src/app/common/types/component.cljc index aba6e673a2..195e3a3e3b 100644 --- a/common/src/app/common/types/component.cljc +++ b/common/src/app/common/types/component.cljc @@ -29,7 +29,7 @@ (sm/register! ::component schema:component) -(def check-component! +(def check-component (sm/check-fn schema:component)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/frontend/src/app/main/data/notifications.cljs b/frontend/src/app/main/data/notifications.cljs index 7babc171c6..37caee0ba2 100644 --- a/frontend/src/app/main/data/notifications.cljs +++ b/frontend/src/app/main/data/notifications.cljs @@ -51,15 +51,12 @@ [:label :string] [:callback ::sm/fn]]]]]) -(def ^:private valid-notification? - (sm/validator schema:notification)) +(def ^:private check-notification + (sm/check-fn schema:notification)) (defn show [data] - - (dm/assert! - "expected valid notification map" - (valid-notification? data)) + (assert (check-notification data) "expected valid notification map") (ptk/reify ::show ptk/UpdateEvent @@ -68,12 +65,16 @@ (assoc state :notification notification))) ptk/WatchEvent - (watch [_ _ stream] + (watch [_ state stream] (rx/merge - (let [stopper (rx/filter (ptk/type? ::hide) stream)] + (let [stopper (rx/filter (ptk/type? ::hide) stream) + route-id (dm/get-in state [:route :data :name])] + (->> stream (rx/filter (ptk/type? :app.main.router/navigate)) - (rx/map (fn [_] (hide))) + (rx/map deref) + (rx/filter #(not= route-id (:id %))) + (rx/map hide) (rx/take-until stopper))) (when (:timeout data) (let [stopper (rx/filter (ptk/type? ::show) stream)] diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index 43a7d03496..12e617b674 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -188,8 +188,8 @@ libraries)] (when needs-check? - (rx/concat (rx/timer 1000) - (rx/of (dwl/notify-sync-file file-id)))))))) + (->> (rx/of (dwl/notify-sync-file file-id)) + (rx/delay 1000))))))) (defn- fetch-libraries [file-id] diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index 1efe714096..92331e46a6 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -715,8 +715,10 @@ (defn go-to-component-file [file-id component] - (dm/assert! (uuid? file-id)) - (dm/assert! (some? component)) + + (assert (uuid? file-id) "expected an uuid for `file-id`") + (assert (ctk/check-component component) "expected a valid component") + (ptk/reify ::nav-to-component-file ptk/WatchEvent (watch [_ state _] @@ -724,8 +726,7 @@ (assoc :file-id file-id) (assoc :page-id (:main-instance-page component)) (assoc :component-id (:id component)))] - (rx/of (rt/nav :workspace params :new-window? true)))))) - + (rx/of (rt/nav :workspace params ::rt/new-window true)))))) (defn go-to-local-component [& {:keys [id] :as options}] @@ -1192,12 +1193,11 @@ (ptk/reify ::notify-sync-file ptk/WatchEvent (watch [_ state _] - (let [file (dm/get-in state [:files file-id]) + (let [file (dsh/lookup-file state file-id) + file-data (get file :data) ignore-until (get file :ignore-sync-until) - - ;; FIXME: syntax of this can be improved libraries-need-sync (filter #(seq (assets-need-sync % file-data ignore-until)) (vals (get state :files))) @@ -1213,8 +1213,7 @@ (st/emit! (ntf/hide))) do-dismiss - #(do (st/emit! ignore-sync) - (st/emit! (ntf/hide)))] + #(st/emit! ignore-sync (ntf/hide))] (when (seq libraries-need-sync) (rx/of (ntf/dialog diff --git a/frontend/src/app/main/ui/ds/notifications/actionable.cljs b/frontend/src/app/main/ui/ds/notifications/actionable.cljs index 8633021b80..9284b5387a 100644 --- a/frontend/src/app/main/ui/ds/notifications/actionable.cljs +++ b/frontend/src/app/main/ui/ds/notifications/actionable.cljs @@ -17,34 +17,37 @@ [:class {:optional true} :string] [:variant {:optional true} [:maybe [:enum "default" "error"]]] - [:acceptLabel {:optional true} :string] - [:cancelLabel {:optional true} :string] - [:onAccept {:optional true} [:fn fn?]] - [:onCancel {:optional true} [:fn fn?]]]) + [:accept-label {:optional true} :string] + [:cancel-label {:optional true} :string] + [:on-accept {:optional true} [:fn fn?]] + [:on-cancel {:optional true} [:fn fn?]]]) (mf/defc actionable* - {::mf/props :obj - ::mf/schema schema:actionable} - [{:keys [class variant acceptLabel cancelLabel children onAccept onCancel] :rest props}] + {::mf/schema schema:actionable} + [{:keys [class variant accept-label cancel-label children on-accept on-cancel] :rest props}] - (let [variant (or variant "default") - class (d/append-class class (stl/css :notification)) - props (mf/spread-props props {:class class :data-testid "actionable"}) + (let [variant (d/nilv variant "default") + class (d/append-class class (stl/css :notification)) + props (mf/spread-props props + {:class class + :data-testid "actionable"}) - handle-accept + on-accept (mf/use-fn (fn [e] - (when onAccept (onAccept e)))) + (when (fn? on-accept) + (on-accept e)))) - handle-cancel + on-cancel (mf/use-fn (fn [e] - (when onCancel (onCancel e))))] + (when on-cancel (on-cancel e))))] - [:> "aside" props - [:div {:class (stl/css :notification-message)} - children] + [:> :aside props + [:div {:class (stl/css :notification-message)} children] [:> button* {:variant "secondary" - :on-click handle-cancel} cancelLabel] + :on-click on-cancel} + cancel-label] [:> button* {:variant (if (= variant "default") "primary" "destructive") - :on-click handle-accept} acceptLabel]])) + :on-click on-accept} + accept-label]])) diff --git a/frontend/src/app/main/ui/notifications/inline_notification.cljs b/frontend/src/app/main/ui/notifications/inline_notification.cljs index b04b6b03bf..6f7f856f7e 100644 --- a/frontend/src/app/main/ui/notifications/inline_notification.cljs +++ b/frontend/src/app/main/ui/notifications/inline_notification.cljs @@ -21,10 +21,10 @@ [{:keys [content accept cancel links] :as props}] [:> actionable* {:class (stl/css :new-inline) - :cancelLabel (:label cancel) - :onCancel (:callback cancel) - :acceptLabel (:label accept) - :onAccept (:callback accept)} + :cancel-label (:label cancel) + :on-cancel (:callback cancel) + :accept-label (:label accept) + :on-accept (:callback accept)} content (when (some? links) diff --git a/frontend/src/app/main/ui/static.cljs b/frontend/src/app/main/ui/static.cljs index 01201f1ad5..ebe78c50d7 100644 --- a/frontend/src/app/main/ui/static.cljs +++ b/frontend/src/app/main/ui/static.cljs @@ -463,14 +463,13 @@ (let [type (:type data) path (:path route) - query-params (:query-params route) - path-params (:path-params route) + params (:query-params route) workspace? (str/includes? path "workspace") dashboard? (str/includes? path "dashboard") view? (str/includes? path "view") - ;; We stora the request access info int this state + ;; We store the request access info int this state info* (mf/use-state nil) info (deref info*) @@ -478,22 +477,22 @@ request-access? (and - (or (= (:type data) :not-found) (= (:type data) :authentication)) + (or (= (:type data) :not-found) + (= (:type data) :authentication)) (or workspace? dashboard? view?) (or (:file-id info) (:team-id info)))] - (mf/with-effect [type path query-params path-params] - (let [query-params (u/map->query-string query-params) - event-params {::ev/name "exception-page" - :type type - :path path - :query-params query-params}] - (st/emit! (ptk/event ::ev/event event-params)))) + (mf/with-effect [type path params] + (st/emit! (ptk/data-event ::ev/event + {::ev/name "exception-page" + :type type + :path path + :params (u/map->query-string params)}))) - (mf/with-effect [path-params info] + (mf/with-effect [params info] (when-not (:loaded info) - (->> (load-info path-params) + (->> (load-info params) (rx/subs! (partial reset! info*))))) (when loaded?