| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- (ns frontend.mobile.action-bar
- "Block Action bar, activated when swipe on a block"
- (:require
- [frontend.db :as db]
- [frontend.extensions.srs :as srs]
- [frontend.handler.editor :as editor-handler]
- [frontend.mixins :as mixins]
- [frontend.state :as state]
- [frontend.ui :as ui]
- [frontend.util :as util]
- [frontend.util.url :as url-util]
- [goog.dom :as gdom]
- [goog.object :as gobj]
- [rum.core :as rum]
- [logseq.common.util.block-ref :as block-ref]
- [frontend.mobile.util :as mobile-util]))
- (defn- action-command
- [icon description command-handler]
- (let [callback
- (fn []
- (state/set-state! :mobile/show-action-bar? false)
- (editor-handler/clear-selection!))]
- [:button.bottom-action.flex-row
- {:on-click (fn [_event]
- (command-handler)
- (callback))}
- (ui/icon icon {:style {:fontSize 23}})
- [:div.description description]]))
- (rum/defcs action-bar < rum/reactive
- (mixins/event-mixin
- (fn [state]
- (mixins/hide-when-esc-or-outside
- state
- :on-hide (fn []
- (editor-handler/clear-selection!)
- (state/set-state! :mobile/show-action-bar? false)))))
- [state]
- (when-let [block (state/sub :mobile/actioned-block)]
- (let [{:block/keys [uuid children]} block
- last-child-block-id (when-not (empty? children)
- (->> (db/get-block-children (state/get-current-repo) uuid)
- (filter #(not (db/parents-collapsed? (state/get-current-repo) (:block/uuid %1)))) ;; DOM nodes of blocks the have collapsed parents have no bounding client rect
- last
- :block/uuid))]
- ;; scroll to the most bottom element of the selected block
- (let [tag-id (or last-child-block-id uuid)
- bottom-el (gdom/getElement (str "block-content-" tag-id))
- bottom (gobj/get (.getBoundingClientRect bottom-el) "bottom")
- vw-height (or (.-height js/window.visualViewport)
- (.-clientHeight js/document.documentElement))
- delta (- vw-height bottom 170)]
- (when (< delta 0)
- (.scrollBy (util/app-scroll-container-node) #js {:top (- 10 delta)})))
- [:div.action-bar
- [:div.action-bar-commands
- (action-command "infinity" "Card" #(srs/make-block-a-card! (:block/uuid block)))
- (action-command "copy" "Copy" #(editor-handler/copy-selection-blocks false))
- (action-command "cut" "Cut" #(editor-handler/cut-selection-blocks true))
- (action-command "trash" "Delete" #(editor-handler/delete-block-aux! block true))
- (action-command "registered" "Copy ref"
- (fn [_event] (editor-handler/copy-block-ref! uuid block-ref/->block-ref)))
- (action-command "link" "Copy url"
- (fn [_event] (let [current-repo (state/get-current-repo)
- tap-f (fn [block-id]
- (url-util/get-logseq-graph-uuid-url nil current-repo block-id))]
- (editor-handler/copy-block-ref! uuid tap-f))))
- (when (mobile-util/native-ipad?)
- (action-command "text-direction-ltr" "Right sidebar"
- (fn [_event]
- (let [current-repo (state/get-current-repo)]
- (state/sidebar-add-block! current-repo uuid :block-ref)))))]])))
|