Files
bytedance--flowgram.ai/packages/plugins/free-node-panel-plugin/src/layer.tsx
T
wehub-resource-sync 0232b4e2bb
CI / build (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:09:51 +08:00

89 lines
2.3 KiB
TypeScript

/**
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
* SPDX-License-Identifier: MIT
*/
/* eslint-disable react/no-deprecated */
import React from 'react';
import { inject } from 'inversify';
import { domUtils } from '@flowgram.ai/utils';
import { nanoid } from '@flowgram.ai/free-layout-core';
import { Layer } from '@flowgram.ai/core';
import type {
CallNodePanelParams,
NodePanelLayerOptions,
NodePanelRenderProps,
NodePanelResult,
} from './type';
import { WorkflowNodePanelService } from './service';
export class WorkflowNodePanelLayer extends Layer<NodePanelLayerOptions> {
public static type = 'WorkflowNodePanelLayer';
@inject(WorkflowNodePanelService) private service: WorkflowNodePanelService;
public node: HTMLDivElement;
private renderList: Map<string, NodePanelRenderProps>;
constructor() {
super();
this.node = domUtils.createDivWithClass('gedit-playground-layer gedit-node-panel-layer');
this.node.style.zIndex = '9999';
this.renderList = new Map();
}
public onReady(): void {
this.service.setCallNodePanel(this.call.bind(this));
}
public onZoom(zoom: number): void {
this.node.style.transform = `scale(${zoom})`;
}
public render(): JSX.Element {
const NodePanelRender = this.options.renderer;
return (
<>
{Array.from(this.renderList.keys()).map((taskId) => {
const renderProps = this.renderList.get(taskId)!;
return <NodePanelRender key={taskId} {...renderProps} />;
})}
</>
);
}
private async call(params: CallNodePanelParams): Promise<void> {
const taskId = nanoid();
const { onSelect, onClose, enableMultiAdd = false, panelProps = {} } = params;
return new Promise((resolve) => {
const unmount = () => {
// 清理挂载的组件
this.renderList.delete(taskId);
this.render();
resolve();
};
const handleClose = () => {
unmount();
onClose();
};
const handleSelect = (params?: NodePanelResult) => {
onSelect(params);
if (!enableMultiAdd) {
unmount();
}
};
const renderProps: NodePanelRenderProps = {
...params,
panelProps,
onSelect: handleSelect,
onClose: handleClose,
};
this.renderList.set(taskId, renderProps);
this.render();
});
}
}