create-materials-plugin.ts 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /**
  2. * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
  3. * SPDX-License-Identifier: MIT
  4. */
  5. import React from 'react';
  6. import { FlowRendererKey, FlowRendererRegistry } from '@flowgram.ai/renderer';
  7. import { definePluginCreator } from '@flowgram.ai/core';
  8. export type MaterialReactComponent<T = any> = (props: T) => React.ReactNode | null;
  9. export interface MaterialsPluginOptions {
  10. /**
  11. * 注册特定的 UI 组件
  12. */
  13. components?: Record<FlowRendererKey | string, MaterialReactComponent>;
  14. /**
  15. * 注册特定的节点渲染组件
  16. */
  17. renderNodes?: Record<string, MaterialReactComponent>;
  18. /**
  19. * 默认节点渲染
  20. */
  21. renderDefaultNode?: MaterialReactComponent;
  22. /**
  23. * 注册渲染的文字
  24. */
  25. renderTexts?: Record<string, string>;
  26. }
  27. export const createMaterialsPlugin = definePluginCreator<MaterialsPluginOptions>({
  28. onInit(ctx, opts) {
  29. const registry = ctx.get<FlowRendererRegistry>(FlowRendererRegistry);
  30. /**
  31. * 注册默认节点渲染
  32. */
  33. registry.registerReactComponent(
  34. FlowRendererKey.NODE_RENDER,
  35. opts.renderDefaultNode || (() => null)
  36. );
  37. /**
  38. * 注册文案
  39. */
  40. if (opts.renderTexts) {
  41. registry.registerText(opts.renderTexts);
  42. }
  43. /**
  44. * 注册组件
  45. */
  46. if (opts.components) {
  47. Object.keys(opts.components).forEach((key) =>
  48. registry.registerReactComponent(key, opts.components![key])
  49. );
  50. }
  51. /**
  52. * 注册单节点渲染
  53. */
  54. if (opts.renderNodes) {
  55. Object.keys(opts.renderNodes).forEach((key) =>
  56. registry.registerReactComponent(key, opts.renderNodes![key])
  57. );
  58. }
  59. },
  60. });