import React, { createContext, useContext } from 'react'; export interface Position { x: number; y: number; } export interface SocketData { id: string; label: string; type: string; // e.g., 'number', 'image', 'any' value?: any; // Static value for an input socket if not connected color?: string; // Color for connections originating from this output socket } export interface NodeData { id: string; label: string; position: Position; inputs: SocketData[]; outputs: SocketData[]; size?: { width: number; height: number }; component?: React.FC<{ data: NodeData; inputs: Record; onUpdateData: (newData: Record) => void; }>; process?: (inputs: Record, data: NodeData['data']) => Record; data?: Record; } export interface ConnectionData { id: string; sourceNodeId: string; sourceSocketId: string; targetNodeId: string; targetSocketId: string; color?: string; type?: 'curved' | 'straight'; } export interface FastMakeNode { type: string; data?: Record; } export interface GraphicsContextType { nodes: NodeData[]; setNodes: React.Dispatch>; connections: ConnectionData[]; setConnections: React.Dispatch>; pan: Position; setPan: React.Dispatch>; zoom: number; setZoom: React.Dispatch>; editorRef: React.RefObject; startConnecting: (nodeId: string, socketId: string, type: 'input' | 'output', e: React.MouseEvent) => void; stopConnecting: (nodeId: string, socketId: string, type: 'input' | 'output') => void; isConnecting: boolean; draftConnection: { start: Position, end: Position } | null; processGraph: () => void; nodeOutputs: Record>; createNode: (node: Omit) => void; getNodes: () => NodeData[]; updateNode: (nodeId: string, data: Partial>) => void; deleteNode: (nodeId: string) => void; autoConnect: (sourceNodeId: string, sourceSocketId: string) => void; socketRelativePositions: Record>; registerSocketPositions: (nodeId: string, positions: Record) => void; creatableNodeTypes: Record>; newCreateNode: (label: string, nodeTemplate: Omit) => void; // New additions for plugins fastMake: (config: FastMakeNode[], startPosition: Position) => void; isContentBlurred: boolean; setIsContentBlurred: React.Dispatch>; } export const GraphicsContext = createContext(null); export const useGraphicsContext = () => { const context = useContext(GraphicsContext); if (!context) { throw new Error('useGraphicsContext must be used within a GraphicsProvider'); } return context; };