import { observer } from 'mobx-react-lite'; import React, { useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useVizStore } from '../../store'; import Spinner from '../spinner'; import type { IGeoDataItem, IGeoUrl, Topology } from '../../interfaces'; import DropdownSelect from '../dropdownSelect'; import Dropzone from 'react-dropzone'; import { GeojsonRenderer } from './geojsonRenderer'; import { Button } from '../ui/button'; import { Dialog, DialogContent, DialogFooter } from '../ui/dialog'; import { Input } from '../ui/input'; import { RadioGroup, RadioGroupItem } from '../ui/radio-group'; const emptyList = []; const GeoConfigPanel = ({ geoList = emptyList }: { geoList?: IGeoDataItem[] }) => { const vizStore = useVizStore(); const { layout, showGeoJSONConfigPanel } = vizStore; const { geoKey, geojson, geoUrl } = layout; const { t: tGlobal } = useTranslation('translation'); const { t } = useTranslation('translation', { keyPrefix: 'main.tabpanel.settings' }); const [dataMode, setDataMode] = useState<'GeoJSON' | 'TopoJSON'>(geoUrl?.type ?? 'GeoJSON'); const [featureId, setFeatureId] = useState(''); const [url, setUrl] = useState(geoUrl?.url ?? ''); const [geoJSON, setGeoJSON] = useState(''); const [topoJSON, setTopoJSON] = useState(''); const [topoJSONKey, setTopoJSONKey] = useState(''); const [loadedUrl, setLoadedUrl] = useState(geoUrl); const [loading, setLoading] = useState(false); const hasCustomData = url || geojson; const [selectItem, setSelectItemR] = useState(() => { const i = geoList.findIndex((x) => x.url === geoUrl?.url && x.type === geoUrl?.type); if (i === -1 && hasCustomData) { return -2; } return i; }); const options = useMemo( () => [{ label: 'Select a Geographic Data', value: '-1' }] .concat( geoList.map((x, i) => ({ label: x.name, value: `${i}`, })) ) .concat({ label: 'Manual Configuration', value: '-2' }), [geoList] ); const setSelectItem = useMemo(() => (a: string) => setSelectItemR(parseInt(a)), []); const isCustom = (geoList ?? []).length === 0 || selectItem === -2; const defaultTopoJSONKey = useMemo(() => { try { const value = JSON.parse(topoJSON) as Topology; return Object.keys(value.objects)[0] || ''; } catch (error) { return ''; } }, [topoJSON]); useEffect(() => { setFeatureId(geoKey || ''); }, [geoKey]); useEffect(() => { setGeoJSON(geojson ? JSON.stringify(geojson, null, 2) : ''); }, [geojson]); const handleSubmit = () => { if (!isCustom) { const item = geoList[selectItem]; if (!item) { vizStore.clearGeographicData(); vizStore.updateGeoKey(featureId); } else { vizStore.setVisualLayout('geoUrl', { type: item.type, url: item.url, }); } vizStore.setShowGeoJSONConfigPanel(false); return; } try { if (!(dataMode === 'GeoJSON' ? geoJSON : topoJSON) && loadedUrl) { vizStore.setShowGeoJSONConfigPanel(false); return; } const json = JSON.parse(dataMode === 'GeoJSON' ? geoJSON : topoJSON); if (dataMode === 'TopoJSON') { vizStore.setGeographicData( { type: 'TopoJSON', data: json, objectKey: topoJSONKey || defaultTopoJSONKey, }, featureId, loadedUrl?.type === 'TopoJSON' ? loadedUrl : undefined ); } else { vizStore.setGeographicData( { type: 'GeoJSON', data: json, }, featureId, loadedUrl?.type === 'GeoJSON' ? loadedUrl : undefined ); } vizStore.setShowGeoJSONConfigPanel(false); } catch (err) { console.error(err); } }; return ( { vizStore.setShowGeoJSONConfigPanel(false); }} >

{t('geography')}

setFeatureId(e.target.value)} />
{geoList.length > 0 && (
)} {!isCustom && selectItem >= 0 && (
)} {isCustom && (
setDataMode(v as 'GeoJSON' | 'TopoJSON')} className="flex items-center space-x-2" >
{ setUrl(e.target.value); }} />
{ const f: File = acceptedFiles[0]; if (f) { const reader = new FileReader(); reader.addEventListener('load', (event) => { const data = event.target!.result as string; setLoadedUrl(undefined); (dataMode === 'GeoJSON' ? setGeoJSON : setTopoJSON)(data); }); reader.readAsText(f); } }} noClick > {({ getRootProps, getInputProps, isDragActive, open }) => (
{isDragActive && (
)}
{t('geography_settings.jsonInputPlaceholder', { format: dataMode.toLowerCase() })}
)} {dataMode === 'TopoJSON' && (
{ setTopoJSONKey(e.target.value); }} />
)}
)}
); }; export default observer(GeoConfigPanel);