Skip to content

Commit 37d07f1

Browse files
committed
refactor: refactor codes
1 parent 0157bbd commit 37d07f1

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

78 files changed

+2298
-1815
lines changed

packages/core/__tests__/instantiation.spec.ts

Lines changed: 0 additions & 36 deletions
This file was deleted.
File renamed without changes.

packages/react-renderer/package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,17 @@
3030
"hoist-non-react-statics": "^3.3.2",
3131
"use-sync-external-store": "^1.2.0",
3232
"react": "^18.2.0",
33-
"react-dom": "^18.2.0"
33+
"react-dom": "^18.2.0",
34+
"react-is": "^18.3.1"
3435
},
3536
"devDependencies": {
3637
"@testing-library/react": "^14.2.0",
3738
"@types/lodash-es": "^4.17.12",
3839
"@types/hoist-non-react-statics": "^3.3.5",
3940
"@types/use-sync-external-store": "^0.0.6",
4041
"@types/react": "^18.2.67",
41-
"@types/react-dom": "^18.2.22"
42+
"@types/react-dom": "^18.2.22",
43+
"@types/react-is": "^18.3.0"
4244
},
4345
"peerDependencies": {
4446
"react": "^18.2.0",
Lines changed: 30 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,37 @@
1-
import { createRenderer, type AppOptions, type IRender } from '@alilc/lowcode-renderer-core';
1+
import { createRenderer, type AppOptions } from '@alilc/lowcode-renderer-core';
22
import { type ComponentType } from 'react';
33
import { type Root, createRoot } from 'react-dom/client';
4-
import { createRouter, type RouterOptions } from '@alilc/lowcode-renderer-router';
5-
import AppComponent from '../components/app';
6-
import { RendererContext } from '../context/render';
7-
import { createRouterProvider } from '../components/routerView';
8-
import { rendererExtends } from '../plugin';
4+
import { ApplicationView, RendererContext, extension } from '../app';
95

106
export interface ReactAppOptions extends AppOptions {
117
faultComponent?: ComponentType<any>;
128
}
139

14-
const defaultRouterOptions: RouterOptions = {
15-
historyMode: 'browser',
16-
baseName: '/',
17-
routes: [],
18-
};
19-
2010
export const createApp = async (options: ReactAppOptions) => {
21-
const creator = createRenderer<IRender>(async (context) => {
11+
return createRenderer(async (context) => {
2212
const { schema, boostsManager } = context;
23-
const boosts = boostsManager.toExpose();
24-
25-
// router
26-
let routerConfig = defaultRouterOptions;
27-
28-
try {
29-
const routerSchema = schema.get('router');
30-
if (routerSchema) {
31-
routerConfig = boosts.codeRuntime.resolve(routerSchema);
32-
}
33-
} catch (e) {
34-
console.error(`schema's router config is resolve error: `, e);
35-
}
36-
37-
const router = createRouter(routerConfig);
38-
39-
boosts.codeRuntime.getScope().inject('router', router);
4013

4114
// set config
4215
// if (options.faultComponent) {
4316
// context.config.set('faultComponent', options.faultComponent);
4417
// }
4518

4619
// extends boosts
47-
boostsManager.extend(rendererExtends);
48-
49-
const RouterProvider = createRouterProvider(router);
20+
extension.install(boostsManager);
5021

5122
let root: Root | undefined;
5223

5324
return {
54-
async mount(el) {
55-
if (root) {
56-
return;
57-
}
25+
async mount(containerOrId) {
26+
if (root) return;
27+
28+
const defaultId = schema.get('config')?.targetRootID ?? 'app';
29+
const rootElement = normalizeContainer(containerOrId, defaultId);
5830

59-
root = createRoot(el);
31+
root = createRoot(rootElement);
6032
root.render(
6133
<RendererContext.Provider value={context}>
62-
<RouterProvider>
63-
<AppComponent />
64-
</RouterProvider>
34+
<ApplicationView />
6535
</RendererContext.Provider>,
6636
);
6737
},
@@ -72,7 +42,23 @@ export const createApp = async (options: ReactAppOptions) => {
7242
}
7343
},
7444
};
75-
});
76-
77-
return creator(options);
45+
})(options);
7846
};
47+
48+
function normalizeContainer(container: Element | string | undefined, defaultId: string): Element {
49+
let result: Element | undefined = undefined;
50+
51+
if (typeof container === 'string') {
52+
const el = document.getElementById(container);
53+
if (el) result = el;
54+
} else if (container instanceof window.Element) {
55+
result = container;
56+
}
57+
58+
if (!result) {
59+
result = document.createElement('div');
60+
result.id = defaultId;
61+
}
62+
63+
return result;
64+
}

packages/react-renderer/src/api/component.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { createRenderer, type AppOptions } from '@alilc/lowcode-renderer-core';
22
import { FunctionComponent } from 'react';
3-
import { type LowCodeComponentProps, createComponentBySchema } from '../runtime';
4-
import { RendererContext } from '../context/render';
3+
import { type LowCodeComponentProps, createComponentBySchema } from '../runtime/component';
4+
import { RendererContext } from '../app/context';
55

66
interface Render {
77
toComponent(): FunctionComponent<LowCodeComponentProps>;

packages/react-renderer/src/context/render.ts renamed to packages/react-renderer/src/app/context.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ import { type RenderContext } from '@alilc/lowcode-renderer-core';
33

44
export const RendererContext = createContext<RenderContext>(undefined!);
55

6-
RendererContext.displayName = 'RootContext';
6+
RendererContext.displayName = 'RendererContext';
77

88
export const useRenderContext = () => useContext(RendererContext);
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import { type Plugin, type IBoostsService } from '@alilc/lowcode-renderer-core';
2+
import { type ComponentType, type PropsWithChildren } from 'react';
3+
4+
export type WrapperComponent = ComponentType<PropsWithChildren<any>>;
5+
6+
export interface OutletProps {
7+
[key: string]: any;
8+
}
9+
10+
export type Outlet = ComponentType<OutletProps>;
11+
12+
export interface ReactRendererExtensionApi {
13+
addAppWrapper(appWrapper: WrapperComponent): void;
14+
15+
setOutlet(outlet: Outlet): void;
16+
}
17+
18+
class ReactRendererExtension {
19+
private wrappers: WrapperComponent[] = [];
20+
21+
private outlet: Outlet | null = null;
22+
23+
getAppWrappers() {
24+
return this.wrappers;
25+
}
26+
27+
getOutlet() {
28+
return this.outlet;
29+
}
30+
31+
toExpose(): ReactRendererExtensionApi {
32+
return {
33+
addAppWrapper: (appWrapper) => {
34+
if (appWrapper) this.wrappers.push(appWrapper);
35+
},
36+
setOutlet: (outletComponent) => {
37+
if (outletComponent) this.outlet = outletComponent;
38+
},
39+
};
40+
}
41+
42+
install(boostsService: IBoostsService) {
43+
boostsService.extend(this.toExpose());
44+
}
45+
}
46+
47+
export const extension = new ReactRendererExtension();
48+
49+
export function defineRendererPlugin(plugin: Plugin<ReactRendererExtensionApi>) {
50+
return plugin;
51+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export * from './context';
2+
export * from './extension';
3+
export * from './view';
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { useRenderContext } from './context';
2+
import { getComponentByName } from '../runtime/component';
3+
import { extension } from './extension';
4+
5+
export function ApplicationView() {
6+
const renderContext = useRenderContext();
7+
const { schema } = renderContext;
8+
const appWrappers = extension.getAppWrappers();
9+
const Outlet = extension.getOutlet();
10+
11+
if (!Outlet) return null;
12+
13+
let element = <Outlet />;
14+
15+
const layoutConfig = schema.get('config')?.layout;
16+
17+
if (layoutConfig) {
18+
const componentName = layoutConfig.componentName;
19+
const Layout = getComponentByName(componentName, renderContext);
20+
21+
if (Layout) {
22+
const layoutProps: any = layoutConfig.props ?? {};
23+
element = <Layout {...layoutProps}>{element}</Layout>;
24+
}
25+
}
26+
27+
if (appWrappers.length > 0) {
28+
element = appWrappers.reduce((preElement, CurrentWrapper) => {
29+
return <CurrentWrapper>{preElement}</CurrentWrapper>;
30+
}, element);
31+
}
32+
33+
return element;
34+
}

packages/react-renderer/src/components/app.tsx

Lines changed: 0 additions & 39 deletions
This file was deleted.

0 commit comments

Comments
 (0)