Skip to content

Commit 515d836

Browse files
committed
feat: support switch tab and update data
1 parent ea6dbc2 commit 515d836

File tree

1 file changed

+57
-19
lines changed

1 file changed

+57
-19
lines changed

src/index.ts

Lines changed: 57 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,71 @@
11
import * as vscode from 'vscode'
22

33
export function activate(context: vscode.ExtensionContext) {
4+
// Track currently webview panel
5+
let currentPanel: vscode.WebviewPanel | undefined
6+
47
context.subscriptions.push(
58
vscode.commands.registerCommand('sourceMapVisualization.show', () => {
6-
vscode.window.setStatusBarMessage('Show source map visualization...', show(context.extensionUri))
9+
if (currentPanel) {
10+
// If we already have a panel, show it in the target column
11+
currentPanel.reveal(getViewColumn())
12+
updatePanel(currentPanel)
13+
}
14+
else {
15+
// Otherwise, create a new panel
16+
vscode.window.setStatusBarMessage('Show source map visualization...', show(context.extensionUri).then((panel) => {
17+
currentPanel = panel
18+
// Reset when the current panel is closed
19+
panel.onDidDispose(
20+
() => {
21+
currentPanel = undefined
22+
},
23+
null,
24+
context.subscriptions,
25+
)
26+
}))
27+
}
728
}),
829
)
930
}
1031

1132
const viewType = 'sourceMapVisualization'
1233

1334
async function show(extensionUri: vscode.Uri) {
35+
const panel = vscode.window.createWebviewPanel(
36+
viewType,
37+
'Source Map Visualization',
38+
getViewColumn(),
39+
{
40+
enableScripts: true,
41+
retainContextWhenHidden: true,
42+
},
43+
)
44+
45+
panel.webview.html = getHtmlForWebview(panel.webview, extensionUri)
46+
47+
updatePanel(panel)
48+
49+
return panel
50+
}
51+
52+
function getViewColumn() {
53+
return vscode.window.activeTextEditor?.viewColumn || vscode.ViewColumn.One
54+
}
55+
56+
async function updatePanel(panel: vscode.WebviewPanel) {
57+
if (!panel)
58+
return
59+
const data = await getCodeAndMap()
60+
if (!data)
61+
return
62+
panel.webview.postMessage({
63+
command: 'update',
64+
data,
65+
})
66+
}
67+
68+
async function getCodeAndMap() {
1469
const editor = vscode.window.activeTextEditor
1570
if (!editor)
1671
return
@@ -36,24 +91,7 @@ async function show(extensionUri: vscode.Uri) {
3691
const code = document.getText(editor.selection) || await vscode.workspace.fs.readFile(vscode.Uri.file(file)).then(buffer => new TextDecoder('utf-8').decode(buffer))
3792
const map = await vscode.workspace.fs.readFile(vscode.Uri.file(mapFile)).then(buffer => new TextDecoder('utf-8').decode(buffer))
3893

39-
const column = vscode.window.activeTextEditor
40-
? vscode.window.activeTextEditor.viewColumn
41-
: undefined
42-
43-
const panel = vscode.window.createWebviewPanel(
44-
viewType,
45-
'Source Map Visualization',
46-
column || vscode.ViewColumn.One,
47-
{
48-
enableScripts: true,
49-
},
50-
)
51-
52-
panel.webview.html = getHtmlForWebview(panel.webview, extensionUri)
53-
panel.webview.postMessage({
54-
command: 'update',
55-
data: { code, map },
56-
})
94+
return { code, map }
5795
}
5896

5997
function getHtmlForWebview(webview: vscode.Webview, extensionUri: vscode.Uri) {

0 commit comments

Comments
 (0)