Skip to content

Commit 222e536

Browse files
authored
fix: get container after Workbench is mounted (#848)
* feat: support onWorkbenchDidMount event * test: unit test for onWorkbenchDidMount event * fix: initWorkspace after workbench did mount * feat: add EmbeddedWorkbench example * fix: rename standalone
1 parent 5629316 commit 222e536

File tree

9 files changed

+81
-16
lines changed

9 files changed

+81
-16
lines changed

src/controller/__tests__/layout.test.ts

+8
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,14 @@ const layoutController = container.resolve(LayoutController);
77
const layoutService = container.resolve(LayoutService);
88

99
describe('The layout controller', () => {
10+
test('Should support to listen to the Workbench did mount event', () => {
11+
const mockFn = jest.fn();
12+
layoutService.onWorkbenchDidMount(mockFn);
13+
layoutController.onWorkbenchDidMount();
14+
15+
expect(mockFn).toBeCalled();
16+
});
17+
1018
test('Should support to execute onPaneSizeChange', () => {
1119
const original = layoutService.setPaneSize;
1220
const mockFn = jest.fn();

src/controller/layout.ts

+6
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ import 'reflect-metadata';
22
import { container, singleton } from 'tsyringe';
33
import { Controller } from 'mo/react/controller';
44
import { ILayoutService, LayoutService } from 'mo/services';
5+
import { LayoutEvents } from 'mo/model/workbench/layout';
56

67
export interface ILayoutController extends Partial<Controller> {
8+
onWorkbenchDidMount?: () => void;
79
onPaneSizeChange?: (splitPanePos: number[]) => void;
810
onHorizontalPaneSizeChange?: (horizontalSplitPanePos: number[]) => void;
911
}
@@ -26,4 +28,8 @@ export class LayoutController extends Controller implements ILayoutController {
2628
public onHorizontalPaneSizeChange = (horizontalSplitPanePos: number[]) => {
2729
this.layoutService.setHorizontalPaneSize(horizontalSplitPanePos);
2830
};
31+
32+
public onWorkbenchDidMount = () => {
33+
this.layoutService.emit(LayoutEvents.OnWorkbenchDidMount);
34+
};
2935
}

src/model/workbench/layout.ts

+4
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ export enum MenuBarMode {
88
vertical = 'vertical',
99
}
1010

11+
export enum LayoutEvents {
12+
OnWorkbenchDidMount = 'workbench.didMount',
13+
}
14+
1115
export interface ViewVisibility {
1216
hidden: boolean;
1317
}

src/provider/create.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export interface IConfigProps {
1414
defaultLocale?: string;
1515
}
1616

17-
namespace stanalone {
17+
namespace standalone {
1818
let instance: InstanceService | null = null;
1919

2020
/**
@@ -37,12 +37,12 @@ namespace stanalone {
3737
}
3838

3939
export default function create(config: IConfigProps) {
40-
return stanalone.create(config);
40+
return standalone.create(config);
4141
}
4242

4343
/**
4444
* Do NOT call it in production, ONLY used for test cases
4545
*/
4646
export function clearInstance() {
47-
stanalone.clearInstance();
47+
standalone.clearInstance();
4848
}

src/services/__tests__/layoutService.test.ts

+10-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { ID_APP } from 'mo/common/id';
2-
import { MenuBarMode, Position } from 'mo/model/workbench/layout';
2+
import { LayoutEvents, MenuBarMode, Position } from 'mo/model/workbench/layout';
33
import 'reflect-metadata';
44
import { container } from 'tsyringe';
55
import { LayoutService } from '../workbench';
@@ -143,5 +143,14 @@ describe('The layout service', () => {
143143
layoutService.setAuxiliaryBar((pre) => !pre);
144144
expect(layoutService.getState().auxiliaryBar.hidden).toBe(true);
145145
});
146+
147+
test('Should support to listen to the Workbench did mount event', () => {
148+
const mockFn = jest.fn();
149+
layoutService.onWorkbenchDidMount(mockFn);
150+
151+
layoutService.emit(LayoutEvents.OnWorkbenchDidMount);
152+
153+
expect(mockFn).toBeCalled();
154+
});
146155
});
147156
});

src/services/instanceService.tsx

+5-1
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,11 @@ export default class InstanceService
122122
this.emit(InstanceHookKind.beforeLoad);
123123
molecule.extension.load(others);
124124

125-
molecule.monacoService.initWorkspace(molecule.layout.container!);
125+
molecule.layout.onWorkbenchDidMount(() => {
126+
molecule.monacoService.initWorkspace(
127+
molecule.layout.container!
128+
);
129+
});
126130
this.rendered = true;
127131
}
128132

src/services/workbench/layoutService.ts

+10
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
Position,
77
LayoutModel,
88
MenuBarMode,
9+
LayoutEvents,
910
} from 'mo/model/workbench/layout';
1011
import { MenuBarEvent } from 'mo/model/workbench/menuBar';
1112

@@ -87,6 +88,11 @@ export interface ILayoutService extends Component<ILayout> {
8788
* Reset all layout data as default value
8889
*/
8990
reset(): void;
91+
/**
92+
* Listen to the workbench did mount event
93+
* @param callback callback function
94+
*/
95+
onWorkbenchDidMount(callback: Function): void;
9096
}
9197

9298
@singleton()
@@ -101,6 +107,10 @@ export class LayoutService
101107
this.state = container.resolve(LayoutModel);
102108
}
103109

110+
public onWorkbenchDidMount(callback: Function): void {
111+
this.subscribe(LayoutEvents.OnWorkbenchDidMount, callback);
112+
}
113+
104114
public get container() {
105115
// Make sure to get the latest dom element.
106116
this._container = document.getElementById(ID_APP) || document.body;

src/workbench/workbench.tsx

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import 'reflect-metadata';
2-
import React from 'react';
2+
import React, { useEffect } from 'react';
33
import { container } from 'tsyringe';
44

55
import {
@@ -60,6 +60,7 @@ export function WorkbenchView(props: IWorkbench & ILayout & ILayoutController) {
6060
sidebar,
6161
statusBar,
6262
onPaneSizeChange,
63+
onWorkbenchDidMount,
6364
onHorizontalPaneSizeChange,
6465
splitPanePos,
6566
horizontalSplitPanePos,
@@ -122,6 +123,11 @@ export function WorkbenchView(props: IWorkbench & ILayout & ILayoutController) {
122123
hideStatusBar
123124
);
124125

126+
useEffect(() => {
127+
// call onWorkbenchDidMount after the first render
128+
onWorkbenchDidMount?.();
129+
}, []);
130+
125131
return (
126132
<div id={ID_APP} className={appClassName} tabIndex={0}>
127133
<div className={workbenchFinalClassName}>

stories/workbench/0-Workbench.stories.tsx

+28-10
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,35 @@ moInstance.onBeforeInit(() => {
1313
molecule.builtin.inactiveModule('activityBarData');
1414
});
1515

16-
export const IDEDemo = () => moInstance.render(<Workbench />);
17-
18-
IDEDemo.story = {
19-
name: 'Workbench',
16+
export default {
17+
title: 'Workbench',
2018
};
2119

22-
if (module.hot) {
23-
module.hot.accept();
24-
}
20+
export const NormalWorkbench = () => moInstance.render(<Workbench />);
2521

26-
export default {
27-
title: 'Workbench',
28-
component: IDEDemo,
22+
export const EmbeddedWorkbench = () => {
23+
return (
24+
<div
25+
style={{
26+
position: 'absolute',
27+
width: '100%',
28+
height: '100%',
29+
top: 0,
30+
left: 0,
31+
}}
32+
>
33+
<h1 style={{ textAlign: 'center', lineHeight: '40px' }}>
34+
Embedded
35+
</h1>
36+
<div
37+
style={{
38+
position: 'relative',
39+
width: '100%',
40+
height: 'calc(100% - 40px)',
41+
}}
42+
>
43+
{moInstance.render(<Workbench />)}
44+
</div>
45+
</div>
46+
);
2947
};

0 commit comments

Comments
 (0)