{"version":3,"file":"react.cjs","sources":["../src/lib/core/BasemapControlReact.tsx","../src/lib/hooks/useBasemapState.ts"],"sourcesContent":["import { useEffect, useMemo, useRef } from 'react';\nimport { BasemapControl } from './BasemapControl';\nimport { createBasemapCatalog } from './catalog';\nimport type { BasemapControlReactProps } from './types';\n\nexport function BasemapControlReact({\n  map,\n  onStateChange,\n  onBasemapChange,\n  onBasemapRemove,\n  onError,\n  activeBasemapId,\n  ...options\n}: BasemapControlReactProps): null {\n  const controlRef = useRef<BasemapControl | null>(null);\n  const basemapKey = useMemo(\n    () => options.basemaps?.map((basemap) => basemap.id).join('|') ?? '',\n    [options.basemaps],\n  );\n  const didInitCatalog = useRef(false);\n\n  useEffect(() => {\n    const control = new BasemapControl({\n      ...options,\n      defaultBasemapId: activeBasemapId ?? options.defaultBasemapId,\n    });\n    controlRef.current = control;\n\n    if (onStateChange) {\n      control.on('statechange', (event) => onStateChange(event.state));\n    }\n    if (onBasemapChange) {\n      control.on('basemapchange', (event) => {\n        if (event.type === 'basemapchange') {\n          onBasemapChange(event.basemap, event.state);\n        }\n      });\n    }\n    if (onBasemapRemove) {\n      control.on('basemapremove', (event) => {\n        if (event.type === 'basemapremove') {\n          onBasemapRemove(event.basemap, event.state);\n        }\n      });\n    }\n    if (onError) {\n      control.on('error', (event) => {\n        if (event.type === 'error') {\n          onError(event.error, event.state);\n        }\n      });\n    }\n\n    map.addControl(control, options.position ?? 'top-right');\n\n    return () => {\n      if (map.hasControl(control)) {\n        map.removeControl(control);\n      }\n      controlRef.current = null;\n    };\n  }, [map]);\n\n  useEffect(() => {\n    const control = controlRef.current;\n    if (!control) return;\n    // Skip the first run: the control was just built with this catalog.\n    // Updating in place (instead of recreating the control) avoids tearing\n    // down and re-adding the managed basemap layer on catalog changes.\n    if (!didInitCatalog.current) {\n      didInitCatalog.current = true;\n      return;\n    }\n    control.setBasemaps(createBasemapCatalog(options.basemaps, options.includeDefaultBasemaps));\n  }, [basemapKey]);\n\n  useEffect(() => {\n    const control = controlRef.current;\n    if (!control || options.collapsed === undefined) return;\n\n    const currentState = control.getState();\n    if (options.collapsed === currentState.collapsed) return;\n\n    if (options.collapsed) {\n      control.collapse();\n    } else {\n      control.expand();\n    }\n  }, [options.collapsed]);\n\n  useEffect(() => {\n    const control = controlRef.current;\n    if (!control || !activeBasemapId) return;\n    if (control.getState().activeBasemapId === activeBasemapId) return;\n\n    // Failures are surfaced through the control's error event (onError);\n    // swallow the rejection so it does not become an unhandled rejection.\n    control.setBasemap(activeBasemapId).catch(() => {});\n  }, [activeBasemapId]);\n\n  return null;\n}\n","import { useCallback, useState } from 'react';\nimport type { BasemapControlState } from '../core/types';\n\nconst DEFAULT_STATE: BasemapControlState = {\n  collapsed: true,\n  panelWidth: 340,\n  activeBasemapIds: [],\n  allowMultiple: false,\n  query: '',\n  providerFilter: '',\n  categoryFilter: '',\n  beforeId: '',\n  loading: false,\n};\n\nexport function useBasemapState(initialState?: Partial<BasemapControlState>) {\n  const [state, setState] = useState<BasemapControlState>({\n    ...DEFAULT_STATE,\n    ...initialState,\n  });\n\n  const setCollapsed = useCallback((collapsed: boolean) => {\n    setState((prev) => ({ ...prev, collapsed }));\n  }, []);\n\n  const setPanelWidth = useCallback((panelWidth: number) => {\n    setState((prev) => ({ ...prev, panelWidth }));\n  }, []);\n\n  const setActiveBasemapId = useCallback((activeBasemapId: string | undefined) => {\n    setState((prev) => ({\n      ...prev,\n      activeBasemapId,\n      activeBasemapIds: activeBasemapId ? [activeBasemapId] : [],\n    }));\n  }, []);\n\n  const setActiveBasemapIds = useCallback((activeBasemapIds: string[]) => {\n    setState((prev) => ({\n      ...prev,\n      activeBasemapIds,\n      activeBasemapId: activeBasemapIds[activeBasemapIds.length - 1],\n    }));\n  }, []);\n\n  const setQuery = useCallback((query: string) => {\n    setState((prev) => ({ ...prev, query }));\n  }, []);\n\n  const reset = useCallback(() => {\n    setState({ ...DEFAULT_STATE, ...initialState });\n  }, [initialState]);\n\n  const toggle = useCallback(() => {\n    setState((prev) => ({ ...prev, collapsed: !prev.collapsed }));\n  }, []);\n\n  return {\n    state,\n    setState,\n    setCollapsed,\n    setPanelWidth,\n    setActiveBasemapId,\n    setActiveBasemapIds,\n    setQuery,\n    reset,\n    toggle,\n  };\n}\n"],"names":["useRef","useMemo","useEffect","BasemapControl","createBasemapCatalog","useState","useCallback"],"mappings":"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"}