11import * as vscode from 'vscode' ;
22
33import type { Projects } from '../projects/index.js' ;
4- import { type ViewMessage } from '../types.js' ;
4+ import type { GlobalStoreMessage , ViewMessage } from '../types.js' ;
55import { BaseWebview } from '../webview.js' ;
66
77export interface EditorWebviewArgs {
@@ -26,57 +26,89 @@ export abstract class BaseEditor extends BaseWebview<EditorWebviewArgs> implemen
2626 _token : vscode . CancellationToken
2727 ) : void | Thenable < void > {
2828 const disposables : vscode . Disposable [ ] = [ ] ;
29+ const webview = webviewPanel . webview ;
2930
3031 // Render webview
31- webviewPanel . webview . options = {
32+ webview . options = {
3233 enableScripts : true
3334 } ;
34- webviewPanel . webview . html = this . getHtmlForWebview ( webviewPanel . webview , { document} ) ;
35+ webview . html = this . getHtmlForWebview ( webview , { document} ) ;
3536
3637 // Add message listener
37- webviewPanel . webview . onDidReceiveMessage ( this . onDidReceiveMessage . bind ( this , document , webviewPanel . webview ) ) ;
38+ webview . onDidReceiveMessage ( this . onDidReceiveMessage . bind ( this , document , webview ) ) ;
3839
3940 // Add text document listener
4041 disposables . push (
4142 vscode . workspace . onDidChangeTextDocument ( ( event ) => {
4243 if ( event . document . uri . toString ( ) === document . uri . toString ( ) ) {
43- this . update ( document , webviewPanel . webview , true ) ;
44+ this . update ( document , webview , true ) ;
4445 }
4546 } )
4647 ) ;
4748 disposables . push (
4849 vscode . workspace . onDidSaveTextDocument ( ( event ) => {
4950 if ( event . uri . toString ( ) === document . uri . toString ( ) ) {
50- this . onSave ( document , webviewPanel . webview ) ;
51+ this . onSave ( document , webview ) ;
5152 }
5253 } )
5354 ) ;
5455
5556 // Create file system watcher
5657 const watcher = vscode . workspace . createFileSystemWatcher ( document . uri . fsPath ) ;
57- watcher . onDidCreate ( ( ) => this . update ( document , webviewPanel . webview , true ) ) ;
58- watcher . onDidChange ( ( ) => this . update ( document , webviewPanel . webview , true ) ) ;
59- watcher . onDidDelete ( ( ) => this . update ( document , webviewPanel . webview , true ) ) ;
58+ watcher . onDidCreate ( ( ) => this . update ( document , webview , true ) ) ;
59+ watcher . onDidChange ( ( ) => this . update ( document , webview , true ) ) ;
60+ watcher . onDidDelete ( ( ) => this . update ( document , webview , true ) ) ;
6061 disposables . push ( watcher ) ;
6162
6263 // Add dispose listener
6364 webviewPanel . onDidDispose ( ( ) => {
65+ this . onClose ( document , webview ) ;
66+
6467 for ( const disposable of disposables ) {
6568 disposable . dispose ( ) ;
6669 }
6770 } ) ;
6871
6972 // Update document
70- this . update ( document , webviewPanel . webview , false ) ;
73+ this . update ( document , webview , false ) ;
7174 }
7275
73- protected abstract onDidReceiveMessage (
74- document : vscode . TextDocument ,
76+ protected async onDidReceiveMessage (
77+ _document : vscode . TextDocument ,
7578 webview : vscode . Webview ,
76- message : ViewMessage
77- ) : void ;
79+ message : ViewMessage | GlobalStoreMessage
80+ ) : Promise < boolean > {
81+ if ( message . type === 'globalStore' ) {
82+ if ( message . action === 'set' ) {
83+ await this . context . globalState . update ( message . name , message . value ) ;
84+ const response : GlobalStoreMessage = {
85+ type : 'globalStore' ,
86+ action : 'result' ,
87+ transaction : message . transaction
88+ } ;
89+ await webview . postMessage ( response ) ;
90+
91+ return true ;
92+ } else if ( message . action === 'get' ) {
93+ const value = this . context . globalState . get ( message . name ) || ( { } as object ) ;
94+ const response : GlobalStoreMessage = {
95+ type : 'globalStore' ,
96+ action : 'result' ,
97+ transaction : message . transaction ,
98+ result : value
99+ } ;
100+ await webview . postMessage ( response ) ;
101+
102+ return true ;
103+ }
104+ }
105+
106+ return false ;
107+ }
78108
79109 protected abstract onSave ( document : vscode . TextDocument , webview : vscode . Webview ) : void ;
80110
111+ protected abstract onClose ( document : vscode . TextDocument , webview : vscode . Webview ) : void ;
112+
81113 protected abstract update ( document : vscode . TextDocument , webview : vscode . Webview , isDocumentChange : boolean ) : void ;
82114}
0 commit comments