|
|
@@ -1,4 +1,4 @@
|
|
|
-import { useCallback, useContext, useEffect } from 'react';
|
|
|
+import { useCallback, useContext, useEffect, useMemo } from 'react';
|
|
|
|
|
|
import {
|
|
|
PlaygroundEntityContext,
|
|
|
@@ -7,20 +7,26 @@ import {
|
|
|
} from '@flowgram.ai/fixed-layout-editor';
|
|
|
import { SideSheet } from '@douyinfe/semi-ui';
|
|
|
|
|
|
-import { SidebarContext, IsSidebarContext, NodeRenderContext } from '../../context';
|
|
|
+import { FlowNodeMeta } from '../../typings';
|
|
|
+import { SidebarContext, IsSidebarContext } from '../../context';
|
|
|
+import { SidebarNodeRenderer } from './sidebar-node-renderer';
|
|
|
|
|
|
export const SidebarRenderer = () => {
|
|
|
- const { nodeRender, setNodeRender } = useContext(SidebarContext);
|
|
|
- const { selection, playground } = useClientContext();
|
|
|
+ const { nodeId, setNodeId } = useContext(SidebarContext);
|
|
|
+ const { selection, playground, document } = useClientContext();
|
|
|
const refresh = useRefresh();
|
|
|
const handleClose = useCallback(() => {
|
|
|
- setNodeRender(undefined);
|
|
|
+ setNodeId(undefined);
|
|
|
}, []);
|
|
|
+ const node = nodeId ? document.getNode(nodeId) : undefined;
|
|
|
/**
|
|
|
* Listen readonly
|
|
|
*/
|
|
|
useEffect(() => {
|
|
|
- const disposable = playground.config.onReadonlyOrDisabledChange(() => refresh());
|
|
|
+ const disposable = playground.config.onReadonlyOrDisabledChange(() => {
|
|
|
+ handleClose();
|
|
|
+ refresh();
|
|
|
+ });
|
|
|
return () => disposable.dispose();
|
|
|
}, [playground]);
|
|
|
/**
|
|
|
@@ -34,41 +40,47 @@ export const SidebarRenderer = () => {
|
|
|
*/
|
|
|
if (selection.selection.length === 0) {
|
|
|
handleClose();
|
|
|
- } else if (selection.selection.length === 1 && selection.selection[0] !== nodeRender?.node) {
|
|
|
+ } else if (selection.selection.length === 1 && selection.selection[0] !== node) {
|
|
|
handleClose();
|
|
|
}
|
|
|
});
|
|
|
return () => toDispose.dispose();
|
|
|
- }, [selection, handleClose]);
|
|
|
+ }, [selection, handleClose, node]);
|
|
|
/**
|
|
|
* Close when node disposed
|
|
|
*/
|
|
|
useEffect(() => {
|
|
|
- if (nodeRender) {
|
|
|
- const toDispose = nodeRender.node.onDispose(() => {
|
|
|
- setNodeRender(undefined);
|
|
|
+ if (node) {
|
|
|
+ const toDispose = node.onDispose(() => {
|
|
|
+ setNodeId(undefined);
|
|
|
});
|
|
|
return () => toDispose.dispose();
|
|
|
}
|
|
|
return () => {};
|
|
|
- }, [nodeRender]);
|
|
|
+ }, [node]);
|
|
|
+
|
|
|
+ const visible = useMemo(() => {
|
|
|
+ if (!node) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ const { disableSideBar = false } = node.getNodeMeta<FlowNodeMeta>();
|
|
|
+ return !disableSideBar;
|
|
|
+ }, [node]);
|
|
|
|
|
|
if (playground.config.readonly) {
|
|
|
return null;
|
|
|
}
|
|
|
/**
|
|
|
- * Add key to rerender the sidebar when the node changes
|
|
|
+ * Add "key" to rerender the sidebar when the node changes
|
|
|
*/
|
|
|
- const content = nodeRender ? (
|
|
|
- <PlaygroundEntityContext.Provider key={nodeRender.node.id} value={nodeRender.node}>
|
|
|
- <NodeRenderContext.Provider value={nodeRender}>
|
|
|
- {nodeRender.form?.render()}
|
|
|
- </NodeRenderContext.Provider>
|
|
|
+ const content = node ? (
|
|
|
+ <PlaygroundEntityContext.Provider key={node.id} value={node}>
|
|
|
+ <SidebarNodeRenderer node={node} />
|
|
|
</PlaygroundEntityContext.Provider>
|
|
|
) : null;
|
|
|
|
|
|
return (
|
|
|
- <SideSheet mask={false} visible={!!nodeRender} onCancel={handleClose}>
|
|
|
+ <SideSheet mask={false} visible={visible} onCancel={handleClose}>
|
|
|
<IsSidebarContext.Provider value={true}>{content}</IsSidebarContext.Provider>
|
|
|
</SideSheet>
|
|
|
);
|