You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
200 lines
5.9 KiB
TypeScript
200 lines
5.9 KiB
TypeScript
import {Grid, Typography, TextField, Box, InputLabel, Select, MenuItem, Avatar, SelectChangeEvent} from '@mui/material';
|
|
import axios from 'axios';
|
|
import { MuiTelInput, matchIsValidTel } from 'mui-tel-input'
|
|
import { useEffect, useState } from 'react';
|
|
|
|
interface Paises {
|
|
|
|
name: {
|
|
common: string;
|
|
};
|
|
|
|
flags: {
|
|
svg: string;
|
|
};
|
|
|
|
}
|
|
|
|
export const DadosPessoais = ( {formik}: any ) => {
|
|
|
|
const [selectedValue, setSelectedValue] = useState('Portugal');
|
|
|
|
const handleChange2 = (event: SelectChangeEvent<unknown>) => {
|
|
setSelectedValue(event.target.value as string);
|
|
formik.setFieldValue( 'pais', event.target.value);
|
|
};
|
|
|
|
const handleChange = (newValue: string) => {
|
|
|
|
formik.setFieldValue('telemovelDP', newValue);
|
|
|
|
const isValid = matchIsValidTel(newValue);
|
|
|
|
if (!isValid) {
|
|
formik.setFieldError('telemovelDP', 'Por favor insira um número de telemóvel válido');
|
|
} else {
|
|
formik.setFieldError('telemovelDP', ''); // Clear error if valid
|
|
}
|
|
};
|
|
|
|
const [countries, setCountries] = useState<Paises[]>([]);
|
|
|
|
useEffect(() => {
|
|
// Fetch countries data from the API
|
|
axios.get<Paises[]>('https://restcountries.com/v3.1/all?fields=name,flags,postalCode')
|
|
.then(response => {
|
|
const sortedCountries = response.data.sort((a, b) => a.name.common.localeCompare(b.name.common));
|
|
setCountries(sortedCountries);
|
|
})
|
|
.catch(error => {
|
|
console.error('Error fetching countries:', error);
|
|
});
|
|
}, []);
|
|
|
|
|
|
return (
|
|
<Box>
|
|
<Typography variant="h6" gutterBottom>
|
|
Dados Pessoais
|
|
</Typography>
|
|
<Grid container spacing={3}>
|
|
<Grid item xs={12} sm={6}>
|
|
<TextField
|
|
{...formik.getFieldProps('empresa')}
|
|
required
|
|
id="empresa"
|
|
name="empresa"
|
|
label="Nome/Empresa"
|
|
fullWidth
|
|
variant="standard"
|
|
error={formik.touched.empresa && Boolean(formik.errors.empresa)}
|
|
helperText={formik.touched.empresa && formik.errors.empresa}
|
|
/>
|
|
</Grid>
|
|
<Grid item xs={12} sm={6}>
|
|
<TextField
|
|
{...formik.getFieldProps('nif')}
|
|
type='number'
|
|
id="nif"
|
|
name="nif"
|
|
label="NIF/NIPC"
|
|
fullWidth
|
|
variant="standard"
|
|
/>
|
|
</Grid>
|
|
<Grid item xs={12} sm={12}>
|
|
<TextField
|
|
{...formik.getFieldProps('representante')}
|
|
required
|
|
type='text'
|
|
id="representante"
|
|
name="representante"
|
|
label="Nome do representante legal (empresa)"
|
|
fullWidth
|
|
variant="standard"
|
|
error={formik.touched.representante && Boolean(formik.errors.representante)}
|
|
helperText={formik.touched.representante && formik.errors.representante}
|
|
/>
|
|
</Grid>
|
|
<Grid item xs={12} sm={6}>
|
|
<MuiTelInput
|
|
{...formik.getFieldProps('telemovelDP')}
|
|
required
|
|
id="telemovelDP"
|
|
label="Telemóvel"
|
|
value={formik.values.telemovelDP}
|
|
fullWidth
|
|
onChange={handleChange}
|
|
variant="standard"
|
|
defaultCountry="PT"
|
|
error={formik.touched.telemovelDP && Boolean(formik.errors.telemovelDP)}
|
|
helperText={formik.touched.telemovelDP && formik.errors.telemovelDP}
|
|
/>
|
|
</Grid>
|
|
<Grid item xs={12} sm={6}>
|
|
<TextField
|
|
{...formik.getFieldProps('emailDP')}
|
|
required
|
|
type='email'
|
|
id="emailDP"
|
|
name="emailDP"
|
|
label="Email"
|
|
fullWidth
|
|
variant="standard"
|
|
error={formik.touched.emailDP && Boolean(formik.errors.emailDP)}
|
|
helperText={formik.touched.emailDP && formik.errors.emailDP}
|
|
/>
|
|
</Grid>
|
|
<Grid item xs={12} sm={6}>
|
|
<TextField
|
|
{...formik.getFieldProps('morada')}
|
|
type='text'
|
|
id="morada"
|
|
name="morada"
|
|
label="Morada"
|
|
fullWidth
|
|
variant="standard"
|
|
/>
|
|
</Grid>
|
|
<Grid item xs={12} sm={6}>
|
|
<TextField
|
|
{...formik.getFieldProps('andar')}
|
|
type='number'
|
|
id="andar"
|
|
name="andar"
|
|
label="Andar/Nº/Bloco"
|
|
fullWidth
|
|
variant="standard"
|
|
/>
|
|
</Grid>
|
|
<Grid item xs={12} sm={4}>
|
|
<InputLabel id="pais-label">País</InputLabel>
|
|
<Select
|
|
{...formik.getFieldProps('pais')}
|
|
labelId="pais-label"
|
|
id="pais"
|
|
name="pais"
|
|
label="País"
|
|
fullWidth
|
|
variant="standard"
|
|
value={selectedValue}
|
|
onChange={ (e) => handleChange2 (e)}
|
|
>
|
|
{countries.map((country: Paises, index: number) => (
|
|
<MenuItem key={index} value={country.name.common}>
|
|
<Box sx={{ display: 'flex' }}>
|
|
<Avatar style={{ width: '30px', height: '20px', borderRadius: '5px', marginRight: '5px' }} src={country.flags.svg} alt={country.name.common} />
|
|
{country.name.common}
|
|
</Box>
|
|
</MenuItem>
|
|
))}
|
|
</Select>
|
|
</Grid>
|
|
<Grid item xs={12} sm={4}>
|
|
<TextField
|
|
{...formik.getFieldProps('cidade')}
|
|
type='text'
|
|
id="cidade"
|
|
name="cidade"
|
|
label="Cidade"
|
|
fullWidth
|
|
variant="standard"
|
|
/>
|
|
</Grid>
|
|
<Grid item xs={12} sm={4}>
|
|
<TextField
|
|
{...formik.getFieldProps('codigoPostal')}
|
|
type='number'
|
|
id="codigoPostal"
|
|
name="codigoPostal"
|
|
label="Código Postal"
|
|
fullWidth
|
|
autoComplete="shipping country"
|
|
variant="standard"
|
|
/>
|
|
</Grid>
|
|
</Grid>
|
|
</Box>
|
|
);
|
|
};
|