Skip to content

Commit 37e4f68

Browse files
committed
feat: update view options
1 parent f01cef9 commit 37e4f68

File tree

5 files changed

+43
-17
lines changed

5 files changed

+43
-17
lines changed

docs/snippets/treeView.ts

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export const useDemoTreeView = createSingletonComposable(() => {
1111
'reactive-tree-view',
1212
rootNodes,
1313
{
14+
title: () => `Tree with ${rootNodes.value.length} roots`,
1415
getTreeItem(node) {
1516
return {
1617
label: `Item ${node.data}`,

docs/snippets/webviewView.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,12 @@ export const useDemoWebviewView = createSingletonComposable(() => {
2121

2222
const { postMessage } = useWebviewView(
2323
'reactive-webview-view',
24-
/* html content, can be computed */ html,
25-
/* webviewOptions, can be computed */ {
26-
enableScripts: true,
27-
enableCommandUris: true,
28-
},
29-
/* registerOptions, static */ {
24+
html,
25+
{
26+
webviewOptions: {
27+
enableScripts: true,
28+
enableCommandUris: true,
29+
},
3030
onDidReceiveMessage(ev) {
3131
if (ev.type === 'updateMessage')
3232
message.value = ev.message

packages/core/src/composables/useTreeView.ts

+16-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import type { MaybeRefOrGetter } from '@reactive-vscode/reactivity'
22
import { toValue, watch } from '@reactive-vscode/reactivity'
3-
import type { TreeDataProvider, TreeView, TreeViewOptions } from 'vscode'
3+
import type { TreeDataProvider, TreeView, TreeViewOptions, ViewBadge } from 'vscode'
44
import { EventEmitter, window } from 'vscode'
55
import { createKeyedComposable } from '../utils'
66
import { useDisposable } from './useDisposable'
7+
import { useViewBadge } from './useViewBadge'
8+
import { useViewTitle } from './useViewTitle'
79

810
export interface TreeViewNode {
911
readonly children?: this[]
@@ -13,6 +15,10 @@ export type UseTreeViewOptions<T> =
1315
| (
1416
& Omit<TreeViewOptions<T>, 'treeDataProvider'>
1517
& Pick<TreeDataProvider<T>, 'getTreeItem' | 'resolveTreeItem'>
18+
& {
19+
title?: MaybeRefOrGetter<string | undefined>
20+
badge?: MaybeRefOrGetter<ViewBadge | undefined>
21+
}
1622
)
1723
| TreeDataProvider<T>['getTreeItem']
1824

@@ -34,7 +40,7 @@ export const useTreeView = createKeyedComposable(
3440

3541
const childrenToParentMap = new WeakMap<T, T>()
3642

37-
return useDisposable(window.createTreeView(viewId, {
43+
const view = useDisposable(window.createTreeView(viewId, {
3844
...normalizedOptions,
3945
treeDataProvider: {
4046
...normalizedOptions,
@@ -54,6 +60,14 @@ export const useTreeView = createKeyedComposable(
5460
},
5561
},
5662
}))
63+
64+
if (normalizedOptions?.title)
65+
useViewTitle(view, normalizedOptions.title)
66+
67+
if (normalizedOptions?.badge)
68+
useViewBadge(view, normalizedOptions.badge)
69+
70+
return view
5771
},
5872
viewId => viewId,
5973
)

packages/core/src/composables/useViewBadge.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ type ViewWithBadge = Pick<TreeView<unknown> | WebviewView, 'badge'>
1212
*/
1313
export function useViewBadge(
1414
view: MaybeRefOrGetter<Nullable<ViewWithBadge>>,
15-
title: MaybeRefOrGetter<ViewBadge | undefined>,
15+
badge: MaybeRefOrGetter<ViewBadge | undefined>,
1616
) {
1717
watchEffect(() => {
1818
const viewValue = toValue(view)
1919
if (viewValue)
20-
viewValue.badge = toValue(title)
20+
viewValue.badge = toValue(badge)
2121
})
2222
}

packages/core/src/composables/useWebviewView.ts

+18-7
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
import type { MaybeRefOrGetter } from '@reactive-vscode/reactivity'
22
import { shallowRef, toValue, watchEffect } from '@reactive-vscode/reactivity'
3-
import type { WebviewOptions, WebviewView } from 'vscode'
3+
import type { ViewBadge, WebviewOptions, WebviewView } from 'vscode'
44
import { window } from 'vscode'
55
import { createKeyedComposable } from '../utils'
66
import { useDisposable } from './useDisposable'
7+
import { useViewBadge } from './useViewBadge'
8+
import { useViewTitle } from './useViewTitle'
79

810
type WebviewRegisterOptions = Parameters<typeof window.registerWebviewViewProvider>[2] & {
911
onDidReceiveMessage?: (message: any) => void
12+
webviewOptions?: MaybeRefOrGetter<WebviewOptions>
13+
title?: MaybeRefOrGetter<string | undefined>
14+
badge?: MaybeRefOrGetter<ViewBadge | undefined>
1015
}
1116

1217
/**
@@ -18,32 +23,38 @@ export const useWebviewView = createKeyedComposable(
1823
(
1924
viewId: string,
2025
html: MaybeRefOrGetter<string>,
21-
webviewOptions?: MaybeRefOrGetter<WebviewOptions>,
22-
registerOptions?: WebviewRegisterOptions,
26+
options?: WebviewRegisterOptions,
2327
) => {
2428
const view = shallowRef<WebviewView>()
2529
const context = shallowRef<unknown>()
2630
useDisposable(window.registerWebviewViewProvider(viewId, {
2731
resolveWebviewView(viewArg, contextArg) {
2832
view.value = viewArg
2933
context.value = contextArg
30-
if (registerOptions?.onDidReceiveMessage)
31-
viewArg.webview.onDidReceiveMessage(registerOptions.onDidReceiveMessage)
34+
if (options?.onDidReceiveMessage)
35+
viewArg.webview.onDidReceiveMessage(options.onDidReceiveMessage)
3236
},
33-
}, registerOptions))
37+
}, options))
3438

3539
watchEffect(() => {
3640
if (view.value)
3741
view.value.webview.html = toValue(html)
3842
})
3943

40-
if (webviewOptions) {
44+
if (options?.webviewOptions) {
45+
const webviewOptions = options.webviewOptions
4146
watchEffect(() => {
4247
if (view.value)
4348
view.value.webview.options = toValue(webviewOptions)
4449
})
4550
}
4651

52+
if (options?.title)
53+
useViewTitle(view, options.title)
54+
55+
if (options?.badge)
56+
useViewBadge(view, options.badge)
57+
4758
function postMessage(message: any) {
4859
return view.value?.webview.postMessage(message)
4960
}

0 commit comments

Comments
 (0)