packages/x-flow/src/withProvider.tsx (86 lines of code) (raw):

import { EventEmitterContextProvider } from './models/event-emitter'; import { ConfigProvider } from 'antd'; import React, { useMemo } from 'react'; import { FlowProviderWrapper } from './components/FlowProvider'; import { ConfigContext } from './models/context'; import { TNodeGroup, TNodeItem } from './types'; interface ProviderProps<T> { configProvider?: any; widgets?: any; methods?: any; nodeSelector?: any; settings?: (TNodeGroup | TNodeItem)[]; [key: string]: any; } export default function withProvider<T>( Element: any, defaultWidgets?: any ): React.ComponentType<T> { return (props: ProviderProps<T>) => { const { configProvider, widgets, methods, nodeSelector, settings, initialValues, layout, iconFontUrl, globalConfig, logPanel, onMenuItemClick, antdVersion ='V5', readOnly, clickAddNode, onTesting, ...restProps } = props; const settingMap = useMemo(() => { const obj: Record<string, any> = {}; settings?.forEach((node: any) => { if (node.type !== '_group') { obj[node.type] = node; } else { node.items.forEach((item: any) => { obj[item.type] = item; }); } }); return obj; }, [settings]); const configContext = { methods, nodeSelector, settings, settingMap, iconFontUrl, globalConfig, logPanel, antdVersion, onMenuItemClick, readOnly, clickAddNode, onTesting, widgets: { ...defaultWidgets, ...widgets, }, }; return ( <ConfigProvider {...configProvider}> <ConfigContext.Provider value={configContext}> <EventEmitterContextProvider> <FlowProviderWrapper nodes={initialValues?.nodes} edges={initialValues?.edges} layout={layout} > <Element {...restProps} initialValues={initialValues} settings={settings} /> </FlowProviderWrapper> </EventEmitterContextProvider> </ConfigContext.Provider> </ConfigProvider> ); }; }