[364f27d] | 1 | import React, { useState } from "react";
|
---|
| 2 | import { useNavigate, useLocation} from "react-router-dom";
|
---|
| 3 | import CenteredContainer from "../UtilComponents/CenteredContainer";
|
---|
| 4 | import axios from "../../custom-axios/axios";
|
---|
| 5 | import { MapContainer, TileLayer, Marker, Popup, useMapEvents } from 'react-leaflet'
|
---|
| 6 | import 'leaflet/dist/leaflet.css';
|
---|
| 7 | import markerIconPng from "leaflet/dist/images/marker-icon.png"
|
---|
| 8 | import {Icon} from 'leaflet'
|
---|
| 9 | import '../UtilComponents/App.css'
|
---|
| 10 |
|
---|
| 11 | const MakeRequest = () => {
|
---|
| 12 |
|
---|
| 13 | const location = useLocation();
|
---|
| 14 | // eslint-disable-next-line react-hooks/rules-of-hooks
|
---|
| 15 | const navigate = useNavigate();
|
---|
| 16 | // eslint-disable-next-line react-hooks/rules-of-hooks
|
---|
| 17 | const [formData, updateFormData] = React.useState({
|
---|
| 18 | cityAddress : "",
|
---|
| 19 | streetAddress : "",
|
---|
| 20 | numberAddress : ""
|
---|
| 21 | })
|
---|
| 22 | const [latitude, setLatitude] = useState(null)
|
---|
| 23 | const [longitude, setLongitude] = useState(null)
|
---|
| 24 | const [position, setPosition] = useState(null)
|
---|
| 25 |
|
---|
| 26 | const handleChange = (e) => {
|
---|
| 27 | updateFormData({
|
---|
| 28 | ...formData,
|
---|
| 29 | [e.target.name]: e.target.value.trim()
|
---|
| 30 | })
|
---|
| 31 | }
|
---|
| 32 |
|
---|
| 33 | const onFormSubmit = async (e) => {
|
---|
| 34 | e.preventDefault();
|
---|
| 35 | const cityAddress = formData.cityAddress;
|
---|
| 36 | const streetAddress = formData.streetAddress;
|
---|
| 37 | const numberAddress = formData.numberAddress;
|
---|
| 38 | const passengerId = localStorage.getItem("passengerId");
|
---|
| 39 | let chosenDriverId = null
|
---|
| 40 | if(location.state){
|
---|
| 41 | chosenDriverId = location.state.driverId
|
---|
| 42 | }
|
---|
| 43 | if(!(latitude && longitude)){
|
---|
| 44 | alert("You must pick a location on the map")
|
---|
| 45 | }
|
---|
| 46 | const response = await axios.post(`/request/make/${passengerId}`, {
|
---|
| 47 | "cityAddress" : cityAddress,
|
---|
| 48 | "streetAddress" : streetAddress,
|
---|
| 49 | "numberAddress" : numberAddress,
|
---|
| 50 | "latitude" : latitude,
|
---|
| 51 | "longitude" : longitude,
|
---|
| 52 | "chosenDriverId" : chosenDriverId
|
---|
| 53 | })
|
---|
| 54 | localStorage.setItem("madeRequestId", response.data.id)
|
---|
| 55 | navigate("/made-request", {state: {madeRequest: response.data}})
|
---|
| 56 | }
|
---|
| 57 |
|
---|
| 58 | let showChosenDriver
|
---|
| 59 | if(location.state){
|
---|
| 60 | showChosenDriver = <p style={{color: "green", fontStyle: "bold"}}>You picked the driver with name {location.state.driverName}.
|
---|
| 61 | <br></br>
|
---|
| 62 | Add your address to complete the request.</p>
|
---|
| 63 | }
|
---|
| 64 |
|
---|
| 65 | function LocationMarker() {
|
---|
| 66 | const map = useMapEvents({
|
---|
| 67 | dblclick(){
|
---|
| 68 | map.locate()
|
---|
| 69 | },
|
---|
| 70 | click(e) {
|
---|
| 71 | setLatitude(e.latlng.lat)
|
---|
| 72 | setLongitude(e.latlng.lng)
|
---|
| 73 | setPosition(e.latlng)
|
---|
| 74 | map.flyTo(e.latlng, map.getZoom())
|
---|
| 75 | },
|
---|
| 76 | locationfound(e) {
|
---|
| 77 | setPosition(e.latlng)
|
---|
| 78 | map.flyTo(e.latlng, map.getZoom())
|
---|
| 79 | }
|
---|
| 80 | })
|
---|
| 81 | return position === null ? null : (
|
---|
| 82 | <Marker position={position} icon={new Icon({iconUrl: markerIconPng, iconSize: [25, 41], iconAnchor: [12, 41]})}>
|
---|
| 83 | <Popup>You are here</Popup>
|
---|
| 84 | </Marker>
|
---|
| 85 | )
|
---|
| 86 | }
|
---|
| 87 |
|
---|
| 88 | return(
|
---|
| 89 | <CenteredContainer>
|
---|
| 90 | <h2 style={{textAlign: "center", color: "darkcyan"}}>Make Request</h2>
|
---|
| 91 | <hr></hr>
|
---|
| 92 | {showChosenDriver}
|
---|
| 93 | <br></br>
|
---|
| 94 | <h6 style={{textAlign: "center"}}>Your current(pick up) address:</h6>
|
---|
| 95 | <br></br>
|
---|
| 96 | <form onSubmit={onFormSubmit}>
|
---|
| 97 | <div className="form-group">
|
---|
| 98 | <label htmlFor="cityAddress">City</label>
|
---|
| 99 | <input type="text"
|
---|
| 100 | className="form-control"
|
---|
| 101 | id="cityAddress"
|
---|
| 102 | name="cityAddress"
|
---|
| 103 | required
|
---|
| 104 | placeholder="E.g: Skopje"
|
---|
| 105 | style={{height: 100 + "%"}}
|
---|
| 106 | onChange={handleChange}
|
---|
| 107 | />
|
---|
| 108 | </div>
|
---|
| 109 | <br></br>
|
---|
| 110 | <div className="form-group">
|
---|
| 111 | <label htmlFor="streetAddress">Street</label>
|
---|
| 112 | <input type="text"
|
---|
| 113 | className="form-control"
|
---|
| 114 | id="streetAddress"
|
---|
| 115 | name="streetAddress"
|
---|
| 116 | required
|
---|
| 117 | placeholder="E.g: Jordan Mijalkov"
|
---|
| 118 | style={{height: 100 + "%"}}
|
---|
| 119 | onChange={handleChange}
|
---|
| 120 | />
|
---|
| 121 | </div>
|
---|
| 122 | <br></br>
|
---|
| 123 | <div className="form-group">
|
---|
| 124 | <label htmlFor="numberAddress">Number</label>
|
---|
| 125 | <input type="number"
|
---|
| 126 | className="form-control"
|
---|
| 127 | id="numberAddress"
|
---|
| 128 | name="numberAddress"
|
---|
| 129 | placeholder="E.g: 2"
|
---|
| 130 | required
|
---|
| 131 | onChange={handleChange}
|
---|
| 132 | />
|
---|
| 133 | </div>
|
---|
| 134 | <br></br>
|
---|
| 135 | <label htmlFor="MapContainer" style={{color: 'red'}}>Choose your location on the map</label>
|
---|
| 136 | <label htmlFor="MapContainer" style={{color: 'darkcyan'}}>You can double click for the app to try and locate you on it's own,
|
---|
| 137 | or click once to mark your precise location</label>
|
---|
| 138 | <MapContainer
|
---|
| 139 | className="border border-info rounded-2" center={[41.9943, 21.4309]}
|
---|
| 140 | style={{width: '100%', position:'relative', zIndex: 0}}
|
---|
| 141 | zoom={13}
|
---|
| 142 | scrollWheelZoom={true}>
|
---|
| 143 | <TileLayer
|
---|
| 144 | attribution='© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
|
---|
| 145 | url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
|
---|
| 146 | />
|
---|
| 147 | <LocationMarker />
|
---|
| 148 | </MapContainer>
|
---|
| 149 | <br></br>
|
---|
| 150 | <p style={{textAlign: 'center'}}>
|
---|
| 151 | <button id="submit" type="submit" className="myButton btn btn-primary" style={{backgroundColor: "cyan", borderColor: "black", color: 'black'}}>Submit</button>
|
---|
| 152 | </p>
|
---|
| 153 | </form>
|
---|
| 154 | </CenteredContainer>
|
---|
| 155 | )
|
---|
| 156 |
|
---|
| 157 | }
|
---|
| 158 |
|
---|
| 159 | export default MakeRequest; |
---|