Added osmAddress api route

Related to #19
This commit is contained in:
2023-07-15 11:08:15 +03:00
parent 2ce0e5b65d
commit cb848739e5
5 changed files with 65 additions and 37 deletions

View File

@ -5,56 +5,37 @@ import { latLng } from 'leaflet'
import { ClickHandler, LocationMarker, TrashboxMarkers } from '../components'
import { useAddAnnouncement, useTrashboxes } from '../hooks/api'
import { isObject } from '../utils/types'
import { handleHTTPErrors } from '../utils'
import { categories, categoryNames } from '../assets/category'
import { stations, lines, lineNames } from '../assets/metro'
import { gotError } from '../hooks/api/useFetch'
import { fallbackError, gotError } from '../hooks/api/useFetch'
import { useOsmAddresses } from '../hooks/api'
function AddPage() {
const [addressPosition, setAddressPosition] = useState(latLng(59.972, 30.3227))
const [address, setAddress] = useState('')
const trashboxes = useTrashboxes(addressPosition)
const [selectedTrashbox, setSelectedTrashbox] = useState({ index: -1, category: '' })
useEffect(() => {
void (async () => {
try {
const res = await fetch(location.protocol + '//nominatim.openstreetmap.org/search?format=json&q=' + address)
handleHTTPErrors(res)
const fetchData: unknown = await res.json()
console.log('f', fetchData)
} catch (err) {
console.error(err)
}
})()
}, [address])
const address = useOsmAddresses(addressPosition)
useEffect(() => {
void (async () => {
try {
const res = await fetch(`${location.protocol}//nominatim.openstreetmap.org/reverse?format=json&accept-language=ru&lat=${addressPosition.lat}&lon=${addressPosition.lng}`)
if (!gotError(address))
void (async () => {
try {
const res = await fetch(location.protocol + '//nominatim.openstreetmap.org/search?format=json&q=' + encodeURIComponent(address.data))
handleHTTPErrors(res)
handleHTTPErrors(res)
const fetchData: unknown = await res.json()
const fetchData: unknown = await res.json()
if (!isObject<{ display_name: string }>(fetchData, { 'display_name': 'string' })) {
throw new Error('Malformed server response')
console.log('f', fetchData)
} catch (err) {
console.error(err)
}
setAddress(fetchData.display_name)
} catch (err) {
console.error(err)
}
})()
}, [addressPosition])
})()
}, [address])
const { doAdd, status } = useAddAnnouncement()
@ -66,7 +47,7 @@ function AddPage() {
formData.append('latitude', addressPosition.lat.toString())
formData.append('longtitude', addressPosition.lng.toString())
formData.append('address', address)
formData.append('address', address.data || '') // if address.error
formData.set('bestBy', new Date((formData.get('bestBy') as number | null) || 0).getTime().toString())
void doAdd(formData)
@ -112,7 +93,7 @@ function AddPage() {
url='https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'
/>
<LocationMarker
address={address}
address={fallbackError(address)}
position={addressPosition}
setPosition={setAddressPosition}
/>
@ -121,7 +102,7 @@ function AddPage() {
/>
</MapContainer>
</div>
<p>Адрес: {address}</p>
<p>Адрес: {fallbackError(address)}</p>
</Form.Group>
<Form.Group className='mb-3' controlId='description'>