UNPKG

@angelerator/uuics-react

Version:

Universal UI Context System - React hooks and components

1 lines 11.8 kB
{"version":3,"sources":["../src/hooks/useUICS.ts","../src/hooks/useUIElement.ts","../src/components/UUICSProvider.tsx","../src/components/DebugPanel.tsx"],"names":["useState","jsx"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * UUICS React Hook\n */\n\nimport { useEffect, useState, useCallback, useRef } from 'react';\nimport { UUICSEngine } from '@angelerator/uuics-core';\nimport type { PageContext, ActionCommand, ActionResult, UUICSConfig } from '@angelerator/uuics-core';\n\n/**\n * Hook to use UUICS in a React component\n */\nexport function useUICS(config?: UUICSConfig) {\n const [context, setContext] = useState<PageContext | null>(null);\n const [isInitialized, setIsInitialized] = useState(false);\n const engineRef = useRef<UUICSEngine | null>(null);\n\n useEffect(() => {\n // Create and initialize engine\n const engine = new UUICSEngine(config);\n engineRef.current = engine;\n\n engine.initialize().then(() => {\n setIsInitialized(true);\n const currentContext = engine.getContext();\n if (currentContext) {\n setContext(currentContext);\n }\n });\n\n // Subscribe to context updates\n const unsubscribe = engine.subscribe((newContext) => {\n setContext(newContext);\n });\n\n // Cleanup\n return () => {\n unsubscribe();\n engine.destroy();\n engineRef.current = null;\n };\n }, []);\n\n // Execute action\n const execute = useCallback(async (command: ActionCommand): Promise<ActionResult> => {\n if (!engineRef.current) {\n return {\n success: false,\n message: 'Engine not initialized',\n error: 'UUICS engine is not available',\n };\n }\n\n return engineRef.current.execute(command);\n }, []);\n\n // Execute batch\n const executeBatch = useCallback(async (commands: ActionCommand[]): Promise<ActionResult[]> => {\n if (!engineRef.current) {\n return [];\n }\n\n return engineRef.current.executeBatch(commands);\n }, []);\n\n // Serialize context\n const serialize = useCallback((format?: 'json' | 'natural' | 'openapi'): string => {\n if (!engineRef.current) {\n return '';\n }\n\n return engineRef.current.serialize(format);\n }, []);\n\n // Manual scan\n const scan = useCallback(async (): Promise<PageContext | null> => {\n if (!engineRef.current) {\n return null;\n }\n\n return engineRef.current.scan();\n }, []);\n\n return {\n context,\n isInitialized,\n execute,\n executeBatch,\n serialize,\n scan,\n engine: engineRef.current,\n };\n}\n\n","/**\n * Hook to access a specific UI element\n */\n\nimport { useMemo } from 'react';\nimport type { UIElement } from '@angelerator/uuics-core';\nimport { useUICS } from './useUICS';\n\n/**\n * Hook to find and track a specific UI element\n */\nexport function useUIElement(selector: string): UIElement | null {\n const { context } = useUICS();\n\n const element = useMemo(() => {\n if (!context) {\n return null;\n }\n\n return context.elements.find(el => el.selector === selector) ?? null;\n }, [context, selector]);\n\n return element;\n}\n\n/**\n * Hook to find elements by type\n */\nexport function useUIElements(type: string): UIElement[] {\n const { context } = useUICS();\n\n const elements = useMemo(() => {\n if (!context) {\n return [];\n }\n\n return context.elements.filter(el => el.type === type);\n }, [context, type]);\n\n return elements;\n}\n\n","/**\n * UUICS Context Provider for React\n */\n\nimport { createContext, useContext, ReactNode } from 'react';\nimport type { UUICSConfig } from '@angelerator/uuics-core';\nimport { useUICS } from '../hooks/useUICS';\n\n/**\n * UUICS Context type\n */\ntype UUICSContextType = ReturnType<typeof useUICS>;\n\n/**\n * UUICS Context\n */\nconst UUICSContext = createContext<UUICSContextType | null>(null);\n\n/**\n * Provider props\n */\ninterface UUICSProviderProps {\n children: ReactNode;\n config?: UUICSConfig;\n}\n\n/**\n * UUICS Provider component\n */\nexport function UUICSProvider({ children, config }: UUICSProviderProps) {\n const uuics = useUICS(config);\n\n return (\n <UUICSContext.Provider value={uuics}>\n {children}\n </UUICSContext.Provider>\n );\n}\n\n/**\n * Hook to use UUICS from context\n */\nexport function useUUICSContext(): UUICSContextType {\n const context = useContext(UUICSContext);\n\n if (!context) {\n throw new Error('useUUICSContext must be used within a UUICSProvider');\n }\n\n return context;\n}\n\n","/**\n * Debug Panel component to display UUICS context\n */\n\nimport React, { useState } from 'react';\nimport { useUUICSContext } from './UUICSProvider';\n\ninterface DebugPanelProps {\n format?: 'json' | 'natural' | 'openapi';\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * Debug Panel component\n */\nexport function DebugPanel({ \n format = 'natural',\n className = '',\n style = {},\n}: DebugPanelProps) {\n const { context, serialize, isInitialized } = useUUICSContext();\n const [isExpanded, setIsExpanded] = useState(true);\n const [selectedFormat, setSelectedFormat] = useState<'json' | 'natural' | 'openapi'>(format);\n\n if (!isInitialized) {\n return (\n <div className={`uuics-debug-panel loading ${className}`} style={style}>\n <div className=\"uuics-debug-header\">\n <h3>UUICS Debug Panel</h3>\n </div>\n <div className=\"uuics-debug-content\">\n Initializing...\n </div>\n </div>\n );\n }\n\n const serializedContext = serialize(selectedFormat);\n\n return (\n <div className={`uuics-debug-panel ${className}`} style={style}>\n <div className=\"uuics-debug-header\">\n <h3>UUICS Debug Panel</h3>\n <button onClick={() => setIsExpanded(!isExpanded)}>\n {isExpanded ? 'Collapse' : 'Expand'}\n </button>\n </div>\n\n {isExpanded && (\n <>\n <div className=\"uuics-debug-controls\">\n <label>\n Format:\n <select \n value={selectedFormat} \n onChange={(e) => setSelectedFormat(e.target.value as any)}\n >\n <option value=\"natural\">Natural Language</option>\n <option value=\"json\">JSON</option>\n <option value=\"openapi\">OpenAPI</option>\n </select>\n </label>\n \n {context && (\n <div className=\"uuics-debug-stats\">\n <span>Elements: {context.elements.length}</span>\n <span>Actions: {context.actions.length}</span>\n </div>\n )}\n </div>\n\n <div className=\"uuics-debug-content\">\n <pre>{serializedContext}</pre>\n </div>\n </>\n )}\n </div>\n );\n}\n\n"]}