Skip to content

Commit ceaec21

Browse files
committed
chore(ext): added theme toggling features
1 parent bc67988 commit ceaec21

File tree

9 files changed

+156
-16
lines changed

9 files changed

+156
-16
lines changed
Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,21 @@
1-
import { commands, ExtensionContext } from 'vscode';
2-
import { MainPanel } from './views/panel';
1+
import { commands, ExtensionContext } from "vscode";
2+
import { MainPanel } from "./views/panel";
3+
import { EXTENSION_CONFIG_SESSION } from "./constants";
34

45
export function activate(context: ExtensionContext) {
56
// Add command to the extension context
67
context.subscriptions.push(
7-
commands.registerCommand('dbml-erd-visualizer.previewDiagrams', async () => {
8-
MainPanel.render(context);
9-
}),
8+
commands.registerCommand(
9+
"dbml-erd-visualizer.previewDiagrams",
10+
async () => {
11+
lunchExtension(context);
12+
},
13+
),
1014
);
1115
}
1216

17+
const lunchExtension = (context: ExtensionContext) => {
18+
MainPanel.render(context, EXTENSION_CONFIG_SESSION);
19+
};
20+
1321
export function deactivate() {}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
export enum WebviewCommand {
2+
SET_THEME_PREFERENCES = "SET_THEME_PREFERENCES",
3+
}
4+
5+
export interface WebviewPostMessage {
6+
command: WebviewCommand;
7+
message: string;
8+
}

packages/dbml-vs-code-extension/extension/views/helper.ts

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,13 @@
1-
import { ExtensionContext, Webview } from "vscode";
1+
import {
2+
Disposable,
3+
ExtensionContext,
4+
Webview,
5+
} from "vscode";
6+
import { WebviewCommand, WebviewPostMessage } from "@/extension/types/webviewCommand";
7+
import { WEBVIEW_HTML_MARKER_FOR_DEFAULT_CONFIG } from "../constants";
8+
import { DefaultPageConfig } from "../types/defaultPageConfig";
9+
import { ExtensionConfig } from "../helper/extensionConfigs";
10+
import { Theme } from "json-table-schema-visualizer/src/types/theme";
211

312
export class WebviewHelper {
413
public static setupHtml(
@@ -25,5 +34,39 @@ export class WebviewHelper {
2534
`,
2635
);
2736
}
37+
38+
public static handleWebviewMessage(
39+
command: string,
40+
message: string,
41+
extensionConfig: ExtensionConfig,
42+
): void {
43+
switch (command) {
44+
case WebviewCommand.SET_THEME_PREFERENCES:
45+
extensionConfig.setTheme(message as Theme);
46+
return;
47+
default:
48+
return;
49+
}
50+
}
51+
52+
public static setupWebviewHooks(
53+
webview: Webview,
54+
extensionConfig: ExtensionConfig,
55+
disposables: Disposable[],
56+
) {
57+
webview.onDidReceiveMessage(
58+
(message: WebviewPostMessage) => {
59+
const command = message.command;
60+
const textMessage = message.message;
61+
console.log("Received message", command, textMessage);
62+
WebviewHelper.handleWebviewMessage(
63+
command,
64+
textMessage,
65+
extensionConfig,
66+
);
67+
},
68+
undefined,
69+
disposables,
70+
);
2871
}
2972
}

packages/dbml-vs-code-extension/extension/views/panel.ts

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,39 @@ import {
1414
WEB_VIEW_NAME,
1515
WEB_VIEW_TITLE,
1616
} from "../constants";
17+
import { ExtensionConfig } from "../helper/extensionConfigs";
1718

1819
export class MainPanel {
1920
public static currentPanel: MainPanel | undefined;
2021
private readonly _panel: WebviewPanel;
22+
public static extensionConfig: ExtensionConfig;
2123
private _disposables: Disposable[] = [];
2224
// to add debouncing on diagram update after a file change
2325
private _lastTimeout: NodeJS.Timeout | null = null;
2426

25-
private constructor(panel: WebviewPanel, context: ExtensionContext) {
27+
private constructor(
28+
panel: WebviewPanel,
29+
context: ExtensionContext,
30+
extensionConfigSession: string,
31+
) {
2632
this._panel = panel;
27-
2833
this._panel.onDidDispose(() => this.dispose(), null, this._disposables);
29-
this._panel.webview.html = WebviewHelper.setupHtml(
34+
35+
const extensionConfig = new ExtensionConfig(extensionConfigSession);
36+
const defaultPageConfig = extensionConfig.getDefaultPageConfig();
37+
38+
const html = WebviewHelper.setupHtml(
3039
this._panel.webview,
3140
context,
41+
defaultPageConfig,
42+
);
43+
44+
this._panel.webview.html = html;
45+
46+
WebviewHelper.setupWebviewHooks(
47+
this._panel.webview,
48+
extensionConfig,
49+
this._disposables,
3250
);
3351
}
3452

@@ -51,7 +69,10 @@ export class MainPanel {
5169
MainPanel.currentPanel?._disposables.push(disposable);
5270
}
5371

54-
public static render(context: ExtensionContext) {
72+
public static render(
73+
context: ExtensionContext,
74+
extensionConfigSession: string,
75+
) {
5576
const editor = window.activeTextEditor;
5677
if (!editor) {
5778
window.showErrorMessage(
@@ -77,7 +98,11 @@ export class MainPanel {
7798
},
7899
);
79100

80-
MainPanel.currentPanel = new MainPanel(panel, context);
101+
MainPanel.currentPanel = new MainPanel(
102+
panel,
103+
context,
104+
extensionConfigSession,
105+
);
81106
MainPanel.registerDiagramUpdaterOnfFileChange();
82107
}
83108

packages/dbml-vs-code-extension/index.html

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
<meta charset="UTF-8" />
55
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
66
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
7+
<link rel="stylesheet" crossorigin href="/assets/index.css" />
78
<title>Document</title>
89
</head>
910
<body>
@@ -13,5 +14,11 @@
1314
<script type="text/javascript">
1415
// <%DEFAULT-SCRIPT%>
1516
</script>
17+
18+
<script>
19+
// I add this because calling acquireVsCodeApi from the don't work
20+
// i getting error that the parent is not defined on window object
21+
var vsCodeWebviewAPI = acquireVsCodeApi();
22+
</script>
1623
</body>
1724
</html>

packages/dbml-vs-code-extension/package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,9 @@
5656
"pretest": "yarn run compile-tests && yarn run build && yarn run lint",
5757
"lint": "eslint src --ext ts",
5858
"test": "vscode-test",
59-
"build": "vite build",
60-
"preview": "vite preview"
59+
"build": "vite build && yarn run generate:css",
60+
"preview": "vite preview",
61+
"generate:css": "cd ../json-table-schema-visualizer && npx tailwindcss -i ./src/styles/index.css > ../dbml-vs-code-extension/dist/webview/assets/index.css --minify"
6162
},
6263
"devDependencies": {
6364
"@tomjs/vite-plugin-vscode": "^2.2.0",

packages/dbml-vs-code-extension/src/App.tsx

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,19 @@
11
import { useEffect, useState } from "react";
22
import { JSONTableSchema } from "shared/types/tableSchema";
33
import DiagramViewer from "json-table-schema-visualizer/src/components/DiagramViewer/DiagramViewer";
4-
import { defaultThemeConfig } from "json-table-schema-visualizer/src/constants/theme";
4+
import { useCreateTheme } from "json-table-schema-visualizer/src/hooks/theme";
5+
import ThemeProvider from "json-table-schema-visualizer/src/providers/ThemeProvider";
6+
import { Theme } from "json-table-schema-visualizer/src/types/theme";
7+
import {
8+
WebviewCommand,
9+
WebviewPostMessage,
10+
} from "@/extension/types/webviewCommand";
511

612
const App = () => {
713
const [schema, setSchema] = useState<JSONTableSchema | null>(null);
14+
const { setTheme, theme, themeColors } = useCreateTheme(
15+
window.EXTENSION_DEFAULT_CONFIG?.theme,
16+
);
817

918
useEffect(() => {
1019
window.addEventListener("message", (e: MessageEvent) => {
@@ -19,7 +28,32 @@ const App = () => {
1928
return "Loading...";
2029
}
2130

22-
return <DiagramViewer {...schema} theme={defaultThemeConfig} />;
31+
// update the preference in the extension settings
32+
const saveThemePreference = (theme: Theme) => {
33+
setTheme(theme);
34+
const updateThemeMessage: WebviewPostMessage = {
35+
command: WebviewCommand.SET_THEME_PREFERENCES,
36+
message: theme,
37+
};
38+
39+
if (!window.vsCodeWebviewAPI) {
40+
console.error(
41+
"can't send message to extension due vsCodeWebviewAPI global variable is not defined",
42+
);
43+
} else {
44+
window.vsCodeWebviewAPI?.postMessage(updateThemeMessage);
45+
}
46+
};
47+
48+
return (
49+
<ThemeProvider
50+
theme={theme}
51+
setTheme={saveThemePreference}
52+
themeColors={themeColors}
53+
>
54+
<DiagramViewer {...schema} />
55+
</ThemeProvider>
56+
);
2357
};
2458

2559
export default App;
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { DefaultPageConfig } from "../extension/types/defaultPageConfig";
2+
3+
export interface WebviewApi<StateType> {
4+
postMessage(message: unknown): void;
5+
getState(): StateType | undefined;
6+
setState<T extends StateType | undefined>(newState: T): T;
7+
}
8+
9+
declare global {
10+
interface Window {
11+
EXTENSION_DEFAULT_CONFIG?: DefaultPageConfig;
12+
vsCodeWebviewAPI: WebviewApi;
13+
}
14+
}

packages/dbml-vs-code-extension/tsconfig.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"lib": ["ES2022", "DOM"],
77
"sourceMap": true,
88
"rootDir": "./",
9-
"baseUrl": "./src",
9+
"baseUrl": "./",
1010
"strict": true,
1111
"jsx": "react-jsx",
1212
"paths": {

0 commit comments

Comments
 (0)