1
1
import type { MaybeRefOrGetter } from '@reactive-vscode/reactivity'
2
2
import { shallowRef , toValue , watchEffect } from '@reactive-vscode/reactivity'
3
- import type { WebviewOptions , WebviewView } from 'vscode'
3
+ import type { ViewBadge , WebviewOptions , WebviewView } from 'vscode'
4
4
import { window } from 'vscode'
5
5
import { createKeyedComposable } from '../utils'
6
6
import { useDisposable } from './useDisposable'
7
+ import { useViewBadge } from './useViewBadge'
8
+ import { useViewTitle } from './useViewTitle'
7
9
8
10
type WebviewRegisterOptions = Parameters < typeof window . registerWebviewViewProvider > [ 2 ] & {
9
11
onDidReceiveMessage ?: ( message : any ) => void
12
+ webviewOptions ?: MaybeRefOrGetter < WebviewOptions >
13
+ title ?: MaybeRefOrGetter < string | undefined >
14
+ badge ?: MaybeRefOrGetter < ViewBadge | undefined >
10
15
}
11
16
12
17
/**
@@ -18,32 +23,38 @@ export const useWebviewView = createKeyedComposable(
18
23
(
19
24
viewId : string ,
20
25
html : MaybeRefOrGetter < string > ,
21
- webviewOptions ?: MaybeRefOrGetter < WebviewOptions > ,
22
- registerOptions ?: WebviewRegisterOptions ,
26
+ options ?: WebviewRegisterOptions ,
23
27
) => {
24
28
const view = shallowRef < WebviewView > ( )
25
29
const context = shallowRef < unknown > ( )
26
30
useDisposable ( window . registerWebviewViewProvider ( viewId , {
27
31
resolveWebviewView ( viewArg , contextArg ) {
28
32
view . value = viewArg
29
33
context . value = contextArg
30
- if ( registerOptions ?. onDidReceiveMessage )
31
- viewArg . webview . onDidReceiveMessage ( registerOptions . onDidReceiveMessage )
34
+ if ( options ?. onDidReceiveMessage )
35
+ viewArg . webview . onDidReceiveMessage ( options . onDidReceiveMessage )
32
36
} ,
33
- } , registerOptions ) )
37
+ } , options ) )
34
38
35
39
watchEffect ( ( ) => {
36
40
if ( view . value )
37
41
view . value . webview . html = toValue ( html )
38
42
} )
39
43
40
- if ( webviewOptions ) {
44
+ if ( options ?. webviewOptions ) {
45
+ const webviewOptions = options . webviewOptions
41
46
watchEffect ( ( ) => {
42
47
if ( view . value )
43
48
view . value . webview . options = toValue ( webviewOptions )
44
49
} )
45
50
}
46
51
52
+ if ( options ?. title )
53
+ useViewTitle ( view , options . title )
54
+
55
+ if ( options ?. badge )
56
+ useViewBadge ( view , options . badge )
57
+
47
58
function postMessage ( message : any ) {
48
59
return view . value ?. webview . postMessage ( message )
49
60
}
0 commit comments