code-challenge-nextjs/pages/index.tsx

68 lines
1.8 KiB
TypeScript
Raw Normal View History

2021-05-11 20:35:45 +01:00
import { NextPage } from 'next'
2021-05-16 19:46:47 -04:00
import { useState, useEffect } from 'react'
2021-05-11 20:35:45 +01:00
import Layout from '../components/layout'
import useApiData from '../hooks/use-api-data'
import Airport from '../types/airport'
const Page: NextPage = () => {
const airports = useApiData<Airport[]>('/api/airports', [])
2021-05-16 19:46:47 -04:00
const [filter, setFilter] = useState('')
const [filtered, setFiltered] = useState([])
const [validation, setValidation] = useState('')
const changeFilter = e => {
setFilter(e.target.value)
}
useEffect(() => {
let check = filter.toLowerCase()
if (filter.length > 1) {
setValidation('')
setFiltered(airports.filter(airport => {
let result = airport.name.toLowerCase().includes(check) ||
airport.iata.toLowerCase().includes(check) ||
airport.city.toLowerCase().includes(check) ||
airport.country.toLowerCase().includes(check)
return result
}))
} else if (filter.length === 1) {
setValidation('Please type 2 or more characters.')
setFiltered([])
} else {
setValidation('')
setFiltered([])
}
}, [filter])
2021-05-11 20:35:45 +01:00
return <Layout>
<h1 className='text-2xl'>Code Challenge: Airports</h1>
<h2 className="mt-10 text-xl">All Airports</h2>
2021-05-16 19:46:47 -04:00
<form>
<label>
<input value={filter} onChange={changeFilter} className='mt-5 flex items-center shadow p-5 border' />
</label>
<p>{validation}</p>
</form>
2021-05-11 20:35:45 +01:00
<div>
2021-05-16 19:46:47 -04:00
{filtered.map(airport => (
2021-05-11 20:35:45 +01:00
<a href={`/airports/${airport.iata.toLowerCase()}`} key={airport.iata} className='mt-5 flex items-center shadow p-5 border'>
<div>
{airport.name}, {airport.city}
</div>
<div className='ml-auto text-mono'>
{airport.country}
</div>
</a>
))}
</div>
</Layout>
}
export default Page