context.tsx 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. /**
  2. * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
  3. * SPDX-License-Identifier: MIT
  4. */
  5. import React, { createContext, useContext, useMemo } from 'react';
  6. import { usePlaygroundContainer } from '@flowgram.ai/core';
  7. import {
  8. IJsonSchema,
  9. jsonSchemaTypeManager,
  10. JsonSchemaTypeManager,
  11. JsonSchemaTypeRegistry,
  12. } from './json-schema';
  13. import { BaseTypeManager, TypeRegistryCreator } from './base';
  14. // use global default
  15. const TypePresetContext = createContext<JsonSchemaTypeManager | null>(null);
  16. export const useTypeManager = () => {
  17. const typeManagerFromContext = useContext(TypePresetContext);
  18. const container = usePlaygroundContainer();
  19. if (typeManagerFromContext) {
  20. return typeManagerFromContext;
  21. }
  22. if (container?.isBound?.(BaseTypeManager)) {
  23. return container.get(BaseTypeManager);
  24. }
  25. // Global Singleton
  26. return jsonSchemaTypeManager;
  27. };
  28. export const TypePresetProvider = <
  29. Registry extends JsonSchemaTypeRegistry = JsonSchemaTypeRegistry
  30. >({
  31. children,
  32. types,
  33. }: React.PropsWithChildren<{
  34. types: (
  35. | Partial<Registry>
  36. | TypeRegistryCreator<IJsonSchema, Registry, JsonSchemaTypeManager<IJsonSchema, Registry>>
  37. )[];
  38. }>) => {
  39. const schemaManager = useMemo(() => {
  40. const typeManager = new JsonSchemaTypeManager<IJsonSchema, Registry>();
  41. types.forEach((_type) => typeManager.register(_type));
  42. return typeManager;
  43. }, [...types]);
  44. return (
  45. <TypePresetContext.Provider value={schemaManager as unknown as JsonSchemaTypeManager}>
  46. {children}
  47. </TypePresetContext.Provider>
  48. );
  49. };