import { FormEventHandler, useEffect, useState } from "react" import { Form, Button, Card } from "react-bootstrap" import { MapContainer, TileLayer } from 'react-leaflet' import { latLng } from "leaflet" import { ClickHandler, LocationMarker, TrashboxMarkers } from "../components" import { useAddAnnouncement, useTrashboxes } from "../hooks/api" import { categoryNames } from "../assets/category" import { stations, lines, lineNames } from "../assets/metro" import { isObject } from "../utils/types" 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) const fetchData: unknown = await res.json() console.log("f", fetchData) } catch (err) { console.error(err) } })() }, [address]) 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}`) const fetchData: unknown = await res.json() if (!isObject<{ display_name: string }>(fetchData, { "display_name": "string" })) { throw new Error("Malformed server response") } setAddress(fetchData.display_name) } catch (err) { console.error(err) } })() }, [addressPosition]) const { doAdd, status } = useAddAnnouncement() const handleSubmit: FormEventHandler = (event) => { event.preventDefault() event.stopPropagation() const formData = new FormData(event.currentTarget) formData.append("latitude", addressPosition.lat.toString()) formData.append("longtitude", addressPosition.lng.toString()) formData.append("address", address) formData.set("bestBy", new Date((formData.get("bestBy") as number | null) || 0).getTime().toString()) void doAdd(formData) } return (
Заголовок объявления Категория {Array.from(categoryNames).map( ([category, categoryName]) => )} Срок годности Адрес выдачи

Адрес: {address}

Описание Иллюстрация (фото или видео) Станция метро {lines.map( line => {Array.from(stations[line]).map(metro => )} )} Пункт сбора мусора
{trashboxes.loading ? (

Загрузка...

) : ( trashboxes.error ? (

{trashboxes.error}

) : ( ) ) }
{selectedTrashbox.index > -1 ? (

Выбран пункт сбора мусора на { trashboxes.data[selectedTrashbox.index].Address } с категорией {selectedTrashbox.category}

) : (

Выберите пунк сбора мусора и категорию

)}
) } export default AddPage