Advertisement
Guest User

Untitled

a guest
Feb 17th, 2020
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.95 KB | None | 0 0
  1. import React, { useState } from 'react';
  2. import './App.css';
  3. import { gql } from 'apollo-boost';
  4. import { useQuery } from '@apollo/react-hooks'
  5. import axios from 'axios';
  6.  
  7.  
  8. const ADDRESS_TO_EFICODE = gql`
  9. query RouteToEficode( $lat: Float, $lon: Float){
  10. plan(
  11. from: {lat: $lat, lon: $lon}
  12. to: {lat: 60.169390, lon: 24.925750}
  13. numItineraries: 1
  14. ) {
  15. itineraries {
  16. legs {
  17. startTime
  18. endTime
  19. mode
  20. duration
  21. distance
  22. transitLeg
  23. } fares {
  24. type
  25. cents
  26. currency
  27. }
  28. }
  29. }
  30. }
  31. `
  32.  
  33. const EFICODE_TO_ADDRESS = gql`
  34. query RouteToAddress( $lat: Float, $lon: Float){
  35. plan(
  36. from: "lat:60.169390, lon:24.925750"
  37. to: {lat: $latitude, lon: $longitude}
  38. numItineraries: 1
  39. ) {
  40. itineraries {
  41. legs {
  42. startTime
  43. endTime
  44. mode
  45. duration
  46. distance
  47. transitLeg
  48. } fares {
  49. type
  50. cents
  51. currency
  52. }
  53. }
  54. }
  55. }
  56. `
  57.  
  58. function Timetables() {
  59. const [addresses, setAddresses] = useState([]);
  60. const [addressCoordinates, setAddressCoordinates] = useState([]);
  61. const [toFromEficode, setToFromEficode] = useState(true);
  62. const [search, setSearch] = useState("");
  63.  
  64. document.title = 'Timetables';
  65.  
  66.  
  67. const handleSubmit = (e) => {
  68. e.preventDefault();
  69. axios.get(`http://api.digitransit.fi/geocoding/v1/search?text=${search}&boundary.circle.lat=60.169390&boundary.circle.lon=24.925750&boundary.circle.radius=100`)
  70. .then(res => {
  71. setAddressCoordinates(res.data.features.map((feature) => ({lat: feature.geometry.coordinates[1], lon: feature.geometry.coordinates[0]})));
  72. setAddresses(res.data.features);
  73. })
  74. }
  75.  
  76. const handleSearchChange = (e) => {
  77. setSearch(e.target.value);
  78. }
  79.  
  80. console.log(addressCoordinates);
  81.  
  82. return (
  83. <div className="App">
  84. <h1 className="App-header">
  85. Tarkasta julkisen liikenteen aikataulut toimistolle
  86. <br></br>
  87. tai toimstolta valitseemasi osoitteeseen!
  88. </h1>
  89. <div>
  90. <RouteBars handleSubmit={handleSubmit} handleSearchChange={handleSearchChange} />
  91. <h5>
  92. Valitse, haluatko mennä Eficoden toimistolle, vai lähteä sieltä.
  93. </h5>
  94. <button onClick={() => setToFromEficode(!toFromEficode)}>
  95. {toFromEficode ? 'Valitsemasi kohde -> Eficode' : 'Eficode -> valitsemasi kohde'}
  96. </button>
  97. </div>
  98. <AddressDisplay addresses={addresses} />
  99. <RouteDisplay addressCoordinates={addressCoordinates[0]} />
  100. </div>
  101. );
  102. }
  103.  
  104. function AddressDisplay(props) {
  105. return (
  106. <div>
  107. {props.addresses.map((address) => <div key={address.properties.label}>
  108. <a
  109. className="App-link"
  110. href="#"
  111. target="_blank"
  112. rel="noopener noreferrer"
  113. >
  114. {address.properties.label}
  115. </a>
  116. </div>
  117. )}
  118. </div>
  119. )
  120. }
  121.  
  122. function RouteDisplay(props) {
  123. const { loading, error, data } = useQuery(ADDRESS_TO_EFICODE, {
  124. variables: props.addressCoordinates ,
  125. });
  126. console.log(props.addressCoordinates)
  127. if (loading) return <p>Loading ...</p>;
  128. if (error) return (
  129. <div>
  130. {console.log(error)}
  131. </div>
  132. );
  133. return (
  134. <div>
  135. {data}
  136. </div>
  137. )
  138. }
  139.  
  140. function RouteBars(props) {
  141. return (
  142. <div>
  143. <form onSubmit={props.handleSubmit}>
  144. <div>
  145. <label>Eficoden toimisto:</label>
  146. <br></br>
  147. <h3>
  148. Pohjoinen Rautatienkatu 25
  149. </h3>
  150. <label htmlFor="routeToFrom">Hae aikatauluja:</label>
  151. <br></br>
  152. <input id="routeToFrom" type="text" required name="routeToFrom"
  153. size="25" placeholder="Osoite" onChange={props.handleSearchChange} />
  154. <input type="submit" value="Hae aikatauluja" />
  155. </div>
  156. </form>
  157. </div>
  158. );
  159. }
  160.  
  161. export default Timetables;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement