enhance(ux): refactor the block preview modal with the shui popup

pull/11433/head
charlie 2024-07-17 19:52:03 +08:00
parent 3757370118
commit d350949564
2 changed files with 82 additions and 54 deletions

View File

@ -660,14 +660,59 @@
(:db/id page-entity)))}
(ui/icon "x" {:size 15})]))]))
(rum/defc popup-preview-impl
[children {:keys [*timer *timer1 visible? set-visible! render]}]
(let [*el-trigger (rum/use-ref nil)]
(rum/use-effect!
(fn []
(when (true? visible?)
(shui/popup-show!
(rum/deref *el-trigger) render
{:root-props {:onOpenChange (fn [v] (set-visible! v))
:modal false}
:content-props {:class "ls-preview-popup"
:onEscapeKeyDown (fn [^js e] (.preventDefault e))}
:as-dropdown? false}))
(when (false? visible?)
(shui/popup-hide!))
(rum/set-ref! *timer nil)
(rum/set-ref! *timer1 nil)
;; teardown
(fn []
(when visible?
(shui/popup-hide!))))
[visible?])
[:span
{:ref *el-trigger
:on-mouse-enter (fn []
(let [timer (rum/deref *timer)
timer1 (rum/deref *timer1)]
(when-not timer
(rum/set-ref! *timer
(js/setTimeout #(set-visible! true) 1000)))
(when timer1
(js/clearTimeout timer1)
(rum/set-ref! *timer1 nil))))
:on-mouse-leave (fn []
(let [timer (rum/deref *timer)
timer1 (rum/deref *timer1)]
(when timer
(js/clearTimeout timer)
(rum/set-ref! *timer nil))
(when-not timer1
(rum/set-ref! *timer1
(js/setTimeout #(set-visible! false) 200)))))}
children]))
(rum/defc page-preview-trigger
[{:keys [children sidebar? open? manual?] :as config} page-name]
(let [page-name (when page-name (util/page-name-sanity-lc page-name))
*el-trigger (rum/use-ref nil)
[visible? set-visible!] (rum/use-state nil)
*timer (rum/use-ref nil) ;; show
*timer1 (rum/use-ref nil) ;; hide
_ #_:clj-kondo/ignore (rum/defc html-template []
[visible? set-visible!] (rum/use-state nil)
_ #_:clj-kondo/ignore (rum/defc preview-render []
(let [*el-popup (rum/use-ref nil)]
(rum/use-effect!
@ -709,45 +754,12 @@
:sidebar? sidebar?
:preview? true}))]))))]
(rum/use-effect!
(fn []
(when (true? visible?)
(shui/popup-show!
(rum/deref *el-trigger) html-template
{:root-props {:onOpenChange (fn [v] (set-visible! v))
:modal false}
:content-props {:class "ls-preview-popup"
:onEscapeKeyDown (fn [^js e] (.preventDefault e))}
:as-dropdown? false}))
(when (false? visible?)
(shui/popup-hide!))
(rum/set-ref! *timer nil)
(rum/set-ref! *timer1 nil))
[visible?])
(if (or (not manual?) open?)
[:span
{:ref *el-trigger
:on-mouse-enter (fn []
(let [timer (rum/deref *timer)
timer1 (rum/deref *timer1)]
(when-not timer
(rum/set-ref! *timer
(js/setTimeout #(set-visible! true) 1000)))
(when timer1
(js/clearTimeout timer1)
(rum/set-ref! *timer1 nil))))
:on-mouse-leave (fn []
(let [timer (rum/deref *timer)
timer1 (rum/deref *timer1)]
(when timer
(js/clearTimeout timer)
(rum/set-ref! *timer nil))
(when-not timer1
(rum/set-ref! *timer1
(js/setTimeout #(set-visible! false) 200)))))}
children] children)))
(popup-preview-impl children
{:visible? visible? :set-visible! set-visible!
:*timer *timer :*timer1 *timer1
:render preview-render})
children)))
(rum/defcs page-cp < db-mixins/query rum/reactive
{:init (fn [state]
@ -944,6 +956,32 @@
(declare block-content)
(declare breadcrumb)
(rum/defc block-reference-preview
[children {:keys [repo config id]}]
(let [*timer (rum/use-ref nil) ;; show
*timer1 (rum/use-ref nil) ;; hide
[visible? set-visible!] (rum/use-state nil)
_ #_:clj-kondo/ignore (rum/defc render []
[:div.tippy-wrapper.overflow-y-auto.p-4
{:style {:width 600
:font-weight 500
:text-align "left"}
:on-mouse-enter (fn []
(when-let [timer1 (rum/deref *timer1)]
(js/clearTimeout timer1)))
:on-mouse-leave (fn []
(rum/set-ref! *timer1
(js/setTimeout #(set-visible! false) 500)))}
[(breadcrumb config repo id {:indent? true})
(blocks-container
(assoc config :id (str id) :preview? true)
(db/get-block-and-children repo id))]])]
(popup-preview-impl children
{:visible? visible? :set-visible! set-visible!
:*timer *timer :*timer1 *timer1
:render render})))
(rum/defc block-reference < rum/reactive db-mixins/query
{:init (fn [state]
(let [block-id (second (:rum/args state))]
@ -1012,18 +1050,8 @@
(not (:preview? config))
(not (:modal/show? @state/state))
(nil? block-type))
(ui/tippy {:html (fn []
[:div.tippy-wrapper.overflow-y-auto.p-4
{:style {:width 735
:text-align "left"
:max-height 600}}
[(breadcrumb config repo block-id {:indent? true})
(blocks-container
(assoc config :id (str id) :preview? true)
(db/get-block-and-children repo block-id))]])
:interactive true
:in-editor? true
:delay [1000, 100]} inner)
(block-reference-preview inner
{:repo repo :config config :id block-id})
inner)])
[:span.warning.mr-1 {:title "Block ref invalid"}
(block-ref/->block-ref id)])))

View File

@ -620,7 +620,7 @@
:keymap/keystroke-filter "Keystroke filter"
:keymap/keystroke-record-desc "Press any sequence of keys to filter shortcuts"
:keymap/keystroke-record-setup-label "Press any sequence of keys to set a shortcut"
:keymap/restore-to-default "Restore to system default"
:keymap/restore-to-default "Restore to the default"
:keymap/customize-for-label "Customize shortcuts"
:keymap/conflicts-for-label "Keymap conflicts for"