layer.tsx 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. /* eslint-disable react/no-deprecated */
  2. import React from 'react';
  3. import { inject } from 'inversify';
  4. import { domUtils } from '@flowgram.ai/utils';
  5. import { nanoid } from '@flowgram.ai/free-layout-core';
  6. import { Layer } from '@flowgram.ai/core';
  7. import type {
  8. CallNodePanelParams,
  9. NodePanelLayerOptions,
  10. NodePanelRenderProps,
  11. NodePanelResult,
  12. } from './type';
  13. import { WorkflowNodePanelService } from './service';
  14. export class WorkflowNodePanelLayer extends Layer<NodePanelLayerOptions> {
  15. public static type = 'WorkflowNodePanelLayer';
  16. @inject(WorkflowNodePanelService) private service: WorkflowNodePanelService;
  17. public node: HTMLDivElement;
  18. private renderList: Map<string, NodePanelRenderProps>;
  19. constructor() {
  20. super();
  21. this.node = domUtils.createDivWithClass('gedit-playground-layer gedit-node-panel-layer');
  22. this.node.style.zIndex = '9999';
  23. this.renderList = new Map();
  24. }
  25. public onReady(): void {
  26. this.service.setCallNodePanel(this.call.bind(this));
  27. }
  28. public onZoom(zoom: number): void {
  29. this.node.style.transform = `scale(${zoom})`;
  30. }
  31. public render(): JSX.Element {
  32. const NodePanelRender = this.options.renderer;
  33. return (
  34. <>
  35. {Array.from(this.renderList.keys()).map((taskId) => {
  36. const renderProps = this.renderList.get(taskId)!;
  37. return <NodePanelRender key={taskId} {...renderProps} />;
  38. })}
  39. </>
  40. );
  41. }
  42. private async call(params: CallNodePanelParams): Promise<void> {
  43. const taskId = nanoid();
  44. const { onSelect, onClose, enableMultiAdd = false, panelProps = {} } = params;
  45. return new Promise((resolve) => {
  46. const unmount = () => {
  47. // 清理挂载的组件
  48. this.renderList.delete(taskId);
  49. this.render();
  50. resolve();
  51. };
  52. const handleClose = () => {
  53. unmount();
  54. onClose();
  55. };
  56. const handleSelect = (params?: NodePanelResult) => {
  57. onSelect(params);
  58. if (!enableMultiAdd) {
  59. unmount();
  60. }
  61. };
  62. const renderProps: NodePanelRenderProps = {
  63. ...params,
  64. panelProps,
  65. onSelect: handleSelect,
  66. onClose: handleClose,
  67. };
  68. this.renderList.set(taskId, renderProps);
  69. this.render();
  70. });
  71. }
  72. }