Skip to content

Instantly share code, notes, and snippets.

@ericrocha97
Last active June 3, 2020 23:14
Show Gist options
  • Save ericrocha97/20ae2f20670ad9d4f09e8c2f54d5a776 to your computer and use it in GitHub Desktop.
Save ericrocha97/20ae2f20670ad9d4f09e8c2f54d5a776 to your computer and use it in GitHub Desktop.
css concluido
import React, { useEffect, useState, ChangeEvent, FormEvent } from 'react';
import { Link, useHistory } from 'react-router-dom';
import { FiArrowLeft, FiCheckCircle } from 'react-icons/fi';
import { Map, TileLayer, Marker } from 'react-leaflet';
import axios from 'axios';
import { LeafletMouseEvent } from 'leaflet'
import api from '../../services/api';
import './styles.css';
import logo from '../../assets/logo.svg'
interface Item {
id: number;
title: string;
image_url: string;
}
interface IBGEUFresponse {
sigla: string;
}
interface IBGECityresponse {
nome: string;
}
const CreatePoint: React.FC = () => {
const [items, setItems] = useState<Item[]>([]);
const [ufs, setUfs] = useState<string[]>([]);
const [cities, setCities] = useState<string[]>([]);
const [initialPosition, setInitialPosition] = useState<[number,number]>([0,0]);
const [formData, setFormData] = useState({
name: '',
email: '',
whatsapp: '',
});
const [selectedUf, setSelectedUf] = useState('0');
const [selectedCity, setSelectedCity] = useState('0');
const [selectedItems, setSelectedItems] = useState<number[]>([]);
const [selectedPosition, setSelectedPosition] = useState<[number,number]>([0,0]);
const [finished, setfinished] = useState(false);
const history = useHistory();
useEffect(() => {
navigator.geolocation.getCurrentPosition(position => {
const { latitude , longitude } = position.coords;
setInitialPosition([latitude,longitude]);
});
},[])
useEffect(() => {
api.get('items').then(response => {
setItems(response.data);
});
},[]);
useEffect(() => {
axios.get<IBGEUFresponse[]>('https://servicodados.ibge.gov.br/api/v1/localidades/estados?orderBy=nome').then(response => {
const ufInitials = response.data.map( uf => uf.sigla);
setUfs(ufInitials);
});
},[]);
useEffect(() => {
if(selectedUf === '0'){
return;
}
axios
.get<IBGECityresponse[]>(`https://servicodados.ibge.gov.br/api/v1/localidades/estados/${selectedUf}/municipios?orderBy=nome`)
.then(response => {
const cityNames = response.data.map( city => city.nome);
setCities(cityNames);
});
},[selectedUf]);
function handleSelectUf(event: ChangeEvent<HTMLSelectElement>) {
const uf = event.target.value;
setSelectedUf(uf);
};
function handleSelectCity(event: ChangeEvent<HTMLSelectElement>) {
const city = event.target.value;
setSelectedCity(city);
};
function handleMapClick(event: LeafletMouseEvent) {
setSelectedPosition([
event.latlng.lat,
event.latlng.lng,
])
};
function handleInputChange(event: ChangeEvent<HTMLInputElement>) {
const { name, value } = event.target;
setFormData({...formData, [name] : value})
};
function handleSelectItem(id:number) {
const alreadySelected = selectedItems.findIndex(item => item === id);
if(alreadySelected >= 0){
const filteredItems = selectedItems.filter(item => item !== id);
setSelectedItems(filteredItems);
} else {
setSelectedItems([...selectedItems, id]);
}
};
async function handleSubmit(event: FormEvent) {
event.preventDefault();
const {name, email, whatsapp } = formData;
const uf = selectedUf;
const city = selectedCity;
const [latitude, longitude] = selectedPosition;
const items = selectedItems;
const data = {
name,
email,
whatsapp,
uf,
city,
latitude,
longitude,
items
};
await api.post('points',data);
setfinished(true);
setTimeout(() => {
history.push('/');
setfinished(false);
}, 2000);
};
return (
<>
<div className={finished=== true ? 'shadow':'hide'}>
<div className='concluido'>
<FiCheckCircle/>
<p>Cadastro concluído!</p>
</div>
</div>
<div id="page-create-point">
<header>
<img src={logo} alt="Ecoleta"/>
<Link to="/">
<FiArrowLeft/>
Voltar para home
</Link>
</header>
<form onSubmit={handleSubmit}>
<h1>Cadastro do <br/> ponto de coleta</h1>
<fieldset>
<legend>
<h2>Dados</h2>
</legend>
<div className="field">
<label htmlFor="name">Nome da entidade</label>
<input
type="text"
name="name"
id="name"
onChange={handleInputChange}
/>
</div>
<div className="field-group">
<div className="field">
<label htmlFor="email">E-mail</label>
<input
type="email"
name="email"
id="email"
onChange={handleInputChange}
/>
</div>
<div className="field">
<label htmlFor="whatsapp">Whatsapp</label>
<input
type="tel"
name="whatsapp"
id="whatsapp"
onChange={handleInputChange}
/>
</div>
</div>
</fieldset>
<fieldset>
<legend>
<h2>Endereço</h2>
<span>Selecione o endereço no mapa</span>
</legend>
<Map center={initialPosition} zoom={15} onClick={handleMapClick}>
<TileLayer
attribution='&amp;copy <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
/>
<Marker position={selectedPosition} />
</Map>
<div className="field-group">
<div className="field">
<label htmlFor="uf">Estado (UF)</label>
<select
name="uf"
id="uf"
value={selectedUf}
onChange={handleSelectUf}
>
<option value="0">Selecione uma UF</option>
{ufs.map( uf => (
<option key={uf} value={uf}>{uf}</option>
))}
</select>
</div>
<div className="field">
<label htmlFor="city">Cidade</label>
<select
name="city"
id="city"
value={selectedCity}
onChange={handleSelectCity}
>
<option value="0">Selecione uma cidade</option>
{cities.map( city => (
<option key={city} value={city}>{city}</option>
))}
</select>
</div>
</div>
</fieldset>
<fieldset>
<legend>
<h2>Ítens de coleta</h2>
<span>Selecione um ou mais ítens abaixo</span>
</legend>
<ul className="items-grid">
{items.map(item => (
<li
key={item.id}
onClick={() => handleSelectItem(item.id)}
className={selectedItems.includes(item.id)? 'selected':''}
>
<img src={item.image_url} alt={item.title}/>
<span>{item.title}</span>
</li>
))}
</ul>
</fieldset>
<button type="submit">Cadastrar ponto de coleta</button>
</form>
</div>
</>
);
}
export default CreatePoint;
.hide {
display: none;
visibility: hidden;
}
.shadow {
position: absolute;
width: 1440px;
height: 820px;
width: 100%;
height: 250%;
left: 0;
top: 0;
margin: 0;
background: #0E0A14;
opacity: 0.99;
z-index: 9999;
}
.concluido {
width: 324px;
height: 130px;
position:absolute;
display: flex;
flex-direction: column;
justify-content: space-between;
align-items: center;
text-align: center;
top:50%;
left:45%;
margin-top:-50px;
margin-left:-50px;
}
.concluido p{
width: 324px;
height: 42px;
font-family: Roboto;
font-style: normal;
font-weight: bold;
font-size: 36px;
line-height: 42px;
color: #F0F0F5;
}
.concluido svg {
width: 64px;
height: 64px;
color: #2FB86E;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment