widgetBuilderContext.tsx 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import type React from 'react';
  2. import {createContext, useContext} from 'react';
  3. import useWidgetBuilderState from '../hooks/useWidgetBuilderState';
  4. import {UrlParamBatchProvider} from './urlParamBatchContext';
  5. const WidgetBuilderContext = createContext<
  6. ReturnType<typeof useWidgetBuilderState> | undefined
  7. >(undefined);
  8. interface WidgetBuilderProviderProps {
  9. children: React.ReactNode;
  10. }
  11. /**
  12. * Provider for maintaining a single source of truth for the widget builder state.
  13. */
  14. function WidgetBuilderStateProvider({children}: WidgetBuilderProviderProps) {
  15. const widgetBuilderState = useWidgetBuilderState();
  16. return (
  17. <WidgetBuilderContext.Provider value={widgetBuilderState}>
  18. {children}
  19. </WidgetBuilderContext.Provider>
  20. );
  21. }
  22. export function WidgetBuilderProvider({children}: WidgetBuilderProviderProps) {
  23. return (
  24. <UrlParamBatchProvider>
  25. <WidgetBuilderStateProvider>{children}</WidgetBuilderStateProvider>
  26. </UrlParamBatchProvider>
  27. );
  28. }
  29. /**
  30. * Custom hook to get state and dispatch from the WidgetBuilderContext
  31. */
  32. export const useWidgetBuilderContext = () => {
  33. const context = useContext(WidgetBuilderContext);
  34. if (!context) {
  35. throw new Error(
  36. 'useWidgetBuilderContext must be used within a WidgetBuilderProvider'
  37. );
  38. }
  39. return context;
  40. };