feat(InterviewBooking): added failure points to refresh, TODO css, fix backend to get a success

This commit is contained in:
darkicewolf50 2025-02-22 14:06:22 -07:00
parent 7999abaf25
commit 82d151a159
2 changed files with 39 additions and 25 deletions

View File

@ -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

View File

@ -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>
); );
}; };