Merge pull request #7883 from penpot/niwinz-staging-bugfix

🐛 Fix exception on paste text on comments input
This commit is contained in:
Alejandro Alonso 2025-12-04 10:32:07 +01:00 committed by GitHub
commit 84c747cd31
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 63 additions and 56 deletions

View File

@ -149,9 +149,9 @@
canvas-ref (mf/use-ref nil) canvas-ref (mf/use-ref nil)
;; VARS ;; STATE REFS
disable-paste (mf/use-var false) disable-paste-ref (mf/use-ref false)
in-viewport? (mf/use-var false) in-viewport-ref (mf/use-ref false)
;; STREAMS ;; STREAMS
move-stream (mf/use-memo #(rx/subject)) move-stream (mf/use-memo #(rx/subject))
@ -210,10 +210,10 @@
on-pointer-down (actions/on-pointer-down @hover selected edition drawing-tool text-editing? path-editing? grid-editing? on-pointer-down (actions/on-pointer-down @hover selected edition drawing-tool text-editing? path-editing? grid-editing?
path-drawing? create-comment? space? panning z? read-only?) path-drawing? create-comment? space? panning z? read-only?)
on-pointer-up (actions/on-pointer-up disable-paste) on-pointer-up (actions/on-pointer-up disable-paste-ref)
on-pointer-enter (actions/on-pointer-enter in-viewport?) on-pointer-enter (actions/on-pointer-enter in-viewport-ref)
on-pointer-leave (actions/on-pointer-leave in-viewport?) on-pointer-leave (actions/on-pointer-leave in-viewport-ref)
on-pointer-move (actions/on-pointer-move move-stream) on-pointer-move (actions/on-pointer-move move-stream)
on-move-selected (actions/on-move-selected hover hover-ids selected space? z? read-only?) on-move-selected (actions/on-move-selected hover hover-ids selected space? z? read-only?)
on-menu-selected (actions/on-menu-selected hover hover-ids selected read-only?) on-menu-selected (actions/on-menu-selected hover hover-ids selected read-only?)
@ -304,7 +304,7 @@
#(st/emit! #(st/emit!
(dwv/add-new-variant (:id first-shape))))] (dwv/add-new-variant (:id first-shape))))]
(hooks/setup-dom-events zoom disable-paste in-viewport? read-only? drawing-tool path-drawing?) (hooks/setup-dom-events zoom disable-paste-ref in-viewport-ref read-only? drawing-tool path-drawing?)
(hooks/setup-viewport-size vport viewport-ref) (hooks/setup-viewport-size vport viewport-ref)
(hooks/setup-cursor cursor alt? mod? space? panning drawing-tool path-drawing? path-editing? z? read-only?) (hooks/setup-cursor cursor alt? mod? space? panning drawing-tool path-drawing? path-editing? z? read-only?)
(hooks/setup-keyboard alt? mod? space? z? shift?) (hooks/setup-keyboard alt? mod? space? z? shift?)

View File

@ -266,7 +266,7 @@
(st/emit! (dw/show-shape-context-menu {:position position :hover-ids @hover-ids}))))))) (st/emit! (dw/show-shape-context-menu {:position position :hover-ids @hover-ids})))))))
(defn on-pointer-up (defn on-pointer-up
[disable-paste] [disable-paste-ref]
(mf/use-callback (mf/use-callback
(fn [event] (fn [event]
(dom/stop-propagation event) (dom/stop-propagation event)
@ -291,21 +291,19 @@
(dom/prevent-default event) (dom/prevent-default event)
;; We store this so in Firefox the middle button won't do a paste of the content ;; We store this so in Firefox the middle button won't do a paste of the content
(reset! disable-paste true) (mf/set-ref-val! disable-paste-ref true)
(ts/schedule #(reset! disable-paste false))) (ts/schedule #(mf/set-ref-val! disable-paste-ref false)))
(st/emit! (dw/finish-panning) (st/emit! (dw/finish-panning)
(dw/finish-zooming)))))) (dw/finish-zooming))))))
(defn on-pointer-enter [in-viewport?] (defn on-pointer-enter
(mf/use-callback [in-viewport-ref]
(fn [] (mf/use-fn #(mf/set-ref-val! in-viewport-ref true)))
(reset! in-viewport? true))))
(defn on-pointer-leave [in-viewport?] (defn on-pointer-leave
(mf/use-callback [in-viewport-ref]
(fn [] (mf/use-fn #(mf/set-ref-val! in-viewport-ref false)))
(reset! in-viewport? false))))
(defn on-key-down [] (defn on-key-down []
(mf/use-callback (mf/use-callback
@ -524,15 +522,22 @@
:blobs (seq files)}] :blobs (seq files)}]
(st/emit! (dwm/upload-media-workspace params)))))))) (st/emit! (dwm/upload-media-workspace params))))))))
(def ^:private invalid-paste-targets
#{"INPUT" "TEXTAREA"})
(defn on-paste (defn on-paste
[disable-paste in-viewport? read-only?] [disable-paste-ref in-viewport-ref read-only?]
(mf/use-fn (mf/use-fn
(mf/deps read-only?) (mf/deps read-only?)
(fn [event] (fn [event]
;; We disable the paste just after mouse-up of a middle button so ;; We disable the paste when: 1. just after mouse-up of a middle
;; when panning won't paste the content into the workspace ;; button (so when panning won't paste the content into the
(let [tag-name (-> event dom/get-target dom/get-tag-name)] ;; workspace); 2. when we paste content in an input on the
(when (and (not (#{"INPUT" "TEXTAREA"} tag-name)) ;; sidebar
(not @disable-paste) (let [tag-name (-> event dom/get-target dom/get-tag-name)
disable-paste? (mf/ref-val disable-paste-ref)
in-viewport? (mf/ref-val in-viewport-ref)]
(when (and (not (contains? invalid-paste-targets tag-name))
(not disable-paste?)
(not read-only?)) (not read-only?))
(st/emit! (dw/paste-from-event event @in-viewport?))))))) (st/emit! (dw/paste-from-event event in-viewport?)))))))

View File

@ -42,11 +42,12 @@
[rumext.v2 :as mf]) [rumext.v2 :as mf])
(:import goog.events.EventType)) (:import goog.events.EventType))
(defn setup-dom-events [zoom disable-paste in-viewport? workspace-read-only? drawing-tool drawing-path?] (defn setup-dom-events
[zoom disable-paste-ref in-viewport-ref workspace-read-only? drawing-tool drawing-path?]
(let [on-key-down (actions/on-key-down) (let [on-key-down (actions/on-key-down)
on-key-up (actions/on-key-up) on-key-up (actions/on-key-up)
on-mouse-wheel (actions/on-mouse-wheel zoom) on-mouse-wheel (actions/on-mouse-wheel zoom)
on-paste (actions/on-paste disable-paste in-viewport? workspace-read-only?) on-paste (actions/on-paste disable-paste-ref in-viewport-ref workspace-read-only?)
on-pointer-down (mf/use-fn on-pointer-down (mf/use-fn
(mf/deps drawing-tool drawing-path?) (mf/deps drawing-tool drawing-path?)
(fn [e] (fn [e]
@ -56,27 +57,27 @@
(st/emit! (dwe/clear-edition-mode)))))) (st/emit! (dwe/clear-edition-mode))))))
on-blur (mf/use-fn #(st/emit! (mse/->BlurEvent)))] on-blur (mf/use-fn #(st/emit! (mse/->BlurEvent)))]
(mf/use-effect (mf/with-effect [drawing-tool drawing-path?]
(mf/deps drawing-tool drawing-path?) (let [key (events/listen js/window EventType.POINTERDOWN on-pointer-down)]
(fn []
(let [keys [(events/listen js/window EventType.POINTERDOWN on-pointer-down)]]
(fn []
(doseq [key keys]
(events/unlistenByKey key))))))
(mf/use-layout-effect ;; We need to disable workspace paste when we on comments
(mf/deps on-key-down on-key-up on-mouse-wheel on-paste workspace-read-only?) (if (= drawing-tool :comments)
(fn [] (mf/set-ref-val! disable-paste-ref true)
(let [keys [(events/listen js/document EventType.KEYDOWN on-key-down) (mf/set-ref-val! disable-paste-ref false))
(events/listen js/document EventType.KEYUP on-key-up)
;; bind with passive=false to allow the event to be cancelled #(events/unlistenByKey key)))
;; https://stackoverflow.com/a/57582286/3219895
(events/listen js/window EventType.WHEEL on-mouse-wheel #js {:passive false}) (mf/with-layout-effect [on-key-down on-key-up on-mouse-wheel on-paste workspace-read-only?]
(events/listen js/window EventType.PASTE on-paste) (let [keys [(events/listen js/document EventType.KEYDOWN on-key-down)
(events/listen js/window EventType.BLUR on-blur)]] (events/listen js/document EventType.KEYUP on-key-up)
(fn [] ;; bind with passive=false to allow the event to be cancelled
(doseq [key keys] ;; https://stackoverflow.com/a/57582286/3219895
(events/unlistenByKey key)))))))) (events/listen js/window EventType.WHEEL on-mouse-wheel #js {:passive false})
(events/listen js/window EventType.PASTE on-paste)
(events/listen js/window EventType.BLUR on-blur)]]
(fn []
(doseq [key keys]
(events/unlistenByKey key)))))))
(defn setup-viewport-size [vport viewport-ref] (defn setup-viewport-size [vport viewport-ref]
(mf/with-effect [vport] (mf/with-effect [vport]

View File

@ -142,9 +142,9 @@
canvas-ref (mf/use-ref nil) canvas-ref (mf/use-ref nil)
text-editor-ref (mf/use-ref nil) text-editor-ref (mf/use-ref nil)
;; VARS ;; STATE REFS
disable-paste (mf/use-var false) disable-paste-ref (mf/use-ref false)
in-viewport? (mf/use-var false) in-viewport-ref (mf/use-ref false)
;; STREAMS ;; STREAMS
move-stream (mf/use-memo #(rx/subject)) move-stream (mf/use-memo #(rx/subject))
@ -204,10 +204,10 @@
on-pointer-down (actions/on-pointer-down @hover selected edition drawing-tool text-editing? path-editing? grid-editing? on-pointer-down (actions/on-pointer-down @hover selected edition drawing-tool text-editing? path-editing? grid-editing?
path-drawing? create-comment? space? panning z? read-only?) path-drawing? create-comment? space? panning z? read-only?)
on-pointer-up (actions/on-pointer-up disable-paste) on-pointer-up (actions/on-pointer-up disable-paste-ref)
on-pointer-enter (actions/on-pointer-enter in-viewport?) on-pointer-enter (actions/on-pointer-enter in-viewport-ref)
on-pointer-leave (actions/on-pointer-leave in-viewport?) on-pointer-leave (actions/on-pointer-leave in-viewport-ref)
on-pointer-move (actions/on-pointer-move move-stream) on-pointer-move (actions/on-pointer-move move-stream)
on-move-selected (actions/on-move-selected hover hover-ids selected space? z? read-only?) on-move-selected (actions/on-move-selected hover hover-ids selected space? z? read-only?)
on-menu-selected (actions/on-menu-selected hover hover-ids selected read-only?) on-menu-selected (actions/on-menu-selected hover hover-ids selected read-only?)
@ -349,7 +349,7 @@
(wasm.api/show-grid @hover-top-frame-id) (wasm.api/show-grid @hover-top-frame-id)
(wasm.api/clear-grid)))) (wasm.api/clear-grid))))
(hooks/setup-dom-events zoom disable-paste in-viewport? read-only? drawing-tool path-drawing?) (hooks/setup-dom-events zoom disable-paste-ref in-viewport-ref read-only? drawing-tool path-drawing?)
(hooks/setup-viewport-size vport viewport-ref) (hooks/setup-viewport-size vport viewport-ref)
(hooks/setup-cursor cursor alt? mod? space? panning drawing-tool path-drawing? path-editing? z? read-only?) (hooks/setup-cursor cursor alt? mod? space? panning drawing-tool path-drawing? path-editing? z? read-only?)
(hooks/setup-keyboard alt? mod? space? z? shift?) (hooks/setup-keyboard alt? mod? space? z? shift?)

View File

@ -57,10 +57,11 @@
(= (dom/get-tag-name target) "INPUT")] (= (dom/get-tag-name target) "INPUT")]
;; ignore when pasting into an editable control ;; ignore when pasting into an editable control
(when-not (or content-editable? is-input?) (if-not (or content-editable? is-input?)
(-> event (-> event
(dom/event->browser-event) (dom/event->browser-event)
(from-clipboard-event options)))))) (from-clipboard-event options))
(rx/empty)))))
(defn from-drop-event (defn from-drop-event
"Get clipboard stream from drop event" "Get clipboard stream from drop event"