Skip to content

Commit 370e1d5

Browse files
committed
enhance(plugins): add hosted renderer registration and resolution
1 parent 0db7a2d commit 370e1d5

7 files changed

Lines changed: 78 additions & 12 deletions

File tree

libs/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@logseq/libs",
3-
"version": "0.2.12",
3+
"version": "0.3.1",
44
"description": "Logseq SDK libraries",
55
"main": "dist/lsplugin.user.js",
66
"typings": "index.d.ts",

libs/src/modules/LSPlugin.Experiments.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,37 @@ export class LSPluginExperiments {
9595
)
9696
}
9797

98+
registerHostedRenderer(
99+
key: string,
100+
opts: {
101+
title?: string,
102+
subs?: Array<string>
103+
type?: string,
104+
render: (props: {}) => any
105+
}
106+
) {
107+
return this.invokeExperMethod(
108+
'registerHostedRenderer',
109+
this.ctx.baseInfo.id,
110+
key,
111+
opts
112+
)
113+
}
114+
115+
registerSidebarRenderer(
116+
key: string,
117+
opts: {
118+
title?: string,
119+
subs?: Array<string>
120+
render: (props: {}) => any,
121+
[k: string]: any
122+
}
123+
) {
124+
key = `_sidebar.${key}`
125+
opts.type = 'sidebar'
126+
return this.registerHostedRenderer(key, opts)
127+
}
128+
98129
registerRouteRenderer(
99130
key: string,
100131
opts: {

src/main/frontend/components/plugins.cljs

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1591,16 +1591,22 @@
15911591
(rum/defc renderer-resolver < rum/static
15921592
[key']
15931593
(when-let [[pid key] (some-> key' (string/split "."))]
1594-
;; TODO: resolve pid renderer from registered plugins
1595-
(let [pid (or pid "UnknownPlugin")
1596-
render (if (not (string/blank? key))
1597-
(fn [opts]
1598-
[:div.p-6
1599-
[:h2.bold.text-lg "Renderer for key: " key]
1600-
[:p "Plugin ID: " pid]
1601-
[:pre (pr-str opts)]])
1602-
#(do [:div "No renderer found for key: " key]))]
1603-
(renderer-container {:key key :pid pid :render render}))))
1594+
(let [[renderer set-renderer!] (rum/use-state nil)]
1595+
1596+
(hooks/use-effect!
1597+
(fn []
1598+
(try
1599+
(when-let [renderer (plugin-handler/resolve-hosted-render pid key :sidebar)]
1600+
(let [r (bean/->clj renderer)
1601+
title (:title r)]
1602+
(when-let [^js dom (and title (js/document.getElementById key'))]
1603+
(set! (. dom -textContent) title))
1604+
(set-renderer! r)))
1605+
(catch js/Error e (js/console.error "Failed to resolve renderer:" key' e))))
1606+
[pid key])
1607+
1608+
(when renderer
1609+
(renderer-container renderer)))))
16041610

16051611
(defn hook-custom-routes
16061612
[routes]

src/main/frontend/components/plugins.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -975,3 +975,7 @@ body[data-page=plugins] {
975975
padding-right: 30px;
976976
}
977977
}
978+
979+
.lsp-host-renderer-container {
980+
user-select: text;
981+
}

src/main/frontend/components/right_sidebar.cljs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@
138138
:plugin
139139
[[:.flex.items-center.page-title
140140
(ui/icon "puzzle" {:class "text-md mr-2"})
141-
(str db-id)]
141+
[:h3 {:id db-id} (str db-id)]]
142142
(plugins/renderer-resolver db-id)]
143143

144144
:search

src/main/frontend/handler/plugin.cljs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,24 @@
495495
(create-local-renderer-getter
496496
:daemon-renderers *daemon-renderer-providers true))
497497

498+
(defonce *hosted-renderer-providers (atom #{}))
499+
(def register-hosted-renderer
500+
;; [pid key payload]
501+
(create-local-renderer-register
502+
:hosted-renderers *hosted-renderer-providers))
503+
(def get-hosted-renderers
504+
;; [key]
505+
(create-local-renderer-getter
506+
:hosted-renderers *hosted-renderer-providers true))
507+
508+
(defn resolve-hosted-render
509+
[pid key type]
510+
(some->> (get-hosted-renderers)
511+
(medley/find-first #(and (some-> (:pid %) (name) (= pid))
512+
(or (some-> (:key %) (name) (= key))
513+
(some-> (:key %) (str) (string/includes? (str "." key))))
514+
(some->> type (name) (= (:type %)))))))
515+
498516
(defn select-a-plugin-theme
499517
[pid]
500518
(when-let [themes (get (group-by :pid (:plugin/installed-themes @state/state)) pid)]

src/main/logseq/sdk/experiments.cljs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,13 @@
3939
(keyword pid) key (reduce #(assoc %1 %2 (aget opts (name %2))) {}
4040
[:before :subs :render]))))
4141

42+
(defn ^:export register_hosted_renderer
43+
[pid key ^js opts]
44+
(when-let [^js _pl (plugin-handler/get-plugin-inst pid)]
45+
(plugin-handler/register-hosted-renderer
46+
(keyword pid) key (reduce #(assoc %1 %2 (aget opts (name %2))) {}
47+
[:title :type :mode :subs :render]))))
48+
4249
(defn ^:export register_extensions_enhancer
4350
[pid type enhancer]
4451
(when-let [^js _pl (and (fn? enhancer) (plugin-handler/get-plugin-inst pid))]

0 commit comments

Comments
 (0)