Tienson Qin пре 7 месеци
родитељ
комит
6157bd57fc

+ 0 - 97
src/main/capacitor/bootstrap.cljs

@@ -1,97 +0,0 @@
-(ns capacitor.bootstrap
-  (:require [frontend.config :as config]
-            [frontend.context.i18n :as i18n]
-            [frontend.db.react :as react]
-            [frontend.db.restore :as db-restore]
-            [capacitor.events :as events]
-            [frontend.handler.notification :as notification]
-            [frontend.handler.repo :as repo-handler]
-            [frontend.handler.repo-config :as repo-config-handler]
-            [frontend.idb :as idb]
-            [frontend.persist-db :as persist-db]
-            [frontend.persist-db.browser :as db-browser]
-            [frontend.state :as state]
-            [frontend.util :as util]
-            [frontend.util.persist-var :as persist-var]
-            [goog.object :as gobj]
-            [lambdaisland.glogi :as log]
-            [promesa.core :as p]))
-
-(defn restore-and-setup!
-  [repo]
-  (when repo
-    (-> (p/let [_ (db-restore/restore-graph! repo)]
-          (repo-config-handler/start {:repo repo}))
-      (p/then
-        (fn []
-          (js/console.log "db restored, setting up repo hooks")
-
-          ; skip initialize ui commands
-          ;(page-handler/init-commands!)
-          ))
-      (p/catch (fn [error]
-                 (log/error :exception error))))))
-
-(defn- handle-connection-change
-  [e]
-  (let [online? (= (gobj/get e "type") "online")]
-    (state/set-online! online?)))
-
-(defn set-network-watcher!
-  []
-  (js/window.addEventListener "online" handle-connection-change)
-  (js/window.addEventListener "offline" handle-connection-change))
-
-(defn start!
-  [render]
-
-  (idb/start)
-
-  (state/set-db-restoring! true)
-
-  (render)
-
-  (i18n/start)
-
-  (state/set-online! js/navigator.onLine)
-  (set-network-watcher!)
-
-  (-> (util/indexeddb-check?)
-    (p/catch (fn [_e]
-               (notification/show! "Sorry, it seems that your browser doesn't support IndexedDB, we recommend to use latest Chrome(Chromium) or Firefox(Non-private mode)." :error false)
-               (state/set-indexedb-support! false))))
-
-  (react/run-custom-queries-when-idle!)
-
-  ;; sentry for the worker messaging
-  (events/run!)
-
-  (p/do!
-    (-> (p/let [_ (db-browser/start-db-worker!)
-                repos (repo-handler/get-repos)
-                _ (state/set-repos! repos)
-                ;_ (mobile-util/hide-splash) ;; hide splash as early as ui is stable
-                repo (or (state/get-current-repo) (:url (first repos)))
-                _ (if (empty? repos)
-                    (repo-handler/new-db! config/demo-repo)
-                    (restore-and-setup! repo))]
-
-          (prn :debug-start-repos repos)
-          ;(when (util/electron?)
-          ;  (persist-db/run-export-periodically!))
-          ;(when (mobile-util/native-platform?)
-          ;  (state/restore-mobile-theme!))
-          )
-      (p/catch (fn [e]
-                 (js/console.error "Error while restoring repos: " e)))
-      (p/finally (fn []
-                   (state/set-db-restoring! false))))
-
-    (util/<app-wake-up-from-sleep-loop (atom false))
-
-    ;; DB version not support for the persistent strategy
-    ;; (persist-var/load-vars)
-    ))
-
-(defn stop! []
-  (prn "stop!"))

+ 23 - 47
src/main/capacitor/app.cljs → src/main/capacitor/components/app.cljs

@@ -1,20 +1,15 @@
-(ns capacitor.app
-  (:require ["./externals.js"]
+(ns capacitor.components.app
+  (:require ["../externals.js"]
             ["@capacitor/app" :refer [App]]
             ["@capacitor/app" :refer [App]]
-            ["@capacitor/status-bar" :refer [StatusBar Style]]
-            [capacitor.components.blocks :as cc-blocks]
-            [capacitor.components.nav-utils :as cc-utils]
+            [capacitor.nav :as nav]
             [capacitor.components.settings :as settings]
             [capacitor.components.settings :as settings]
             [capacitor.components.ui :as ui]
             [capacitor.components.ui :as ui]
-            [capacitor.handler :as handler]
             [capacitor.ionic :as ion]
             [capacitor.ionic :as ion]
             [capacitor.state :as state]
             [capacitor.state :as state]
             [clojure.string :as string]
             [clojure.string :as string]
             [frontend.components.journal :as journal]
             [frontend.components.journal :as journal]
-            [frontend.date :as frontend-date]
-            [frontend.db-mixins :as db-mixins]
+            [frontend.date :as date]
             [frontend.db.conn :as db-conn]
             [frontend.db.conn :as db-conn]
-            [frontend.db.utils :as db-util]
             [frontend.handler.repo :as repo-handler]
             [frontend.handler.repo :as repo-handler]
             [frontend.mobile.util :as mobile-util]
             [frontend.mobile.util :as mobile-util]
             [frontend.rum :as frum]
             [frontend.rum :as frum]
@@ -25,7 +20,9 @@
             [logseq.shui.popup.core :as shui-popup]
             [logseq.shui.popup.core :as shui-popup]
             [logseq.shui.toaster.core :as shui-toaster]
             [logseq.shui.toaster.core :as shui-toaster]
             [promesa.core :as p]
             [promesa.core :as p]
-            [rum.core :as rum]))
+            [rum.core :as rum]
+            [frontend.db :as db]
+            [frontend.handler.page :as page-handler]))
 
 
 (rum/defc app-graphs-select
 (rum/defc app-graphs-select
   []
   []
@@ -75,27 +72,6 @@
     {:tab "settings"}
     {:tab "settings"}
     (ion/tabler-icon "settings" {:size 22}) "Settings")))
     (ion/tabler-icon "settings" {:size 22}) "Settings")))
 
 
-(rum/defc journals-list < rum/reactive db-mixins/query
-  []
-  (let [journals (handler/sub-journals)]
-    [:ul.app-journals-list
-     (for [journal-id journals]
-       (let [journal (db-util/entity journal-id)]
-         [:li.flex.py-1.flex-col.w-full
-          [:h1.font-semibold.opacity-90.active:opacity-50
-           {:on-click #(cc-utils/nav-to-block! journal {:reload-pages! (fn [] ())})}
-           (:block/title journal)]
-          ;; blocks editor
-          (cc-blocks/page-blocks journal)]))]))
-
-(rum/defc contents-playground < rum/reactive db-mixins/query
-  []
-
-  [:div.py-4
-   [:h1.text-4xl.flex.gap-1.items-center.mb-4.pt-2.font-mono
-    (ion/tabler-icon "file" {:size 30}) "Contents"]
-   (cc-blocks/page-blocks "Contents")])
-
 (rum/defc keep-keyboard-open
 (rum/defc keep-keyboard-open
   []
   []
   [:input.absolute.top-4.left-0.w-1.h-1.opacity-0
   [:input.absolute.top-4.left-0.w-1.h-1.opacity-0
@@ -135,15 +111,16 @@
 
 
        (ion/buttons {:slot "end"}
        (ion/buttons {:slot "end"}
                     (ion/button
                     (ion/button
-                     {:size "small" :fill "clear"
+                     {:size "small"
+                      :fill "clear"
                       :on-click (fn []
                       :on-click (fn []
                                   (let [apply-date! (fn [date]
                                   (let [apply-date! (fn [date]
-                                                      (let [page-name (frontend-date/journal-name (gdate/Date. (js/Date. date)))
-                                                            nav-to-journal! #(cc-utils/nav-to-block! % {:reload-pages! (fn [] ())})]
-                                                        (if-let [journal (handler/local-page page-name)]
+                                                      (let [page-name (date/journal-name (gdate/Date. (js/Date. date)))
+                                                            nav-to-journal! #(nav/nav-to-block! % {:reload-pages! (fn [] ())})]
+                                                        (if-let [journal (db/get-page page-name)]
                                                           (nav-to-journal! journal)
                                                           (nav-to-journal! journal)
-                                                          (-> (handler/<create-page! page-name)
-                                                              (p/then #(nav-to-journal! (handler/local-page page-name)))))))]
+                                                          (-> (page-handler/<create! page-name {:redirect? false})
+                                                              (p/then #(nav-to-journal! (db/get-page page-name)))))))]
 
 
                                     (if (mobile-util/native-android?)
                                     (if (mobile-util/native-android?)
                                       (-> (.showDatePicker mobile-util/ui-local)
                                       (-> (.showDatePicker mobile-util/ui-local)
@@ -157,14 +134,15 @@
                                                           (let [val (.-value (.-detail e))]
                                                           (let [val (.-value (.-detail e))]
                                                             (apply-date! val)
                                                             (apply-date! val)
                                                             (close!)))}))))))}
                                                             (close!)))}))))))}
-                     [:span {:slot "icon-only"} (ion/tabler-icon "calendar-month" {:size 24})])
+                     [:span.text-muted-foreground {:slot "icon-only"}
+                      (ion/tabler-icon "calendar-month" {:size 24})])
 
 
                     (ion/button {:fill "clear"}
                     (ion/button {:fill "clear"}
                                 (ion/nav-link
                                 (ion/nav-link
                                  {:routerDirection "forward"
                                  {:routerDirection "forward"
                                   :class "w-full"
                                   :class "w-full"
                                   :component settings/page}
                                   :component settings/page}
-                                 [:span {:slot "icon-only"} (ion/tabler-icon "dots" {:size 24})])))))
+                                 [:span.text-muted-foreground {:slot "icon-only"} (ion/tabler-icon "dots" {:size 24})])))))
 
 
        ;; main content
        ;; main content
      (if db-restoring?
      (if db-restoring?
@@ -229,11 +207,10 @@
 (rum/defc main []
 (rum/defc main []
   (let [current-repo (frum/use-atom-in fstate/state :git/current-repo)]
   (let [current-repo (frum/use-atom-in fstate/state :git/current-repo)]
     ;; global
     ;; global
+    ;; why need this
     (hooks/use-effect!
     (hooks/use-effect!
      (fn []
      (fn []
-       (some-> js/window.externalsjs (.settleStatusBar))
-       (some-> js/window.externalsjs
-               (.initGlobalListeners #js {:onKeyboardHide (fn [] (state/exit-editing!))})))
+       (some-> js/window.externalsjs (.settleStatusBar)))
      [current-repo])
      [current-repo])
 
 
     ;; navigation
     ;; navigation
@@ -241,19 +218,18 @@
      (fn []
      (fn []
        (let [handle-back!
        (let [handle-back!
              (fn []
              (fn []
+               (fstate/clear-edit!)
+               (fstate/clear-selection!)
                (cond
                (cond
-                 (not (nil? (state/get-editing-block)))
-                 (state/exit-editing!)
-
                  (seq (ui/get-modal))
                  (seq (ui/get-modal))
                  nil
                  nil
 
 
                  :else
                  :else
-                 (-> (cc-utils/nav-length?)
+                 (-> (nav/nav-length?)
                      (p/then (fn [len]
                      (p/then (fn [len]
                                (if (= len 1)
                                (if (= len 1)
                                  (.exitApp App)
                                  (.exitApp App)
-                                 (cc-utils/nav-pop!)))))))
+                                 (nav/nav-pop!)))))))
              ^js back-listener (.addListener App "backButton" handle-back!)]
              ^js back-listener (.addListener App "backButton" handle-back!)]
          #(.remove back-listener)))
          #(.remove back-listener)))
      [])
      [])

+ 0 - 55
src/main/capacitor/app.css → src/main/capacitor/components/app.css

@@ -76,61 +76,6 @@ ion-textarea {
   box-shadow: none;
   box-shadow: none;
 }
 }
 
 
-.app-journals-list {
-  @apply min-h-screen;
-
-  > li {
-    > h1 {
-      @apply text-3xl font-serif mb-4;
-    }
-  }
-}
-
-.editor-aux-input {
-}
-
-.app-page-blocks {
-  &.as-classic {
-    @apply -ml-2.5 py-2 pr-1;
-
-    .editor-inner {
-      > textarea {
-        @apply w-full;
-      }
-    }
-  }
-}
-
-.app-blocks-list {
-  .normalize-text-style {
-    @apply text-[20px] leading-[28px];
-  }
-
-  .block-item {
-    @apply flex list-none py-1;
-  }
-
-  .block-bullet-marker {
-    @apply flex w-[30px] items-start justify-center;
-
-    > strong {
-      @apply text-[32px] opacity-80;
-    }
-  }
-
-  .block-content-or-editor {
-    @apply flex flex-1;
-
-    .editor-aux-input {
-      @apply p-0 text-xl m-0 w-full;
-    }
-
-    .content-aux-container {
-      @apply w-full;
-    }
-  }
-}
-
 :root {
 :root {
     --ls-page-title-size: 26px;
     --ls-page-title-size: 26px;
     --ion-color-primary: #000000;
     --ion-color-primary: #000000;

+ 0 - 343
src/main/capacitor/components/blocks.cljs

@@ -1,343 +0,0 @@
-(ns capacitor.components.blocks
-  (:require [capacitor.components.common :as cc-common]
-            [capacitor.components.editor :as cc-editor]
-            [capacitor.ionic :as ion]
-            [capacitor.state :as state]
-            [clojure.string :as string]
-            [dommy.core :as dom]
-            [frontend.components.page :as cp-page]
-            [frontend.db.async :as db-async]
-            [frontend.db.conn :as db-conn]
-            [frontend.db.model :as db-model]
-            [frontend.db.utils :as db-utils]
-            [frontend.handler.editor :as editor-handler]
-            [frontend.handler.notification :as notification]
-            [frontend.handler.page :as page-handler]
-            [frontend.state :as fstate]
-            [frontend.util.cursor :as cursor]
-            [promesa.core :as p]
-            [rum.core :as rum]))
-
-(rum/defc edit-block-modal
-  [block {:keys [reload-page!]}]
-  (let [[^js nav] (state/use-nav-root)
-        title (:block/title block)
-        *input (rum/use-ref nil)
-        close! #(.pop nav)]
-
-    (rum/use-effect!
-     (fn []
-       (js/setTimeout
-        (fn []
-          (when-let [^js input (some-> (rum/deref *input)
-                                       (.querySelector "textarea"))]
-            (.focus input)
-            (let [len (.-length (.-value input))]
-              (.setSelectionRange input len len))))
-        500)
-       #())
-     [])
-
-    (ion/page
-     (ion/header
-      (ion/toolbar
-       (ion/buttons {:slot "end"}
-                    (when (not (nil? (:db/id block)))
-                      (ion/button {:fill "clear"
-                                   :class "opacity-80 text-red-500"
-                                   :on-click (fn []
-                                               (-> (editor-handler/delete-block-aux! block)
-                                                   (p/then (fn []
-                                                             (close!)
-                                                             (reload-page!)))))}
-                                  (ion/tabler-icon "trash" {:size 26}))))
-       (ion/title (or title "Untitled"))))
-
-     (ion/content {:class "ion-padding"}
-                  [:div.py-2
-                   (ion/textarea {:placeholder "block content"
-                                  :ref *input
-                                  :class "bg-gray-100"
-                                  :auto-grow true
-                                  :autofocus true
-                                  :value (:block/title block)})]
-                  [:div.flex.py-2.justify-between
-                   (ion/button
-                    {:on-click #(close!)
-                     :fill "clear"}
-                    "Cancel")
-                   (ion/button
-                    {:on-click (fn []
-                                 (let [new? (nil? (:db/id block))
-                                       val (.-value (.querySelector (rum/deref *input) "textarea"))]
-                                   (if-let [page (and new? (:block/page block))]
-                                     (-> (editor-handler/api-insert-new-block! val {:page (:db/id page)
-                                                                                    :sibling? true})
-                                         (p/then (fn []
-                                                   (close!)
-                                                   (reload-page!))))
-                                     (-> (editor-handler/save-block! (fstate/get-current-repo)
-                                                                     (:block/uuid block) val)
-                                         (p/then (fn []
-                                                   (close!)
-                                                   (reload-page!)))))))
-                     :class ""} "Save")]))))
-
-;; handlers
-(defn insert-new-block!
-  [content opts]
-  (let [opts' (merge {:sibling? true}
-                     opts {:edit-block? false})]
-    (editor-handler/api-insert-new-block! content opts')))
-
-(defn dom-prev-block
-  [^js current-block-node]
-  (when-let [prev-node (loop [node current-block-node]
-                         (when-let [node (some-> node (.-previousSibling))]
-                           (when node
-                             (if (dom/has-class? node "block-item")
-                               node
-                               (recur node)))))]
-    (let [uuid' (.-blockid (.-dataset prev-node))]
-      (db-model/get-block-by-uuid (uuid uuid')))))
-
-(defn dom-next-block
-  [^js current-block-node]
-  (when-let [next-node (loop [node current-block-node]
-                         (when-let [node (some-> node (.-nextSibling))]
-                           (when node
-                             (if (dom/has-class? node "block-item")
-                               node
-                               (recur node)))))]
-    (let [uuid' (.-blockid (.-dataset next-node))]
-      (db-model/get-block-by-uuid (uuid uuid')))))
-
-;; components
-(rum/defc block-editor
-  [block]
-  (let [content (:block/title block)
-        block-uuid (:block/uuid block)
-        current-repo (fstate/get-current-repo)]
-
-    (cc-editor/editor-aux content
-                          {:on-focused!
-                           (fn [^js input]
-                             (let [cursor-at (some-> (state/get-editing-opts) :cursor-at)]
-                               (if (number? cursor-at)
-                                 (cursor/move-cursor-to input cursor-at)
-                                 (cursor/move-cursor-to-end input))))
-
-                           :on-bounded!
-                           (fn [dir ^js input]
-                             (case dir
-                               :up (when-let [prev-block (dom-prev-block (.closest input ".block-item"))]
-                                     (state/edit-block! prev-block {}))
-                               :down (when-let [next-block (dom-next-block (.closest input ".block-item"))]
-                                       (js/console.log next-block)
-                                       (state/edit-block! next-block {}))
-                               :dune))
-
-                           :on-outside!
-                           (fn [^js e]
-                             (let [edit-target? (some-> e (.-target) (cc-common/get-dom-block-uuid))]
-                               (when edit-target?
-                                 (cc-common/keep-keyboard-open e))
-                               (when (and (not edit-target?)
-                                          (= block (:editing-block @state/*state)))
-                                 (state/exit-editing!))))
-
-                           :on-save!
-                           (fn [content {:keys [enter? esc?]}]
-         ;; update block content
-                             (-> (do (when (or enter? esc?) (state/exit-editing!))
-               ;; check block exist?
-                                     (when-not (db-utils/entity (:db/id block))
-                                       (throw nil))
-                                     (editor-handler/save-block! current-repo block-uuid content))
-                                 (p/then (fn []
-                                           (state/set-state! [:modified-blocks block-uuid] (js/Date.now))
-                                           (when enter?
-                       ;; create new block
-                                             (cc-common/keep-keyboard-open nil)
-                                             (-> (insert-new-block! "" {:block-uuid block-uuid})
-                                                 (p/then (fn [new-block]
-                                                           (prn :debug "new block:" new-block)
-                                                           (when-let [parent-block (:block/parent new-block)]
-                                                             (state/set-state! [:modified-pages (:block/uuid parent-block)] (js/Date.now)))
-                                   ;; edit the new block
-                                                           (js/requestAnimationFrame #(state/edit-block! new-block))))))))
-
-                                 (p/catch #(notification/show! (str %) :error))))
-
-                           :on-delete!
-                           (fn [content]
-                             (let [prev-block (db-model/get-prev (db-conn/get-db) (:db/id block))
-                                   parent-block (:block/parent block)]
-                               (cond
-                                 (and (nil? prev-block) (nil? parent-block)) nil
-
-                                 :else
-                                 (let [has-children? (seq (:block/_parent block))]
-                                   (when (and (not has-children?) prev-block)
-                                     (p/do!
-                                      (when prev-block (cc-common/keep-keyboard-open nil))
-                                      (editor-handler/delete-block-aux! block)
-                                      (state/set-state! [:modified-blocks (:block/uuid block)] (js/Date.now))
-                                      (when (and (false? (some-> content (string/trim) (string/blank?))) prev-block)
-                                        (editor-handler/save-block! current-repo prev-block
-                                                                    (str (:block/title prev-block) content)))
-                                      (state/set-state! [:modified-blocks (:block/uuid prev-block)] (js/Date.now))
-                                      (js/requestAnimationFrame #(state/edit-block! prev-block
-                                                                                    {:cursor-at (count (:block/title prev-block))}))))))
-                               (prn :debug "delete node:" (:db/id block) (:block/title prev-block))))})))
-
-(rum/defc block-content
-  [block]
-  (let [content (:block/title block)]
-    (cc-editor/content-aux content {})))
-
-(rum/defc block-item
-  [block']
-  (let [[block set-block!] (rum/use-state block')
-        block-uuid (:block/uuid block)
-        [editing-block set-editing-block!] (state/use-app-state :editing-block)
-        [modified-ts] (state/use-app-state [:modified-blocks block-uuid])
-        [editing? set-editing!] (rum/use-state false)]
-
-    (rum/use-effect!
-     (fn []
-        ;; rerender modified block
-       (-> (db-utils/entity (:db/id block)) (set-block!))
-       #())
-     [modified-ts block'])
-
-    (rum/use-effect!
-     (fn []
-       (if (and editing-block
-                (= block-uuid (:block/uuid editing-block)))
-         (set-editing! true)
-         (set-editing! false))
-       #())
-     [editing-block])
-
-    (when block
-      [:li.block-item.normalize-text-style
-       {:on-click (fn []
-                    (when-not editing?
-                      (set-editing-block! block)))
-        :data-blockid (:block/uuid block)}
-       [:div.block-bullet-marker
-        [:strong "·"]]
-       [:div.block-content-or-editor
-        {:class (when editing? "is-editing")}
-        (if editing?
-          (block-editor block)
-          (block-content block))]])))
-
-(rum/defc blocks-list
-  [blocks]
-  (when (seq blocks)
-    [:ul.app-blocks-list
-     (for [block blocks]
-       (rum/with-key (block-item block) (str (:block/uuid block))))]))
-
-(rum/defc blocks-container
-  [root-block]
-  (let [[block set-block!] (rum/use-state root-block)
-        [modified-ts] (state/use-app-state [:modified-blocks (:block/uuid block)])
-        page? (db-model/page? block)
-        children (:block/_parent block)
-        blocks (some-> children (seq) (db-model/sort-by-order))]
-
-    (rum/use-effect!
-     (fn []
-       (set-block! (db-utils/entity (:db/id root-block)))
-       #())
-     [modified-ts root-block])
-
-    ;(js/console.log "=>> blocks:" (:block/title root) (count blocks))
-    [:div.app-blocks-container
-     {:class (when page? "as-page")}
-     (blocks-list blocks)]))
-
-(rum/defc page-blocks
-  [page-name-or-entity]
-  (let [[page set-page!] (rum/use-state
-                          (if (:db/id page-name-or-entity) page-name-or-entity
-                              (db-model/get-page page-name-or-entity)))
-        [modified-page] (state/use-app-state [:modified-pages (:block/uuid page)])
-        [_loading? set-loading!] (rum/use-state false)]
-
-    (rum/use-effect!
-      ;; sync page blocks
-     (fn []
-       (-> (db-async/<get-block (fstate/get-current-repo) (:block/uuid page))
-           (p/then (fn [page]
-                     (prn :debug "re-render page:" (:block/title page))
-                     (set-page! (db-utils/entity (:db/id page)))))
-           (p/finally #()))
-       #())
-     [modified-page])
-
-    (when page
-      [:div.app-page-blocks.mb-4
-       (blocks-container page)])))
-
-(rum/defc page-blocks-classic
-  [page]
-  [:div.app-page-blocks.as-classic
-   (cp-page/page-blocks-cp page {})])
-
-(rum/defc page
-  [block & {:keys [reload-pages!]}]
-  (let [[^js nav] (state/use-nav-root)
-        [page set-page!] (rum/use-state (let [eid (or (:db/id block)
-                                                      (when-let [id (:block/uuid block)]
-                                                        [:block/uuid id]))]
-                                          (db-utils/entity eid)))
-        title (or (:block/title block) (:block/title page))
-        [loading? set-loading!] (rum/use-state true)
-        rerender! (fn []
-                    (set-page! (db-utils/entity (:db/id block)))
-                    (state/set-state! [:modified-pages (:block/uuid block)] (js/Date.now)))]
-
-    (rum/use-effect!
-      ;; sync page blocks
-     (fn []
-       (-> (db-async/<get-block (fstate/get-current-repo) (:block/uuid block))
-           (p/then #(set-page! (db-utils/entity (:db/id %))))
-           (p/finally #(set-loading! false)))
-       #())
-     [])
-
-    (ion/page
-     (ion/header
-      (ion/toolbar
-       (ion/buttons {:slot "start"}
-                    (ion/button {:fill "clear"
-                                 :on-click #(.pop nav)}
-                                (ion/tabler-icon "arrow-left" {:size 26})))
-
-       (ion/buttons {:slot "end"}
-                    (ion/button {:fill "clear"
-                                 :class "opacity-80"
-                                 :on-click rerender!}
-                                (ion/tabler-icon "refresh" {:size 26}))
-                    (ion/button {:fill "clear"
-                                 :class "opacity-80 text-red-500"
-                                 :on-click (fn []
-                                             (page-handler/<delete! (:block/uuid block)
-                                                                    (fn []
-                                                                      (.pop nav)
-                                                                      (when (fn? reload-pages!)
-                                                                        (reload-pages!)))
-                                                                    {:error-handler (fn [^js e]
-                                                                                      (js/console.error e))}))}
-                                (ion/tabler-icon "trash" {:size 26})))
-
-       (ion/title title)))
-
-     (ion/content {:class "ion-padding"}
-                  (if loading?
-                    [:p.text-xl.text-center "Loading ..."]
-                    (page-blocks-classic page))))))

+ 0 - 30
src/main/capacitor/components/common.cljs

@@ -1,30 +0,0 @@
-(ns capacitor.components.common)
-
-(defn stop [e]
-  (when e (doto e (.preventDefault) (.stopPropagation))))
-
-(defn get-dom-block-uuid
-  [^js el]
-  (some-> el
-    (.closest "[data-blockid]")
-    (.-dataset) (.-blockid)
-    (uuid)))
-
-(defn get-dom-page-scroll
-  [^js el]
-  (some-> el (.closest "[part=scroll]")))
-
-(defn current-page-scroll
-  []
-  (some-> (js/document.querySelector "ion-nav > .ion-page:not(.ion-page-hidden)")
-    (.querySelector "ion-content")
-    (.-shadowRoot)
-    (.querySelector "[part=scroll]")))
-
-(defn keep-keyboard-open
-  [^js e]
-  (try
-    (.keepKeyboardOpen js/window)
-    (some-> e (stop))
-    (catch js/Error e'
-      (js/console.error e'))))

+ 0 - 88
src/main/capacitor/components/editor.cljs

@@ -1,88 +0,0 @@
-(ns capacitor.components.editor
-  (:require [capacitor.components.ui :as ui]
-            [capacitor.ionic :as ion]
-            [cljs-bean.core :as bean]
-            [frontend.util :as util]
-            [frontend.util.cursor :as cursor]
-            [rum.core :as rum]))
-
-(rum/defc editor-aux
-  [content {:keys [on-outside! on-save! on-delete! on-focused! on-keydown! on-keyup! on-bounded!]}]
-
-  (let [*input (rum/use-ref nil)]
-
-    (rum/use-layout-effect!
-     (fn []
-       (js/requestAnimationFrame
-        (fn []
-          (when-let [^js input (some-> (rum/deref *input))]
-            (.focus input)
-            (when on-focused!
-              (on-focused! input))
-              ;(.scrollIntoView input #js {:behavior "smooth", :block "start"})
-            )))
-       #())
-     [])
-
-    (rum/use-effect!
-     (fn []
-       (let [handle-outside! (fn [^js e]
-                               (when-not (some-> e (.-target) (.closest ".editor-aux-input"))
-                                 (on-outside! e)))]
-         (js/window.addEventListener "pointerdown" handle-outside!)
-         #(js/window.removeEventListener "pointerdown" handle-outside!)))
-     [])
-
-    (let [save-handle!
-          (fn [opts]
-            (when-let [content (some-> (rum/deref *input) (.-value))]
-              (when on-save!
-                (prn :debug "save block content:" content opts)
-                (on-save! content opts))))
-          delete-handle! (fn [opts]
-                           (let [content (.-value (rum/deref *input))]
-                             (when on-delete!
-                               (prn :debug "delete block:" content opts)
-                               (on-delete! content opts))))
-          debounce-save-handle! (util/debounce save-handle! 128)]
-      (ui/textarea
-       {:class "editor-aux-input bg-gray-200 border-none resize-none"
-        :ref *input
-        :on-change (fn [] (debounce-save-handle!))
-        :on-key-down (fn [^js e]
-                       (let [ekey (.-key e)
-                             target (.-target e)
-                             enter? (= ekey "Enter")
-                             esc? (= ekey "Escape")
-                             backspace? (= ekey "Backspace")
-                             arrow-up? (= ekey "ArrowUp")
-                             arrow-down? (= ekey "ArrowDown")]
-
-                         (when (or (nil? on-keydown!)
-                                   (not (false? (on-keydown! e))))
-                           (cond
-                             (or arrow-up? arrow-down?)
-                             (when-let [{:keys [isFirstLine isLastLine]} (some-> (.checkCursorLine js/window.externalsjs target) (bean/->clj))]
-                               (when (and on-bounded! (or (and arrow-up? isFirstLine)
-                                                          (and arrow-down? isLastLine)))
-                                 (on-bounded! (if arrow-up? :up :down) target)
-                                 (util/stop e)))
-
-                             (or (and enter? (cursor/end? target)) esc?)
-                             (do (save-handle! {:enter? enter? :esc? esc?})
-                                 (util/stop e))
-
-                             (and backspace?
-                                  (cursor/start? target)
-                                  (not (util/input-text-selected? target)))
-                             (do (delete-handle! {})
-                                 (util/stop e))))))
-        :on-key-up (fn [^js e]
-                     (when on-keyup!
-                       (on-keyup! e)))
-        :default-value content}))))
-
-(rum/defc content-aux
-  [content & opts]
-
-  [:div.content-aux-container content])

+ 63 - 0
src/main/capacitor/components/page.cljs

@@ -0,0 +1,63 @@
+(ns capacitor.components.page
+  (:require [capacitor.ionic :as ion]
+            [capacitor.state :as state]
+            [frontend.components.page :as cp-page]
+            [frontend.db.async :as db-async]
+            [frontend.db.utils :as db-utils]
+            [frontend.handler.page :as page-handler]
+            [frontend.state :as fstate]
+            [promesa.core :as p]
+            [rum.core :as rum]))
+
+(rum/defc page
+  [block & {:keys [reload-pages!]}]
+  (let [[^js nav] (state/use-nav-root)
+        [page set-page!] (rum/use-state (let [eid (or (:db/id block)
+                                                      (when-let [id (:block/uuid block)]
+                                                        [:block/uuid id]))]
+                                          (db-utils/entity eid)))
+        title (or (:block/title block) (:block/title page))
+        [loading? set-loading!] (rum/use-state true)
+        rerender! (fn []
+                    (set-page! (db-utils/entity (:db/id block))))]
+
+    (rum/use-effect!
+      ;; sync page blocks
+     (fn []
+       (-> (db-async/<get-block (fstate/get-current-repo) (:block/uuid block))
+           (p/then #(set-page! (db-utils/entity (:db/id %))))
+           (p/finally #(set-loading! false)))
+       #())
+     [])
+
+    (ion/page
+     (ion/header
+      (ion/toolbar
+       (ion/buttons {:slot "start"}
+                    (ion/button {:fill "clear"
+                                 :on-click #(.pop nav)}
+                                (ion/tabler-icon "arrow-left" {:size 26})))
+
+       (ion/buttons {:slot "end"}
+                    (ion/button {:fill "clear"
+                                 :class "opacity-80"
+                                 :on-click rerender!}
+                                (ion/tabler-icon "refresh" {:size 26}))
+                    (ion/button {:fill "clear"
+                                 :class "opacity-80 text-red-500"
+                                 :on-click (fn []
+                                             (page-handler/<delete! (:block/uuid block)
+                                                                    (fn []
+                                                                      (.pop nav)
+                                                                      (when (fn? reload-pages!)
+                                                                        (reload-pages!)))
+                                                                    {:error-handler (fn [^js e]
+                                                                                      (js/console.error e))}))}
+                                (ion/tabler-icon "trash" {:size 26})))
+
+       (ion/title title)))
+
+     (ion/content {:class "ion-padding"}
+                  (if loading?
+                    [:p.text-xl.text-center "Loading ..."]
+                    (cp-page/page-blocks-cp page {}))))))

+ 2 - 78
src/main/capacitor/components/settings.cljs

@@ -1,86 +1,10 @@
 (ns capacitor.components.settings
 (ns capacitor.components.settings
-  (:require [capacitor.components.nav-utils :as cc-util]
-            [capacitor.handler :as handler]
-            [capacitor.ionic :as ion]
+  (:require [capacitor.ionic :as ion]
             [capacitor.state :as state]
             [capacitor.state :as state]
-            [promesa.core :as p]
             [rum.core :as rum]))
             [rum.core :as rum]))
 
 
-(rum/defc create-page-input
-  [{:keys [close! reload-pages!]}]
-  (ion/alert
-   {:is-open true
-    :header "Create new page"
-    :onWillDismiss (fn [^js e]
-                     (let [^js detail (.-detail e)]
-                       (when-let [val (and (= "confirm" (.-role detail))
-                                           (aget (.-values (.-data detail)) 0))]
-                         (-> (handler/<create-page! val)
-                             (p/finally reload-pages!)))
-                       (close!)))
-    :onDidPresent (fn [^js e]
-                    (let [^js target (.-target e)]
-                      (when-let [input (.querySelector target "input")]
-                        (js/setTimeout #(.focus input)))))
-    :buttons [#js {:text "Cancel"
-                   :role "cancel"}
-              #js {:text "Confirm"
-                   :role "confirm"}]
-    :inputs [#js {:placeholder "page name"
-                  :auto-focus true}]}))
-
 (rum/defc all-pages
 (rum/defc all-pages
-  []
-  (let [[all-pages set-all-pages!] (rum/use-state [])
-        [filtered-pages set-filtered-pages!] (rum/use-state [])
-        [reload set-reload!] (rum/use-state 0)
-        [page-input-open? set-page-input-open?] (rum/use-state false)]
-
-    (rum/use-effect!
-     (fn []
-       (set-all-pages! (handler/local-all-pages))
-       #())
-     [reload])
-
-    (rum/use-effect!
-     (fn []
-       (let [pages (filterv (fn [page]
-                              (let [ident (some-> (:block/tags page) first :db/ident)]
-                                (not (contains? #{:logseq.class/Journal :logseq.class/Property} ident))))
-                            all-pages)]
-         (set-filtered-pages! pages))
-       #())
-     [all-pages])
-
-    [:<>
-     (when page-input-open?
-       (create-page-input {:close! #(set-page-input-open? false)
-                           :reload-pages! #(set-reload! (inc reload))}))
-     [:div.flex.flex-col
-      [:div.flex.justify-between.items-center.pt-4
-       [:h1.text-3xl.font-mono.font-bold.py-2
-        "All pages"
-        [:small.text-xs.pl-2.opacity-50 (count filtered-pages)]]
-
-       [:div.flex.gap-1
-        (ion/button {:size "small" :fill "clear" :on-click #(set-page-input-open? true)}
-                    [:span {:slot "icon-only"} (ion/tabler-icon "file-plus" {:size 22})])
-        ;(ionic/ion-button {:size "small" :fill "clear" :on-click #(set-reload! (inc reload))}
-        ;  [:span {:slot "icon-only"} (ionic/tabler-icon "refresh")])
-        ]]
-
-      [:ul.mb-24.pt-2
-       (for [page filtered-pages]
-         (let [ident (some-> (:block/tags page) first :db/ident)]
-           [:li.font-mono.flex.items-center.py-1.active:opacity-50.active:underline.whitespace-nowrap
-            {:on-click #(cc-util/nav-to-block! page {:reload-pages! (fn [] (set-reload! (inc reload)))})}
-            (case ident
-              :logseq.class/Property (ion/tabler-icon "letter-t")
-              :logseq.class/Page (ion/tabler-icon "file")
-              :logseq.class/Journal (ion/tabler-icon "calendar")
-              (ion/tabler-icon "hash"))
-            [:span.pl-1 (:block/title page)]
-            [:code.opacity-30.scale-75 (.toLocaleDateString (js/Date. (:block/created-at page)))]]))]]]))
+  [])
 
 
 (rum/defc page
 (rum/defc page
   []
   []

+ 0 - 3
src/main/capacitor/components/ui.cljs

@@ -4,15 +4,12 @@
             [frontend.handler.notification :as notification]
             [frontend.handler.notification :as notification]
             [frontend.rum :as r]
             [frontend.rum :as r]
             [frontend.state :as fstate]
             [frontend.state :as fstate]
-            [goog.object :as gobj]
             [medley.core :as medley]
             [medley.core :as medley]
-            [react-textarea-autosize :as TextareaAutosize]
             [react-transition-group :refer [CSSTransition TransitionGroup]]
             [react-transition-group :refer [CSSTransition TransitionGroup]]
             [rum.core :as rum]))
             [rum.core :as rum]))
 
 
 (defonce transition-group (r/adapt-class TransitionGroup))
 (defonce transition-group (r/adapt-class TransitionGroup))
 (defonce css-transition (r/adapt-class CSSTransition))
 (defonce css-transition (r/adapt-class CSSTransition))
-(defonce textarea (r/adapt-class (gobj/get TextareaAutosize "default")))
 
 
 (rum/defc safe-page-container
 (rum/defc safe-page-container
   [content {:keys [header-content page-props content-props]}]
   [content {:keys [header-content page-props content-props]}]

+ 3 - 5
src/main/capacitor/core.cljs

@@ -1,10 +1,9 @@
 (ns capacitor.core
 (ns capacitor.core
   (:require ["react-dom/client" :as rdc]
   (:require ["react-dom/client" :as rdc]
-            [capacitor.app :as app]
-            [capacitor.components.nav-utils :as cc-utils]
+            [capacitor.components.app :as app]
+            [capacitor.nav :as nav]
             [frontend.components.page :as page]
             [frontend.components.page :as page]
             [frontend.components.user.login :as login]
             [frontend.components.user.login :as login]
-            ;[capacitor.bootstrap :as bootstrap]
             [frontend.handler :as fhandler]
             [frontend.handler :as fhandler]
             [frontend.handler.route :as route-handler]
             [frontend.handler.route :as route-handler]
             [frontend.util :as util]
             [frontend.util :as util]
@@ -40,7 +39,7 @@
        (let [id-str (get-in route [:path-params :name])]
        (let [id-str (get-in route [:path-params :name])]
          (when (util/uuid-string? id-str)
          (when (util/uuid-string? id-str)
            (let [page-uuid (uuid id-str)]
            (let [page-uuid (uuid id-str)]
-             (cc-utils/nav-to-block! {:block/uuid page-uuid} nil))))
+             (nav/nav-to-block! {:block/uuid page-uuid} nil))))
        :user-login
        :user-login
        nil
        nil
        nil))
        nil))
@@ -53,7 +52,6 @@
   ;; this is called in the index.html and must be exported
   ;; this is called in the index.html and must be exported
   ;; so it is available even in :advanced release builds
   ;; so it is available even in :advanced release builds
   (prn "[capacitor-new] init!")
   (prn "[capacitor-new] init!")
-  ;(bootstrap/start! render!)
   (set-router!)
   (set-router!)
   (fhandler/start! render!))
   (fhandler/start! render!))
 
 

+ 0 - 85
src/main/capacitor/events.cljs

@@ -1,85 +0,0 @@
-(ns capacitor.events
-  (:require [cljs.core.async :as async]
-            [frontend.db.transact :as db-transact]
-            [frontend.handler.notification :as notification]
-            [frontend.handler.repo :as repo-handler]
-            [frontend.modules.outliner.pipeline :as pipeline]
-            [frontend.state :as state]
-            [logseq.db :as ldb]
-            [frontend.db :as db]
-            [datascript.core :as d]
-            [frontend.handler.page :as page-handler]
-            [promesa.core :as p]))
-
-(defmulti handle first)
-
-(defmethod handle :db/sync-changes [[_ data]]
-  (let [retract-datoms (filter (fn [d] (and (= :block/uuid (:a d)) (false? (:added d)))) (:tx-data data))
-        retracted-tx-data (map (fn [d] [:db/retractEntity (:e d)]) retract-datoms)
-        tx-data (concat (:tx-data data) retracted-tx-data)]
-    (pipeline/invoke-hooks (assoc data :tx-data tx-data))
-
-    nil))
-
-;(defn- graph-switch
-;  ([graph]
-;   (graph-switch graph false))
-;  ([graph skip-ios-check?]
-;   (let [db-based? (config/db-based-graph? graph)]
-;     (if (and (mobile-util/native-ios?) (not skip-ios-check?))
-;       (state/pub-event! [:validate-appId graph-switch graph])
-;       (do
-;         (state/set-current-repo! graph)
-;         (page-handler/init-commands!)
-;         ;; load config
-;         (repo-config-handler/restore-repo-config! graph)
-;         (when-not (= :draw (state/get-current-route))
-;           (route-handler/redirect-to-home!))
-;         (when-not db-based?
-;           ;; graph-switch will trigger a rtc-start automatically
-;           ;; (rtc-handler/<rtc-start! graph)
-;           (file-sync-restart!))
-;         (when-let [dir-name (and (not db-based?) (config/get-repo-dir graph))]
-;           (fs/watch-dir! dir-name))
-;         (graph-handler/settle-metadata-to-local! {:last-seen-at (js/Date.now)}))))))
-
-(defn- graph-switch-on-persisted
-  "graph: the target graph to switch to"
-  [graph opts]
-  (p/do!
-    (repo-handler/restore-and-setup-repo! graph {:ignore-style? true})
-    (state/set-current-repo! graph)))
-
-(defmethod handle :graph/switch [[_ graph opts]]
-  (state/set-state! :db/async-queries {})
-
-  (p/let [writes-finished? (state/<invoke-db-worker :thread-api/file-writes-finished? (state/get-current-repo))]
-    (if (not writes-finished?)
-      (notification/show!
-        "Please wait seconds until all changes are saved for the current graph."
-        :warning)
-      (graph-switch-on-persisted graph opts))))
-
-(defmethod handle :default [[k]]
-  (prn "[skip handle] " k))
-
-(defn run!
-  []
-  (let [chan (state/get-events-chan)]
-    (async/go-loop []
-      (let [[payload d] (async/<! chan)]
-        (->
-          (try
-            (p/resolved (handle payload))
-            (catch :default error
-              (p/rejected error)))
-          (p/then (fn [result]
-                    (p/resolve! d result)))
-          (p/catch (fn [error]
-                     (let [type :handle-system-events/failed]
-                       (state/pub-event! [:capture-error {:error error
-                                                          :payload {:type type
-                                                                    :payload payload}}])
-                       (p/reject! d error))))))
-      (recur))
-    chan))

+ 0 - 16
src/main/capacitor/externals.js

@@ -63,24 +63,8 @@ const settleStatusBar = async () => {
   }
   }
 }
 }
 
 
-function checkCursorLine (textarea) {
-  const { value, selectionStart } = textarea
-
-  const lines = value.split('\n')
-  const totalLines = lines.length
-
-  const textBeforeCursor = value.substring(0, selectionStart)
-  const currentLine = textBeforeCursor.split('\n').length
-
-  const isFirstLine = currentLine === 1
-  const isLastLine = currentLine === totalLines
-
-  return { isFirstLine, isLastLine, currentLine, totalLines }
-}
-
 window.externalsjs = {
 window.externalsjs = {
   Keyboard, Capacitor,
   Keyboard, Capacitor,
   initGlobalListeners,
   initGlobalListeners,
   settleStatusBar,
   settleStatusBar,
-  checkCursorLine,
 }
 }

+ 0 - 43
src/main/capacitor/handler.cljs

@@ -1,43 +0,0 @@
-(ns capacitor.handler
-  (:require [frontend.db.react :as react]
-            [frontend.util :as util]
-            [logseq.db :as ldb]
-            [frontend.db.conn :as db-conn]
-            [frontend.state :as fstate]
-            [frontend.date :as date]
-            [frontend.handler.repo :as repo-handler]
-            [frontend.handler.page :as page-handler]
-            [frontend.handler.editor :as editor-handler]
-            [frontend.db.utils :as db-util]
-            [frontend.handler.notification :as notification]
-            [lambdaisland.glogi :as log]
-            [promesa.core :as p]))
-
-(defn <load-view-data
-  [view opts]
-  (fstate/<invoke-db-worker :thread-api/get-view-data
-    (fstate/get-current-repo) (:db/id view) opts))
-
-(defn local-db []
-  (db-conn/get-db))
-
-(defn local-all-pages []
-  (some->> (local-db) (ldb/get-all-pages) (sort-by :block/created-at) (reverse)))
-
-(defn local-page [name]
-  (ldb/get-page (local-db) name))
-
-(defn sub-journals
-  []
-  (-> (react/q (fstate/get-current-repo)
-        [:frontend.worker.react/journals]
-        {:query-fn
-         (fn []
-           (p/let [{:keys [data]} (<load-view-data nil {:journals? true})]
-             (remove nil? data)))}
-        nil)
-    util/react))
-
-(defn <create-page!
-  [page-name]
-  (page-handler/<create! page-name {:redirect? false}))

+ 0 - 2
src/main/capacitor/hooks.cljs

@@ -1,2 +0,0 @@
-(ns capacitor.hooks
-  (:require [rum.core :as rum]))

+ 3 - 7
src/main/capacitor/components/nav_utils.cljs → src/main/capacitor/nav.cljs

@@ -1,6 +1,6 @@
-(ns capacitor.components.nav-utils
+(ns capacitor.nav
   (:require [capacitor.state :as state]
   (:require [capacitor.state :as state]
-            [capacitor.components.blocks :as cc-blocks]
+            [capacitor.components.page :as page]
             [cljs-bean.core :as bean]))
             [cljs-bean.core :as bean]))
 
 
 ;; https://ionicframework.com/docs/api/nav#push
 ;; https://ionicframework.com/docs/api/nav#push
@@ -17,8 +17,4 @@
 
 
 (defn nav-to-block!
 (defn nav-to-block!
   [page-or-block opts]
   [page-or-block opts]
-  (nav-push! #(cc-blocks/page page-or-block opts)))
-
-(defn nav-to-edit-block!
-  [block opts]
-  (nav-push! #(cc-blocks/edit-block-modal block opts)))
+  (nav-push! #(page/page page-or-block opts)))

+ 1 - 59
src/main/capacitor/state.cljs

@@ -1,64 +1,6 @@
 (ns capacitor.state
 (ns capacitor.state
-  (:require [frontend.rum :as r]
-            [frontend.util :as util]))
+  (:require [frontend.rum :as r]))
 
 
 (defonce *nav-root (atom nil))
 (defonce *nav-root (atom nil))
-(defonce *state
-  (atom {:version 0
-         :editing-block nil
-         :editing-opts nil
-         :modified-pages {}
-         :modified-blocks {}                                ;; {:uuid timestamp}
-         }))
 
 
 (defn use-nav-root [] (r/use-atom *nav-root))
 (defn use-nav-root [] (r/use-atom *nav-root))
-
-(defn use-app-state
-  ([] (r/use-atom *state))
-  ([ks] (r/use-atom-in *state ks)))
-
-(defn set-state!
-  [path value & {:keys [path-in-sub-atom]}]
-  (let [path-coll? (coll? path)
-        get-fn (if path-coll? get-in get)
-        s (get-fn @*state path)
-        s-atom? (util/atom? s)
-        path-coll?-in-sub-atom (coll? path-in-sub-atom)]
-    (cond
-      (and s-atom? path-in-sub-atom path-coll?-in-sub-atom)
-      (let [old-v (get-in @s path-in-sub-atom)]
-        (when (not= old-v value)
-          (swap! s assoc-in path-in-sub-atom value)))
-
-      (and s-atom? path-in-sub-atom)
-      (let [old-v (get @s path-in-sub-atom)]
-        (when (not= old-v value)
-          (swap! s assoc path-in-sub-atom value)))
-
-      s-atom?
-      (when (not= @s value)
-        (reset! s value))
-
-      path-coll?
-      (when (not= s value)
-        (swap! *state assoc-in path value))
-
-      :else
-      (when (not= s value)
-        (swap! *state assoc path value))))
-  nil)
-
-(defn get-editing-block []
-  (:editing-block @*state))
-
-(defn edit-block!
-  ([block] (edit-block! block nil))
-  ([block opts]
-   (set-state! :editing-block block)
-   (set-state! :editing-opts opts)))
-
-(defn exit-editing! []
-  (edit-block! nil nil))
-
-(defn get-editing-opts []
-  (:editing-opts @*state))

+ 11 - 6
src/main/frontend/util.cljc

@@ -6,7 +6,6 @@
             ["/frontend/selection" :as selection]
             ["/frontend/selection" :as selection]
             ["/frontend/utils" :as utils]
             ["/frontend/utils" :as utils]
             ["@capacitor/status-bar" :refer [^js StatusBar Style]]
             ["@capacitor/status-bar" :refer [^js StatusBar Style]]
-            ["@capgo/capacitor-navigation-bar" :refer [^js NavigationBar]]
             ["grapheme-splitter" :as GraphemeSplitter]
             ["grapheme-splitter" :as GraphemeSplitter]
             ["sanitize-filename" :as sanitizeFilename]
             ["sanitize-filename" :as sanitizeFilename]
             ["check-password-strength" :refer [passwordStrength]]
             ["check-password-strength" :refer [passwordStrength]]
@@ -19,7 +18,6 @@
             [clojure.pprint]
             [clojure.pprint]
             [dommy.core :as d]
             [dommy.core :as d]
             [frontend.mobile.util :as mobile-util]
             [frontend.mobile.util :as mobile-util]
-            [capacitor.components.common :as capacitor-new-common]
             [logseq.common.util :as common-util]
             [logseq.common.util :as common-util]
             [goog.dom :as gdom]
             [goog.dom :as gdom]
             [goog.object :as gobj]
             [goog.object :as gobj]
@@ -63,7 +61,7 @@
        []
        []
        (let [ua (string/lower-case js/navigator.userAgent)]
        (let [ua (string/lower-case js/navigator.userAgent)]
          (and (string/includes? ua "webkit")
          (and (string/includes? ua "webkit")
-           (not (string/includes? ua "chrome")))))
+              (not (string/includes? ua "chrome")))))
      (def safari? (memoize safari*?))))
      (def safari? (memoize safari*?))))
 
 
 #?(:cljs
 #?(:cljs
@@ -93,17 +91,24 @@
 #?(:cljs (defonce ^js node-path utils/nodePath))
 #?(:cljs (defonce ^js node-path utils/nodePath))
 #?(:cljs (defonce ^js sem-ver semver))
 #?(:cljs (defonce ^js sem-ver semver))
 #?(:cljs (defonce ^js full-path-extname pathCompleteExtname))
 #?(:cljs (defonce ^js full-path-extname pathCompleteExtname))
+#?(:cljs
+   (defn current-page-scroll
+     []
+     (some-> (js/document.querySelector "ion-nav > .ion-page:not(.ion-page-hidden)")
+             (.querySelector "ion-content")
+             (.-shadowRoot)
+             (.querySelector "[part=scroll]"))))
 #?(:cljs (defn app-scroll-container-node
 #?(:cljs (defn app-scroll-container-node
            ([]
            ([]
             (gdom/getElement "main-content-container"))
             (gdom/getElement "main-content-container"))
            ([el]
            ([el]
             (if (capacitor-new?)
             (if (capacitor-new?)
-              (capacitor-new-common/current-page-scroll)
+              (current-page-scroll)
               (if (.closest el "#main-content-container")
               (if (.closest el "#main-content-container")
                 (app-scroll-container-node)
                 (app-scroll-container-node)
                 (or
                 (or
-                  (gdom/getElementByClass "sidebar-item-list")
-                  (app-scroll-container-node)))))))
+                 (gdom/getElementByClass "sidebar-item-list")
+                 (app-scroll-container-node)))))))
 #?(:cljs (defonce el-visible-in-viewport? utils/elementIsVisibleInViewport))
 #?(:cljs (defonce el-visible-in-viewport? utils/elementIsVisibleInViewport))
 #?(:cljs (defonce convert-to-roman utils/convertToRoman))
 #?(:cljs (defonce convert-to-roman utils/convertToRoman))
 #?(:cljs (defonce convert-to-letters utils/convertToLetters))
 #?(:cljs (defonce convert-to-letters utils/convertToLetters))