33
44import React , { useCallback , useEffect , useState } from 'react' ;
55import styled from 'styled-components' ;
6- import { WMSCapabilities , WMSCapabilitiesLoader } from '@loaders.gl/wms' ;
7- import { load } from '@loaders.gl/core' ;
6+ import { WMSCapabilities } from '@loaders.gl/wms' ;
7+
8+ import { validateUrl } from '@kepler.gl/common-utils' ;
9+ import { DatasetType , REMOTE_TILE , RemoteTileFormat , WMSDatasetMetadata } from '@kepler.gl/constants' ;
10+ import { getWMSCapabilities , wmsCapabilitiesToDatasetMetadata } from '@kepler.gl/table' ;
811
9- import { DatasetType , REMOTE_TILE , RemoteTileFormat } from '@kepler.gl/constants' ;
1012import { MetaResponse } from './common' ;
1113import { InputLight } from '../../common' ;
1214
@@ -26,14 +28,18 @@ type WMSTileFormProps = {
2628 setResponse : ( response : MetaResponse ) => void ;
2729} ;
2830
31+ type WMSData = {
32+ metadata : WMSCapabilities | null ;
33+ layers : WMSDatasetMetadata [ 'layers' ] ;
34+ version : string ;
35+ } ;
36+
2937const TilesetWMSForm : React . FC < WMSTileFormProps > = ( { setResponse} ) => {
3038 const [ layerName , setLayerName ] = useState < string > ( '' ) ;
3139 const [ wmsUrl , setWmsUrl ] = useState < string > ( '' ) ;
32- const [ metadata , setMetadata ] = useState < any > ( null ) ;
3340 const [ loading , setLoading ] = useState < boolean > ( false ) ;
3441 const [ error , setError ] = useState < Error | null > ( null ) ;
35- const [ availableLayers , setAvailableLayers ] = useState < { name : string ; title : string } [ ] > ( [ ] ) ;
36- const [ wmsVersion , setWmsVersion ] = useState < string > ( '1.3.0' ) ;
42+ const [ wmsData , setWMSData ] = useState < WMSData | null > ( null ) ;
3743
3844 const onLayerNameChange = useCallback (
3945 ( event : React . ChangeEvent < HTMLInputElement > ) => {
@@ -49,48 +55,34 @@ const TilesetWMSForm: React.FC<WMSTileFormProps> = ({setResponse}) => {
4955 const newWmsUrl = event . target . value ;
5056 setWmsUrl ( newWmsUrl ) ;
5157
58+ if ( ! validateUrl ( newWmsUrl ) ) {
59+ setWMSData ( null ) ;
60+ return ;
61+ }
62+
5263 // Fetch WMS GetCapabilities
5364 try {
5465 setLoading ( true ) ;
5566 setError ( null ) ;
56- const data = ( await load (
57- ` ${ newWmsUrl } ?service=WMS&request=GetCapabilities` ,
58- WMSCapabilitiesLoader
59- ) ) as WMSCapabilities ;
67+
68+ const data = await getWMSCapabilities ( newWmsUrl ) ;
69+
70+ const datasetMetadata = wmsCapabilitiesToDatasetMetadata ( data ) ;
6071
6172 // Extract name or title from GetCapabilities response
6273 const serviceTitle = data ?. title || data ?. name ;
6374 if ( serviceTitle && ! layerName ) {
6475 setLayerName ( serviceTitle ) ;
6576 }
6677
67- // Flatten layers if they are nested
68- const layers = data . layers . flatMap ( layer => {
69- if ( layer . layers && layer . layers . length > 0 ) {
70- return layer . layers ;
71- }
72- return layer ;
78+ setWMSData ( {
79+ metadata : data ,
80+ layers : datasetMetadata . layers ,
81+ version : datasetMetadata . version
7382 } ) ;
74-
75- if ( Array . isArray ( layers ) ) {
76- const layerOptions = layers . map ( ( layer : any ) => ( {
77- name : layer . name ,
78- title : layer . title || layer . name ,
79- boundingBox : layer . geographicBoundingBox
80- } ) ) ;
81- setAvailableLayers ( layerOptions ) ;
82- } else {
83- setAvailableLayers ( [ ] ) ;
84- }
85-
86- // Set WMS version
87- const version = data . version || '1.3.0' ;
88- setWmsVersion ( version ) ;
89-
90- setMetadata ( data ) ;
9183 } catch ( err ) {
9284 setError ( err instanceof Error ? err : new Error ( 'Unknown error' ) ) ;
93- setMetadata ( null ) ;
85+ setWMSData ( null ) ;
9486 } finally {
9587 setLoading ( false ) ;
9688 }
@@ -108,12 +100,12 @@ const TilesetWMSForm: React.FC<WMSTileFormProps> = ({setResponse}) => {
108100 remoteTileFormat : RemoteTileFormat . WMS ,
109101 tilesetDataUrl : wmsUrl ,
110102 tilesetMetadataUrl : `${ wmsUrl } ?service=WMS&request=GetCapabilities` ,
111- layers : availableLayers ,
112- wmsVersion : wmsVersion
103+ layers : wmsData ?. layers || [ ] ,
104+ wmsVersion : wmsData ?. version || '1.3.0'
113105 }
114106 } ;
115107 setResponse ( {
116- metadata,
108+ metadata : wmsData ?. metadata ?? null ,
117109 dataset,
118110 loading,
119111 error
@@ -126,7 +118,7 @@ const TilesetWMSForm: React.FC<WMSTileFormProps> = ({setResponse}) => {
126118 error
127119 } ) ;
128120 }
129- } , [ setResponse , layerName , wmsUrl , metadata , loading , error , availableLayers , wmsVersion ] ) ;
121+ } , [ setResponse , layerName , wmsUrl , wmsData , loading , error ] ) ;
130122
131123 return (
132124 < TilesetInputContainer >
0 commit comments