Skip to content

Commit 277f266

Browse files
feat: implement manual app reload
1 parent acde4f9 commit 277f266

File tree

8 files changed

+68
-1
lines changed

8 files changed

+68
-1
lines changed

libs/frontend/abstract/application/src/renderer/renderer.service.interface.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,7 @@ export interface IRendererService
1313
activeElementTree: Maybe<IElementTree>
1414
activeRenderer: Nullable<Ref<IRendererModel>>
1515
renderers: ObjectMap<IRendererModel>
16+
17+
reloadActiveRenderer(): void
1618
setActiveRenderer(renderer: Ref<IRendererModel>): void
1719
}

libs/frontend/abstract/types/src/model/ui-data.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,9 @@ const UiDataRecord = {
178178
[UiKey.BuilderToolbarItemOpenPreview]: {
179179
label: 'Open Preview Builder Toolbar Item',
180180
},
181+
[UiKey.BuilderToolbarItemReload]: {
182+
label: 'Reload Renderer Toolbar Item',
183+
},
181184
/**
182185
* Button
183186
*/

libs/frontend/abstract/types/src/model/ui-key.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ export enum UiKey {
7474
BuilderSidebar = 'BuilderSidebar',
7575
BuilderToolbarItemOpenBuilder = 'BuilderToolbarItemOpenBuilder',
7676
BuilderToolbarItemOpenPreview = 'BuilderToolbarItemOpenPreview',
77+
BuilderToolbarItemReload = 'BuilderToolbarItemReload',
7778
/**
7879
* Button
7980
*/

libs/frontend/application/component/src/views/ComponentDetailHeader.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
useCurrentApp,
99
useCurrentComponent,
1010
} from '@codelab/frontend/presentation/container'
11+
import { useApplicationStore } from '@codelab/frontend-infra-mobx/context'
1112
import { DetailHeader } from '@codelab/frontend-presentation-view/sections'
1213
import { observer } from 'mobx-react-lite'
1314
import { usePathname, useRouter } from 'next/navigation'
@@ -27,6 +28,7 @@ export const ComponentDetailHeader = observer<IComponentDetailHeaderProps>(
2728
const isBuilder = currentPathname.endsWith('/builder')
2829
const component = useCurrentComponent()
2930
const app = useCurrentApp()
31+
const { rendererService } = useApplicationStore()
3032

3133
const togglePreviewMode = () => {
3234
const url = isBuilder
@@ -59,6 +61,7 @@ export const ComponentDetailHeader = observer<IComponentDetailHeaderProps>(
5961
BuilderResizeMenu={BuilderResizeMenu}
6062
directionItems={directionItems}
6163
isBuilder={isBuilder}
64+
reloadRenderer={rendererService.reloadActiveRenderer}
6265
togglePreviewMode={togglePreviewMode}
6366
/>
6467
)

libs/frontend/application/page/src/views/PageDetailHeader.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ import {
77
useCurrentApp,
88
useCurrentPage,
99
} from '@codelab/frontend/presentation/container'
10+
import {
11+
useApplicationStore,
12+
useDomainStore,
13+
} from '@codelab/frontend-infra-mobx/context'
1014
import { DetailHeader } from '@codelab/frontend-presentation-view/sections'
1115
import { Skeleton } from 'antd'
1216
import { observer } from 'mobx-react-lite'
@@ -27,6 +31,7 @@ export const PageDetailHeader = observer<IPageDetailHeaderProps>(
2731
const isBuilder = currentPathname.includes('/builder')
2832
const app = useCurrentApp()
2933
const page = useCurrentPage()
34+
const { rendererService } = useApplicationStore()
3035

3136
const togglePreviewMode = () => {
3237
const url = isBuilder
@@ -63,6 +68,7 @@ export const PageDetailHeader = observer<IPageDetailHeaderProps>(
6368
BuilderResizeMenu={BuilderResizeMenu}
6469
directionItems={directionItems}
6570
isBuilder={isBuilder}
71+
reloadRenderer={rendererService.reloadActiveRenderer}
6672
togglePreviewMode={togglePreviewMode}
6773
/>
6874
)

libs/frontend/application/renderer/src/components/ElementWrapper.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export const ElementWrapper = observer<ElementWrapperProps>(
3131
}) => {
3232
useEffect(() => {
3333
onRendered()
34-
}, [])
34+
}, [onRendered])
3535

3636
const { atomDomainService } = useDomainStore()
3737

libs/frontend/application/renderer/src/services/renderer.service.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,17 @@ import type { Nullable } from '@codelab/shared/abstract/types'
77
import type { Ref } from 'mobx-keystone'
88

99
import {
10+
getBuilderService,
1011
getRuntimeComponentService,
1112
getRuntimeElementService,
13+
getRuntimePageService,
14+
runtimeElementRef,
1215
} from '@codelab/frontend/abstract/application'
16+
import {
17+
componentRef,
18+
isComponentRef,
19+
pageRef,
20+
} from '@codelab/frontend/abstract/domain'
1321
import { computed } from 'mobx'
1422
import { Model, model, modelAction, objectMap, prop } from 'mobx-keystone'
1523

@@ -32,6 +40,11 @@ export class RendererService
3240
return this.activeRenderer?.current.containerNode.current
3341
}
3442

43+
@computed
44+
get builderService() {
45+
return getBuilderService(this)
46+
}
47+
3548
@computed
3649
get runtimeComponentService() {
3750
return getRuntimeComponentService(this)
@@ -42,6 +55,11 @@ export class RendererService
4255
return getRuntimeElementService(this)
4356
}
4457

58+
@computed
59+
get runtimePageService() {
60+
return getRuntimePageService(this)
61+
}
62+
4563
@modelAction
4664
hydrate = (rendererDto: IRendererDto) => {
4765
let renderer = this.renderers.get(rendererDto.id)
@@ -66,4 +84,29 @@ export class RendererService
6684

6785
return renderer
6886
}
87+
88+
@modelAction
89+
reloadActiveRenderer = () => {
90+
if (!this.activeRenderer) {
91+
return
92+
}
93+
94+
const currentRenderer = this.activeRenderer.current
95+
const { containerNode } = currentRenderer
96+
97+
// reset builder tree selected node
98+
this.builderService.setSelectedNode(
99+
runtimeElementRef(
100+
currentRenderer.runtimeRootContainerNode.runtimeRootElement,
101+
),
102+
)
103+
104+
// detach current page/components with elements and stores from root store
105+
currentRenderer.runtimeRootContainerNode.detach()
106+
107+
// reinitialize renderer container node, this will recompute all properties and rerender
108+
currentRenderer.containerNode = isComponentRef(containerNode)
109+
? componentRef(containerNode.current)
110+
: pageRef(containerNode.current)
111+
}
69112
}

libs/frontend/presentation/view/src/sections/Header/DetailHeader.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import EyeOutlined from '@ant-design/icons/EyeOutlined'
22
import ToolOutlined from '@ant-design/icons/lib/icons/ToolOutlined'
3+
import ReloadOutlined from '@ant-design/icons/ReloadOutlined'
34
import { UiKey } from '@codelab/frontend/abstract/types'
45
import {
56
CuiHeader,
@@ -15,16 +16,24 @@ interface DetailHeaderProps {
1516
BuilderResizeMenu: ReactNode
1617
directionItems: Array<HeaderBreadcrumbItem>
1718
isBuilder: boolean
19+
reloadRenderer(): void
1820
togglePreviewMode(): void
1921
}
2022

2123
export const DetailHeader = ({
2224
BuilderResizeMenu,
2325
directionItems,
2426
isBuilder,
27+
reloadRenderer,
2528
togglePreviewMode,
2629
}: DetailHeaderProps) => {
2730
const toolbarItems: Array<ToolbarItem> = [
31+
{
32+
cuiKey: UiKey.BuilderToolbarItemReload,
33+
icon: <ReloadOutlined />,
34+
onClick: reloadRenderer,
35+
title: 'Reload app',
36+
},
2837
isBuilder
2938
? {
3039
cuiKey: UiKey.BuilderToolbarItemOpenPreview,

0 commit comments

Comments
 (0)