{"version":3,"file":"react.cjs","sources":["../src/lib/core/NoaaLidarControlReact.tsx","../src/lib/hooks/useNoaaLidarState.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport type { NoaaLidarControlReactProps } from './types';\nimport { NoaaLidarControl } from './NoaaLidarControl';\n\n/**\n * React wrapper component for NoaaLidarControl.\n *\n * @example\n * ```tsx\n * function MyMap() {\n *   const [map, setMap] = useState<Map | null>(null);\n *\n *   return (\n *     <div>\n *       <Map onLoad={setMap} />\n *       {map && (\n *         <NoaaLidarControlReact\n *           map={map}\n *           title=\"NOAA Coastal LiDAR\"\n *           onSearchComplete={(items) => console.log('Found:', items.length)}\n *         />\n *       )}\n *     </div>\n *   );\n * }\n * ```\n */\nexport function NoaaLidarControlReact({\n  map,\n  onStateChange,\n  onSearchComplete,\n  onItemLoad,\n  onError,\n  onControlReady,\n  ...options\n}: NoaaLidarControlReactProps): null {\n  const controlRef = useRef<NoaaLidarControl | null>(null);\n  const addedRef = useRef(false);\n\n  useEffect(() => {\n    if (!map || addedRef.current) return;\n\n    // Create and add control\n    const control = new NoaaLidarControl(options);\n    controlRef.current = control;\n\n    // Set up event listeners\n    if (onStateChange) {\n      control.on('statechange', (event) => {\n        onStateChange(event.state);\n      });\n    }\n\n    if (onSearchComplete) {\n      control.on('searchcomplete', (event) => {\n        if (event.items) {\n          onSearchComplete(event.items);\n        }\n      });\n    }\n\n    if (onItemLoad) {\n      control.on('loadcomplete', (event) => {\n        if (event.pointCloud) {\n          onItemLoad(event.pointCloud);\n        }\n      });\n    }\n\n    if (onError) {\n      control.on('searcherror', (event) => {\n        if (event.error) {\n          onError(event.error);\n        }\n      });\n      control.on('loaderror', (event) => {\n        if (event.error) {\n          onError(event.error);\n        }\n      });\n    }\n\n    // Add control to map\n    map.addControl(control, options.position ?? 'top-right');\n    addedRef.current = true;\n\n    // Notify when ready\n    if (onControlReady) {\n      onControlReady(control);\n    }\n\n    return () => {\n      if (controlRef.current && map) {\n        try {\n          map.removeControl(controlRef.current);\n        } catch {\n          // Control may already be removed\n        }\n      }\n      controlRef.current = null;\n      addedRef.current = false;\n    };\n  }, [map]);\n\n  // Handle option changes\n  useEffect(() => {\n    if (controlRef.current && options.collapsed !== undefined) {\n      if (options.collapsed) {\n        controlRef.current.collapse();\n      } else {\n        controlRef.current.expand();\n      }\n    }\n  }, [options.collapsed]);\n\n  // This component renders nothing - it's just a controller\n  return null;\n}\n","import { useState, useCallback } from 'react';\nimport type { NoaaLidarState, UnifiedSearchItem, DataSourceType } from '../core/types';\n\n/**\n * Initial state for the NOAA LiDAR control\n */\nconst createInitialState = (options?: Partial<NoaaLidarState>): NoaaLidarState => ({\n  collapsed: true,\n  panelWidth: 380,\n  maxHeight: 500,\n  dataSource: 'ept',\n  searchMode: 'none',\n  isDrawing: false,\n  drawnBbox: null,\n  searchResults: [],\n  selectedItems: new Set(),\n  isSearching: false,\n  searchError: null,\n  totalMatched: null,\n  loadedItems: new Map(),\n  lidarState: null,\n  ...options,\n});\n\n/**\n * Custom hook for managing NOAA LiDAR control state in React applications.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n *   const {\n *     state,\n *     toggle,\n *     setSearchResults,\n *     selectItem,\n *     deselectItem,\n *   } = useNoaaLidarState({ collapsed: false });\n *\n *   return (\n *     <div>\n *       <button onClick={toggle}>\n *         {state.collapsed ? 'Expand' : 'Collapse'}\n *       </button>\n *       <p>Results: {state.searchResults.length}</p>\n *     </div>\n *   );\n * }\n * ```\n */\nexport function useNoaaLidarState(initialOptions?: Partial<NoaaLidarState>) {\n  const [state, setState] = useState<NoaaLidarState>(() =>\n    createInitialState(initialOptions)\n  );\n\n  /**\n   * Toggles the collapsed state\n   */\n  const toggle = useCallback(() => {\n    setState((prev) => ({ ...prev, collapsed: !prev.collapsed }));\n  }, []);\n\n  /**\n   * Expands the panel\n   */\n  const expand = useCallback(() => {\n    setState((prev) => ({ ...prev, collapsed: false }));\n  }, []);\n\n  /**\n   * Collapses the panel\n   */\n  const collapse = useCallback(() => {\n    setState((prev) => ({ ...prev, collapsed: true }));\n  }, []);\n\n  /**\n   * Sets search results\n   */\n  const setSearchResults = useCallback((results: UnifiedSearchItem[], totalMatched?: number) => {\n    setState((prev) => ({\n      ...prev,\n      searchResults: results,\n      totalMatched: totalMatched ?? results.length,\n      selectedItems: new Set(),\n      isSearching: false,\n    }));\n  }, []);\n\n  /**\n   * Selects an item\n   */\n  const selectItem = useCallback((item: UnifiedSearchItem) => {\n    setState((prev) => {\n      const newSelected = new Set(prev.selectedItems);\n      newSelected.add(item.id);\n      return { ...prev, selectedItems: newSelected };\n    });\n  }, []);\n\n  /**\n   * Deselects an item\n   */\n  const deselectItem = useCallback((item: UnifiedSearchItem) => {\n    setState((prev) => {\n      const newSelected = new Set(prev.selectedItems);\n      newSelected.delete(item.id);\n      return { ...prev, selectedItems: newSelected };\n    });\n  }, []);\n\n  /**\n   * Toggles item selection\n   */\n  const toggleItemSelection = useCallback((item: UnifiedSearchItem) => {\n    setState((prev) => {\n      const newSelected = new Set(prev.selectedItems);\n      if (newSelected.has(item.id)) {\n        newSelected.delete(item.id);\n      } else {\n        newSelected.add(item.id);\n      }\n      return { ...prev, selectedItems: newSelected };\n    });\n  }, []);\n\n  /**\n   * Sets the data source\n   * @deprecated NOAA data is EPT-only, this function is kept for compatibility\n   */\n  const setDataSource = useCallback((source: DataSourceType) => {\n    setState((prev) => ({\n      ...prev,\n      dataSource: source,\n      searchResults: [],\n      selectedItems: new Set(),\n      totalMatched: null,\n    }));\n  }, []);\n\n  /**\n   * Clears all selections\n   */\n  const clearSelection = useCallback(() => {\n    setState((prev) => ({ ...prev, selectedItems: new Set() }));\n  }, []);\n\n  /**\n   * Sets the drawn bounding box\n   */\n  const setDrawnBbox = useCallback((bbox: [number, number, number, number] | null) => {\n    setState((prev) => ({ ...prev, drawnBbox: bbox }));\n  }, []);\n\n  /**\n   * Sets the searching state\n   */\n  const setSearching = useCallback((isSearching: boolean) => {\n    setState((prev) => ({ ...prev, isSearching }));\n  }, []);\n\n  /**\n   * Sets a search error\n   */\n  const setSearchError = useCallback((error: string | null) => {\n    setState((prev) => ({ ...prev, searchError: error, isSearching: false }));\n  }, []);\n\n  /**\n   * Clears search results\n   */\n  const clearResults = useCallback(() => {\n    setState((prev) => ({\n      ...prev,\n      searchResults: [],\n      selectedItems: new Set(),\n      totalMatched: null,\n    }));\n  }, []);\n\n  /**\n   * Resets to initial state\n   */\n  const reset = useCallback(() => {\n    setState(createInitialState(initialOptions));\n  }, [initialOptions]);\n\n  return {\n    state,\n    setState,\n    toggle,\n    expand,\n    collapse,\n    setSearchResults,\n    selectItem,\n    deselectItem,\n    toggleItemSelection,\n    clearSelection,\n    setDrawnBbox,\n    setSearching,\n    setSearchError,\n    clearResults,\n    setDataSource,\n    reset,\n  };\n}\n"],"names":["useRef","useEffect","NoaaLidarControl","useState","useCallback"],"mappings":"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"}