mirror of
https://github.com/UofCBaja/BajaUofCWebsite.git
synced 2025-06-15 21:34:17 -06:00
feat(InterviewBooking): added failure points to refresh, TODO css, fix backend to get a success
This commit is contained in:
parent
7999abaf25
commit
82d151a159
@ -13,6 +13,11 @@ const InterviewForm = () => {
|
|||||||
const [isButtonDisabled, setIsButtonDisabled] = useState(false);
|
const [isButtonDisabled, setIsButtonDisabled] = useState(false);
|
||||||
const dialogRef = useRef(null);
|
const dialogRef = useRef(null);
|
||||||
const [selectedTimeSlot, setSelectedTimeSlot] = useState(null);
|
const [selectedTimeSlot, setSelectedTimeSlot] = useState(null);
|
||||||
|
const [getTimeDates, setGetTimeDates] = useState('');
|
||||||
|
|
||||||
|
// useEffect(() => {
|
||||||
|
// console.log(selectedTimeSlot);
|
||||||
|
// }, [selectedTimeSlot]);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {String HTML} event - Takes in form info
|
* @param {String HTML} event - Takes in form info
|
||||||
@ -29,8 +34,11 @@ const InterviewForm = () => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// disable button to stop multiple requests
|
||||||
setIsButtonDisabled(true);
|
setIsButtonDisabled(true);
|
||||||
await new Promise((res) => setTimeout(res, 1000));
|
|
||||||
|
|
||||||
|
// await new Promise((res) => setTimeout(res, 1000));
|
||||||
const formData = new FormData(event.target);
|
const formData = new FormData(event.target);
|
||||||
const formObject = Object.fromEntries(formData.entries());
|
const formObject = Object.fromEntries(formData.entries());
|
||||||
formObject.date = selectedTimeSlot["date"]; // Add the selected time slot to form data
|
formObject.date = selectedTimeSlot["date"]; // Add the selected time slot to form data
|
||||||
@ -47,9 +55,13 @@ const InterviewForm = () => {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
let data = await res.json();
|
let data = await res.json();
|
||||||
console.log(data);
|
|
||||||
|
|
||||||
// dialogRef.current.showModal();
|
if (data["body"]["Success"] === true) {
|
||||||
|
dialogRef.current.showModal();
|
||||||
|
} else {
|
||||||
|
setGetTimeDates(getTimeDates+'i');
|
||||||
|
}
|
||||||
|
|
||||||
setIsButtonDisabled(false);
|
setIsButtonDisabled(false);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -76,6 +88,7 @@ const InterviewForm = () => {
|
|||||||
{/* Time Slot Selector */}
|
{/* Time Slot Selector */}
|
||||||
<TimeDateSelector
|
<TimeDateSelector
|
||||||
onTimeSlotSelect={(timeSlot) => setSelectedTimeSlot(timeSlot)}
|
onTimeSlotSelect={(timeSlot) => setSelectedTimeSlot(timeSlot)}
|
||||||
|
timeDateSelectorGet={getTimeDates}
|
||||||
/>
|
/>
|
||||||
<button type="submit" disabled={isButtonDisabled}>
|
<button type="submit" disabled={isButtonDisabled}>
|
||||||
Submit
|
Submit
|
||||||
|
@ -2,8 +2,7 @@ import React, { useState, useEffect } from "react";
|
|||||||
import DatePicker from 'react-datepicker';
|
import DatePicker from 'react-datepicker';
|
||||||
import "react-datepicker/dist/react-datepicker.css";
|
import "react-datepicker/dist/react-datepicker.css";
|
||||||
|
|
||||||
export default function TimeDateSelector ({ onTimeSlotSelect }) {
|
export default function TimeDateSelector ({ onTimeSlotSelect, timeDateSelectorGet }) {
|
||||||
const [allTimeDatesAvailable, setAllTimeDatesAvailable] = useState();
|
|
||||||
const [allDatesAvailable, setAllDatesAvailable] = useState([]);
|
const [allDatesAvailable, setAllDatesAvailable] = useState([]);
|
||||||
const [selectedDate, setSelectedDate] = useState(null);
|
const [selectedDate, setSelectedDate] = useState(null);
|
||||||
const [timeSlotsAvialable, setTimeSlotsAvialable] = useState([]);
|
const [timeSlotsAvialable, setTimeSlotsAvialable] = useState([]);
|
||||||
@ -11,14 +10,14 @@ export default function TimeDateSelector ({ onTimeSlotSelect }) {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
getInterviewDates();
|
getInterviewDates();
|
||||||
}, []);
|
}, [timeDateSelectorGet]);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {null} null - Takes in nothing
|
* @param {null} null - Takes in nothing
|
||||||
* @returns {null} null - Returns in nothing
|
* @returns {null} null - Returns in nothing
|
||||||
* @description Gets interview timeslots and dates
|
* @description Gets interview timeslots and dates from backend
|
||||||
* @authors Ahmad <ahmadmuhammadofficial@gmail.com>, Brock <darkicewolf50@gmail.com>
|
* @author Ahmad <ahmadmuhammadofficial@gmail.com>, Brock <darkicewolf50@gmail.com>
|
||||||
* @todo refactor to not call backend so much
|
* @todo refactor to not call backend so much, see useEffect above
|
||||||
*/
|
*/
|
||||||
const getInterviewDates = async () => {
|
const getInterviewDates = async () => {
|
||||||
const res = await fetch(
|
const res = await fetch(
|
||||||
@ -28,17 +27,21 @@ export default function TimeDateSelector ({ onTimeSlotSelect }) {
|
|||||||
let json = await res.json();
|
let json = await res.json();
|
||||||
|
|
||||||
// can input dates right away, no other requirements to show it
|
// can input dates right away, no other requirements to show it
|
||||||
let dates = await Object.keys(json["body"]["interviewDates"]);
|
let dates = await json["body"]["interviewDates"];
|
||||||
await setAllDatesAvailable(dates);
|
await setAllDatesAvailable(dates);
|
||||||
|
|
||||||
// storing here for use in time slot selection
|
|
||||||
// date is needed in order to show time
|
|
||||||
await setAllTimeDatesAvailable(json["body"]);
|
|
||||||
console.log(json["body"]);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// helper section
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Date} date - Takes in a date object from the date picker
|
||||||
|
* @returns {null} null - Returns in nothing
|
||||||
|
* @description checks if date is available from the backend
|
||||||
|
* @author Brock <darkicewolf50@gmail.com>
|
||||||
|
*/
|
||||||
const isDateAvailable = (date) => {
|
const isDateAvailable = (date) => {
|
||||||
return allDatesAvailable.includes(date.toISOString().split('T')[0]);
|
return Object.keys(allDatesAvailable).includes(date.toISOString().split('T')[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleDateChange = (date) => {
|
const handleDateChange = (date) => {
|
||||||
@ -46,26 +49,25 @@ export default function TimeDateSelector ({ onTimeSlotSelect }) {
|
|||||||
const selectedDateStr = date.toISOString().split('T')[0];
|
const selectedDateStr = date.toISOString().split('T')[0];
|
||||||
|
|
||||||
// get and set time slots for a given day
|
// get and set time slots for a given day
|
||||||
setTimeSlotsAvialable(Object.keys(allTimeDatesAvailable["interviewDates"][selectedDateStr]));
|
setTimeSlotsAvialable(Object.keys(allDatesAvailable[selectedDateStr]));
|
||||||
setSelectedTime(''); // clear because of date change
|
setSelectedTime(''); // clear because of date change
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleTimeSlotChange = (e) => {
|
const handleTimeSlotChange = (e) => {
|
||||||
let startTime = e.target.innerHTML;
|
let startTime = e.target.innerHTML;
|
||||||
setSelectedTime(startTime);
|
setSelectedTime(startTime);
|
||||||
|
|
||||||
|
onTimeSlotSelect({"date": selectedDate.toLocaleDateString(), "startTime": startTime });
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<label htmlFor="date-picker"><h3>Select a Date:</h3></label>
|
<label htmlFor="date-picker"><h3>Select a Date:</h3></label>
|
||||||
{/* old and bad */}
|
|
||||||
{/* Replace Calendar with input type="date" */}
|
|
||||||
{/* <input type="date" value={selectedDate} onChange={handleDateChange} /> */}
|
|
||||||
<DatePicker
|
<DatePicker
|
||||||
selected={selectedDate}
|
selected={selectedDate}
|
||||||
onChange={handleDateChange}
|
onChange={handleDateChange}
|
||||||
inline
|
inline
|
||||||
filterDate={isDateAvailable} // Filter out unavailable dates
|
filterDate={isDateAvailable} // Filter/grey out unavailable dates
|
||||||
dateFormat="yyyy-MM-dd"
|
dateFormat="yyyy-MM-dd"
|
||||||
required // Make date selection required
|
required // Make date selection required
|
||||||
/>
|
/>
|
||||||
@ -76,20 +78,19 @@ export default function TimeDateSelector ({ onTimeSlotSelect }) {
|
|||||||
</>
|
</>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
<h4>Available Time Slots for {selectedDate.toISOString().split('T')[0]}:</h4>
|
<label htmlFor="time-picker"><h4>Available Time Slots for {selectedDate.toISOString().split('T')[0]}:</h4></label>
|
||||||
{selectedDate === undefined ? (
|
{selectedDate === undefined ? (
|
||||||
<>
|
<>
|
||||||
<p>Please select a date.</p>
|
<p>Please select a date.</p>
|
||||||
</>
|
</>
|
||||||
// ) : timeSlots.length 0 > 0 ? (
|
|
||||||
) : timeSlotsAvialable !== '' ? (
|
) : timeSlotsAvialable !== '' ? (
|
||||||
<>
|
<>
|
||||||
{Object.values(timeSlotsAvialable).map((time) => {
|
{Object.values(timeSlotsAvialable).map((time) => {
|
||||||
return (
|
return (
|
||||||
<button
|
<button
|
||||||
key={time}
|
key={time}
|
||||||
|
type="button"
|
||||||
onClick={(self) => {
|
onClick={(self) => {
|
||||||
console.log(self.target.innerHTML);
|
|
||||||
handleTimeSlotChange(self);
|
handleTimeSlotChange(self);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
@ -107,7 +108,7 @@ export default function TimeDateSelector ({ onTimeSlotSelect }) {
|
|||||||
</>
|
</>
|
||||||
|
|
||||||
)}
|
)}
|
||||||
{selectedDate && selectedTime && (
|
{/* {selectedDate && selectedTime && (
|
||||||
<div>
|
<div>
|
||||||
<p>
|
<p>
|
||||||
You have selected:
|
You have selected:
|
||||||
@ -116,7 +117,7 @@ export default function TimeDateSelector ({ onTimeSlotSelect }) {
|
|||||||
<br />
|
<br />
|
||||||
Time: {selectedTime}
|
Time: {selectedTime}
|
||||||
</p>
|
</p>
|
||||||
</div>)}
|
</div>)} */}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user