Преглед изворни кода

improve(plugin): add sidebar-open? hook & insert block api

charlie пре 4 година
родитељ
комит
33dc32a6e8

+ 5 - 3
libs/src/LSPlugin.d.ts

@@ -1,5 +1,5 @@
 import EventEmitter from 'eventemitter3'
 import EventEmitter from 'eventemitter3'
-import * as CSS from 'csstype';
+import * as CSS from 'csstype'
 import { LSPluginCaller } from './LSPlugin.caller'
 import { LSPluginCaller } from './LSPlugin.caller'
 import { LSPluginUser } from './LSPlugin.user'
 import { LSPluginUser } from './LSPlugin.user'
 
 
@@ -115,10 +115,11 @@ interface IAppProxy {
   setZoomFactor: (factor: number) => void
   setZoomFactor: (factor: number) => void
 
 
   // events
   // events
-  onThemeModeChanged: IUserHook
+  onThemeModeChanged: IUserHook<{ mode: 'dark' | 'light' }>
   onPageFileMounted: IUserSlotHook
   onPageFileMounted: IUserSlotHook
-  onBlockRendererMounted: IUserSlotHook
+  onBlockRendererMounted: IUserSlotHook<{ uuid: BlockUUID }>
   onRouteChanged: IUserHook<{ path: string, template: string }>
   onRouteChanged: IUserHook<{ path: string, template: string }>
+  onSidebarVisibleChanged: IUserHook<{ visible: boolean }>
 }
 }
 
 
 interface IEditorProxy {
 interface IEditorProxy {
@@ -126,6 +127,7 @@ interface IEditorProxy {
   registerBlockContextMenu: (this: LSPluginUser, tag: string, action: () => void) => boolean
   registerBlockContextMenu: (this: LSPluginUser, tag: string, action: () => void) => boolean
 
 
   // TODO: Block related APIs
   // TODO: Block related APIs
+  getCurrentPage: () => Promise<Partial<BlockEntity>>
   getCurrentBlock: () => Promise<BlockEntity>
   getCurrentBlock: () => Promise<BlockEntity>
   getCurrentPageBlocksTree: <T = any> () => Promise<T>
   getCurrentPageBlocksTree: <T = any> () => Promise<T>
 
 

+ 1 - 0
src/main/frontend/components/sidebar.cljs

@@ -305,6 +305,7 @@
         :route         route-match
         :route         route-match
         :nfs-granted?  granted?
         :nfs-granted?  granted?
         :db-restoring? db-restoring?
         :db-restoring? db-restoring?
+        :sidebar-open? sidebar-open?
         :on-click      editor-handler/unhighlight-blocks!}
         :on-click      editor-handler/unhighlight-blocks!}
 
 
        [:div.theme-inner
        [:div.theme-inner

+ 6 - 2
src/main/frontend/components/theme.cljs

@@ -6,7 +6,7 @@
             [frontend.components.svg :as svg]))
             [frontend.components.svg :as svg]))
 
 
 (rum/defc container
 (rum/defc container
-  [{:keys [route theme on-click nfs-granted? db-restoring?] :as props} child]
+  [{:keys [route theme on-click nfs-granted? db-restoring? sidebar-open?] :as props} child]
   (rum/use-effect!
   (rum/use-effect!
    #(let [doc js/document.documentElement
    #(let [doc js/document.documentElement
           cls (.-classList doc)]
           cls (.-classList doc)]
@@ -14,9 +14,13 @@
       (if (= theme "dark")                                 ;; for tailwind dark mode
       (if (= theme "dark")                                 ;; for tailwind dark mode
         (.add cls "dark")
         (.add cls "dark")
         (.remove cls "dark"))
         (.remove cls "dark"))
-      (plugin-handler/hook-plugin-app :theme-mode-changed theme nil))
+      (plugin-handler/hook-plugin-app :theme-mode-changed {:mode theme} nil))
    [theme])
    [theme])
 
 
+  (rum/use-effect!
+   #(plugin-handler/hook-plugin-app :sidebar-visible-changed {:visible sidebar-open?})
+   [sidebar-open?])
+
   (rum/use-effect!
   (rum/use-effect!
    #(let [db-restored? (false? db-restoring?)]
    #(let [db-restored? (false? db-restoring?)]
       (if db-restoring?
       (if db-restoring?

+ 3 - 2
src/main/frontend/handler/plugin.cljs

@@ -89,8 +89,9 @@
     (js-invoke js/LSPluginCore
     (js-invoke js/LSPluginCore
                (str "hook" (string/capitalize (name tag)))
                (str "hook" (string/capitalize (name tag)))
                (name type)
                (name type)
-               (if (map? payload)
-                 (bean/->js (into {} (for [[k v] payload] [(csk/->camelCase k) (if (uuid? v) (str v) v)]))))
+               (if (coll? payload)
+                 (bean/->js (into {} (for [[k v] payload] [(csk/->camelCase k) (if (uuid? v) (str v) v)])))
+                 payload)
                (if (keyword? plugin-id) (name plugin-id) plugin-id))))
                (if (keyword? plugin-id) (name plugin-id) plugin-id))))
 
 
 (defn hook-plugin-app
 (defn hook-plugin-app

+ 23 - 8
src/main/logseq/api.cljs

@@ -3,6 +3,7 @@
             [frontend.db.model :as db-model]
             [frontend.db.model :as db-model]
             [frontend.db.utils :as db-utils]
             [frontend.db.utils :as db-utils]
             [frontend.handler.block :as block-handler]
             [frontend.handler.block :as block-handler]
+            [frontend.handler.editor :as editor-handler]
             [frontend.modules.outliner.tree :as outliner-tree]
             [frontend.modules.outliner.tree :as outliner-tree]
             [frontend.util :as util]
             [frontend.util :as util]
             [electron.ipc :as ipc]
             [electron.ipc :as ipc]
@@ -16,6 +17,7 @@
             [frontend.handler.plugin :as plugin-handler]
             [frontend.handler.plugin :as plugin-handler]
             [frontend.handler.notification :as notification]
             [frontend.handler.notification :as notification]
             [datascript.core :as d]
             [datascript.core :as d]
+            [medley.core :as medley]
             [frontend.fs :as fs]
             [frontend.fs :as fs]
             [clojure.string :as string]
             [clojure.string :as string]
             [clojure.walk :as walk]
             [clojure.walk :as walk]
@@ -46,13 +48,13 @@
 (def ^:export get_user_configs
 (def ^:export get_user_configs
   (fn []
   (fn []
     (bean/->js
     (bean/->js
-      (normalize-keyword-for-json
-        {:preferred-language (:preferred-language @state/state)
-         :preferred-format   (state/get-preferred-format)
-         :preferred-workflow (state/get-preferred-workflow)
-         :preferred-todo     (state/get-preferred-todo)
-         :current-graph (state/get-current-repo)
-         :me (state/get-me)}))))
+     (normalize-keyword-for-json
+      {:preferred-language (:preferred-language @state/state)
+       :preferred-format   (state/get-preferred-format)
+       :preferred-workflow (state/get-preferred-workflow)
+       :preferred-todo     (state/get-preferred-todo)
+       :current-graph (state/get-current-repo)
+       :me (state/get-me)}))))
 
 
 (def ^:export show_themes
 (def ^:export show_themes
   (fn []
   (fn []
@@ -150,9 +152,22 @@
 ;; editor
 ;; editor
 (def ^:export get_current_block
 (def ^:export get_current_block
   (fn []
   (fn []
-    (when-let [block (state/get-edit-block)]
+    (let [block (state/get-edit-block)
+          block (or block (state/get-last-edit-block))]
       (bean/->js (normalize-keyword-for-json block)))))
       (bean/->js (normalize-keyword-for-json block)))))
 
 
+(def ^:export get_current_page
+  (fn []
+    (when-let [page (state/get-current-page)]
+      (when-let [page (db-model/get-page page)]
+        (bean/->js (normalize-keyword-for-json (db-utils/pull (:db/id page))))))))
+
+(def ^:export insert_block
+  (fn [block-uuid content ^js opts]
+    (when-let [block-uuid (and block-uuid (medley/uuid block-uuid))]
+      (let [{:keys [before sibling props]} (bean/->clj opts)]
+        (editor-handler/api-insert-new-block! content {:block-uuid block-uuid :sibling? sibling})))))
+
 (def ^:export get_block
 (def ^:export get_block
   (fn [id-or-uuid]
   (fn [id-or-uuid]
     (when-let [ret (cond
     (when-let [ret (cond