I am creating a meeting room booking app. Here Input field for email entry is shown based on the number of attendees entered. I am trying to store the input in an array. If I try to push inside onChange function each character is pushed in. I like to store the details in an array and use it later.
BookMeetingRooms.js :
import React, { useState } from "react";
import { useLocation } from "react-router-dom";
import HoverVideoPlayer from 'react-hover-video-player';
import { Card,Button } from "react-bootstrap";
import '../styles/meetingBook.css';
import DatePicker from "react-datepicker";
import "react-datepicker/dist/react-datepicker.css";
import { TimePicker } from '@mui/x-date-pickers';
import TextField from '@mui/material/TextField';
import Swal from "sweetalert2";
import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns';
import { LocalizationProvider } from '@mui/x-date-pickers';
import DateTimePicker from '@mui/lab/DateTimePicker';
import DesktopDatePicker from '@mui/lab/DesktopDatePicker';
import MobileDatePicker from '@mui/lab/MobileDatePicker';
import axios from "axios";
export default function MeetingBooking(){
const location = useLocation();
//const[hour, setHour] = useState()
const [date, setDate] = useState(new Date());
const [fromTimevalue, setFromTimeValue] = React.useState(new Date('2014-08-18T21:11:54'));
const [toTimeValue , setToTimeValue] = React.useState(new Date('2014-08-18T21:11:54'));
const fromTime = String(fromTimevalue).slice(16,21)
const toTime = String(toTimeValue).slice(16,21)
const bkDate = String(date).slice(0,15)
let details = location.state.details
const fields = [];
const[attendees, setAttendees] = useState()
const [attendeeDetail, setAttendeesDetail] =useState()
const [attEmail, setAttEmail]= useState([])
//Booking a meeting room
const bookRoom=async()=>{ //checking if the number of attendees arenot less than 2
if(attendees < 2){
await Swal.fire({
position: 'center',
icon: 'info',
title: 'Members cannot be less than 2',
timer: 10000
})
}else{
console.log("Email",attEmail)
await Swal.fire({
title: `You are booking ${details.name} on ${bkDate} from ${fromTime} to ${toTime}`,
showDenyButton: true,
confirmButtonText: 'Yes',
denyButtonText: `No`,
}).then(async(result) => {
if (result.isConfirmed) {
await axios.get(`http://localhost:5000/api/bookingConfirmation/${details.name}/${date}/${fromTime}/${toTime}`)
.then((res)=>{
console.log(res.status)
if(res.status == 200){
Swal.fire({
position: 'center',
icon: 'success',
title: 'Meeting rooms booked sucessfully. ',
})
}
})
} else if (result.isDenied) {
console.log("No")
}
})
}
}
for (let i = 3; i <= attendees; i++) {
if(attendees == 2){
fields.push()
}else{
fields.push("Enter the attendee's emailId"+i);
}
}
const handleFromTimeChange = (newValue) => {
setFromTimeValue(newValue);
};
const handleToTimeChange = (newValue) => {
setToTimeValue(newValue);
};
//Number of attendees
const attenseesNumber=(count)=>{
setAttendees(count)
}
//gathering attendees input
const handleAttendeesEmail=(e)=>{
const fieldName = e.target.name
setAttendeesDetail(e.target.value)
setAttEmail((tm)=>[...tm,fieldName])
}
//console.log("Email",attEmail)
return(
<div>
<div id="mainContent">
<HoverVideoPlayer id="meetingRoom"
videoSrc={details.videoUrl}
pausedOverlay={
<img
src={details.imageUrl}
alt=""
style={{
// Make the image expand to cover the video's dimensions
width: '100%',
height: '100%',
objectFit: 'cover',
}}
/>
}
style={{
// Make the image expand to cover the video's dimensions
width: '50%',
height: '30%',
}}/>
<div id="roomDetails" style={{display:'block'}}>
<h1><center>{details.name}</center></h1>
<h6><center>{details.description}</center></h6>
<div>
<p><DatePicker selected={date} onChange={date => setDate(date)} id="dtpicker"/></p>
<div id="timePicker">
<p>from: </p>
<LocalizationProvider dateAdapter={AdapterDateFns} style={{width:'20%', margin:'0%'}}>
<TimePicker
label="Time"
value={fromTimevalue}
onChange={handleFromTimeChange}
renderInput={(params) => <TextField {...params} />}
/>
</LocalizationProvider>
<p>To: </p>
<LocalizationProvider dateAdapter={AdapterDateFns}>
<TimePicker
label="Time"
value={toTimeValue}
onChange={handleToTimeChange}
renderInput={(params) => <TextField {...params} />}
/>
</LocalizationProvider>
</div>
<div id="attendeesInfo" >
<div style={{display: 'flex',marginLeft:'30%'}}>
<center><label>Attendees :</label><input type="number" onChange={(e)=>attenseesNumber(e.target.value)} style={{width:'20%'}}></input></center>
</div>
<div id="fixFiels" style={{margin:'2%' , display:'block'}}>
<div className="inpformating">
<label>EmailId:</label><input type="email" className="formating" onChange={handleAttendeesEmail}></input>
</div>
<div className="inpformating">
<label>EmailId:</label><input type="email"className="formating" onChange={handleAttendeesEmail}></input>
</div>
</div>
{fields.map(()=>(
<div id="infoFields" style={{margin:'2% 5%' , display:'flex'}}>
<label>EmailId:</label><input type="email" className="formating" onChange={handleAttendeesEmail}></input>
</div>
))}
</div>
</div>
<Button onClick={bookRoom} style={{marginTop: '25%'}}>Book Room</Button>
</div>
</div>
</div>
)
}