import { Coordinate } from 'ol/coordinate'; import { Component, createEffect, createSignal } from 'solid-js'; import { useNavigate } from '@solidjs/router'; import SearchIcon from '@suid/icons-material/Search'; import { useI18n } from '@solid-primitives/i18n'; import proj4 from 'proj4'; import style from './Finder.module.css'; import { Box, Button, IconButton, TextField } from '@suid/material'; import Dialog from '../dialog'; import { getMap, getState } from '../map'; import { Overlay } from 'ol'; import { fromLonLat } from 'ol/proj'; import WptEditDialog from '../wpt/WptEditDialog'; interface Props {} const Finder: Component = (props) => { const [open, setOpen] = createSignal(false); const [searchString, setSearchString] = createSignal(''); const [popupContent, setPopupContent] = createSignal(<>); const navigate = useNavigate(); const [t, { add, locale, dict }] = useI18n(); const [popup, setPopup] = createSignal(); const [coordinate, setCoordinate] = createSignal(); const searchStringChangeHandler = (event: any) => { setSearchString(event.target.value); }; const popupCloseHandler = () => { popup()?.setMap(null); }; let popupElement: HTMLElement; const submitHandler = () => { const latLonRegExp = /(-?[0-9]+.[0-9]+)\s*,\s*(-?[0-9]+.[0-9]+)/; const latLonMatch = searchString().match(latLonRegExp); if (!!latLonMatch) { setCoordinate([+latLonMatch[2], +latLonMatch[1]]); setPopupContent(<>{latLonMatch[0]}); console.log({ caller: 'Finder / submitHandler', searchString: searchString(), latLonMatch, coordinate: coordinate(), }); } else { const utmRegExp = /([0-6]?[0-9])\s*([C-X])\s*([0-9]+)\s*([0-9]+)/; const utmMatch = searchString().match(utmRegExp); if (!!utmMatch) { const utm = `+proj=utm +zone=${utmMatch[1]}`; setCoordinate(proj4(utm, 'EPSG:4326', [+utmMatch[3], +utmMatch[4]])); setPopupContent( <>{`${coordinate()[0]}, ${coordinate()[1]} (UTM ${utmMatch[0]})`} ); } console.log({ caller: 'Finder / submitHandler', searchString: searchString(), utmMatch, coordinate: coordinate(), }); } if (!!coordinate()) { setOpen(false); if (popup() === undefined) { setPopup( new Overlay({ element: popupElement, positioning: 'center-center', }) ); } console.log({ caller: 'Finder / submitHandler / popup', searchString: searchString(), coordinate: coordinate(), popup: popup(), popupElement, }); popup().setMap(getMap()); popup().setPosition(fromLonLat(coordinate())); getMap()?.addOverlay(popup()); navigate( `/map/${getState().provider}/${coordinate()[0]}/${coordinate()[1]}/16/${ getState().rotation }` ); } }; const [openCreateWptDialog, setOpenCreateWptDialog] = createSignal(false); const createWptCloseHandler = () => { setOpenCreateWptDialog(false); popupCloseHandler(); }; return ( <>
{ setOpen(true); }} >
{ setOpen(false); }} open={open()} title={t('search')} >
{popupContent()}
); }; export default Finder;