/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ /* eslint-disable @typescript-eslint/prefer-ts-expect-error */ /* eslint-disable @typescript-eslint/ban-ts-comment */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ /* eslint-disable @typescript-eslint/no-unsafe-call */ import { control } from 'leaflet' import { useEffect, useRef, useState } from 'react' import { useMap, useMapEvents } from 'react-leaflet' import TargetSVG from '#assets/target.svg' // eslint-disable-next-line import/no-unassigned-import import 'leaflet.locatecontrol' import 'leaflet.locatecontrol/dist/L.Control.Locate.css' // Converts leaflet.locatecontrol to a React Component export const LocateControl = () => { const map = useMap() // prevent react18 from calling useEffect twice const init = useRef(false) const [lc, setLc] = useState(null) const [active, setActive] = useState(false) const [loading, setLoading] = useState(false) useEffect(() => { if (!init.current) { // @ts-ignore setLc(control.locate().addTo(map)) init.current = true } // eslint-disable-next-line react-hooks/exhaustive-deps }, []) useMapEvents({ locationfound: () => { setLoading(false) setActive(true) }, }) return ( <>
{ if (active) { lc.stop() setActive(false) } else { lc.start() setLoading(true) } }} > {loading ? ( ) : ( x )}
) }