@@ -1,5 +1,5 @@ | |||||
import { Redirect, Route } from 'react-router-dom'; | |||||
import { IonApp, IonRouterOutlet, setupIonicReact } from '@ionic/react'; | |||||
import { Redirect, Route, Switch } from 'react-router-dom'; | |||||
import { IonApp, IonItem, IonRouterOutlet, setupIonicReact } from '@ionic/react'; | |||||
import { IonReactRouter } from '@ionic/react-router'; | import { IonReactRouter } from '@ionic/react-router'; | ||||
/* Core CSS required for Ionic components to work properly */ | /* Core CSS required for Ionic components to work properly */ | ||||
@@ -38,8 +38,6 @@ import JoiningLetter from './pages/joiningLetter/JoiningLetter'; | |||||
import Celebration from './pages/celebration/Celebration'; | import Celebration from './pages/celebration/Celebration'; | ||||
import SignaturePhoto from './pages/joiningLetter/SignaturePhoto'; | import SignaturePhoto from './pages/joiningLetter/SignaturePhoto'; | ||||
import TechinicalInterviewResults from './pages/technicalInterview/TechinicalInterviewResults'; | import TechinicalInterviewResults from './pages/technicalInterview/TechinicalInterviewResults'; | ||||
import CountdownTimer from './components/CountDownTimer/CountdownTimer'; | |||||
setupIonicReact(); | setupIonicReact(); | ||||
@@ -48,67 +46,68 @@ const App: React.FC = () => ( | |||||
<IonApp> | <IonApp> | ||||
<IonReactRouter> | <IonReactRouter> | ||||
<IonRouterOutlet> | <IonRouterOutlet> | ||||
<Route exact path="/interviewRounds"> | |||||
<InterviewRounds /> | |||||
</Route> | |||||
<Route exact path="/skillInformationStep"> | |||||
<SkillInformationStep /> | |||||
</Route> | |||||
<Route exact path="/quiz"> | |||||
<Quiz /> | |||||
</Route> | |||||
<Route exact path="/preliminaryRound"> | |||||
<PreliminaryRound /> | |||||
</Route> | |||||
<Route exact path="/preliminaryRoundResults"> | |||||
<PreliminaryRoundResults /> | |||||
</Route> | |||||
<Route exact path="/technicalInterview"> | |||||
<TechnicalInterview /> | |||||
</Route> | |||||
<Route exact path="/technicalInterview/techinicalInterviewResults"> | |||||
<TechinicalInterviewResults /> | |||||
</Route> | |||||
<Route exact path="/assignment"> | |||||
<Assignment /> | |||||
</Route> | |||||
<Route exact path="/assignmentDetails"> | |||||
<AssignmentDetails /> | |||||
</Route> | |||||
<Route exact path="/SubmitAssignment"> | |||||
<SubmitAssignment /> | |||||
</Route> | |||||
<Route exact path="/ReviewAssignment"> | |||||
<ReviewAssignment /> | |||||
</Route> | |||||
<Route exact path="/assignmentCompleted"> | |||||
<AssignmentCompleted /> | |||||
</Route> | |||||
<Route exact path="/finalInterview"> | |||||
<FinalInterview /> | |||||
</Route> | |||||
<Route exact path="/finalInterview/results"> | |||||
<FinalInterviewResult /> | |||||
</Route> | |||||
<Route exact path="/closingDocs"> | |||||
<ClosingDocs /> | |||||
</Route> | |||||
<Route exact path="/verifiedDocs"> | |||||
<VerifiedDocs /> | |||||
</Route> | |||||
<Route exact path="/joiningLetter"> | |||||
<JoiningLetter /> | |||||
</Route> | |||||
<Route exact path="/joiningLetter/signaturePhoto"> | |||||
<SignaturePhoto /> | |||||
</Route> | |||||
<Route exact path="/celebration"> | |||||
<Celebration /> | |||||
</Route> | |||||
<Route exact path="/"> | |||||
<Redirect to="/interviewRounds" /> | |||||
</Route> | |||||
<Switch> | |||||
<Route exact path="/interviewRounds"> | |||||
<InterviewRounds /> | |||||
</Route> | |||||
<Route exact path="/skillInformationStep"> | |||||
<SkillInformationStep /> | |||||
</Route> | |||||
<Route exact path="/quiz"> | |||||
<Quiz /> | |||||
</Route> | |||||
<Route exact path="/preliminaryRound"> | |||||
<PreliminaryRound /> | |||||
</Route> | |||||
<Route exact path="/preliminaryRoundResults"> | |||||
<PreliminaryRoundResults /> | |||||
</Route> | |||||
<Route exact path="/technicalInterview"> | |||||
<TechnicalInterview /> | |||||
</Route> | |||||
<Route exact path="/technicalInterview/techinicalInterviewResults"> | |||||
<TechinicalInterviewResults /> | |||||
</Route> | |||||
<Route exact path="/assignment"> | |||||
<Assignment /> | |||||
</Route> | |||||
<Route exact path="/assignmentDetails"> | |||||
<AssignmentDetails /> | |||||
</Route> | |||||
<Route exact path="/SubmitAssignment"> | |||||
<SubmitAssignment /> | |||||
</Route> | |||||
<Route exact path="/ReviewAssignment"> | |||||
<ReviewAssignment /> | |||||
</Route> | |||||
<Route exact path="/assignmentCompleted"> | |||||
<AssignmentCompleted /> | |||||
</Route> | |||||
<Route exact path="/finalInterview"> | |||||
<FinalInterview /> | |||||
</Route> | |||||
<Route exact path="/finalInterview/results"> | |||||
<FinalInterviewResult /> | |||||
</Route> | |||||
<Route exact path="/closingDocs"> | |||||
<ClosingDocs /> | |||||
</Route> | |||||
<Route exact path="/verifiedDocs"> | |||||
<VerifiedDocs /> | |||||
</Route> | |||||
<Route exact path="/joiningLetter"> | |||||
<JoiningLetter /> | |||||
</Route> | |||||
<Route exact path="/joiningLetter/signaturePhoto"> | |||||
<SignaturePhoto /> | |||||
</Route> | |||||
<Route exact path="/celebration"> | |||||
<Celebration /> | |||||
</Route> | |||||
<Route exact path="/"> | |||||
<Redirect to="/interviewRounds" /> | |||||
</Route> | |||||
</Switch> | |||||
</IonRouterOutlet> | </IonRouterOutlet> | ||||
</IonReactRouter> | </IonReactRouter> | ||||
</IonApp> | </IonApp> | ||||
@@ -0,0 +1,56 @@ | |||||
.toastContent { | |||||
width: 90%; | |||||
position: fixed; | |||||
bottom:5%; | |||||
left: 5%; | |||||
z-index: 10; | |||||
.toastHolder { | |||||
display: flex; | |||||
align-items: center; | |||||
justify-content: space-between; | |||||
border: 0.1rem solid transparent; | |||||
border-radius: 2.5rem; | |||||
background-color: white; | |||||
min-height: 4rem; | |||||
.messageHolder { | |||||
display: flex; | |||||
align-items: center; | |||||
margin-left: 1.5rem; | |||||
.text { | |||||
margin-left: 1rem; | |||||
font-size: 1.4rem; | |||||
} | |||||
} | |||||
.closeIcon { | |||||
color: #ec0b6d; | |||||
min-width: 20px; | |||||
height: 20px; | |||||
margin-right: 10px; | |||||
} | |||||
.checkIcon { | |||||
width: 20px; | |||||
height: 20px; | |||||
color: #00ae8d; | |||||
} | |||||
.errorIcon { | |||||
min-width: 20px; | |||||
height: 20px; | |||||
color: #ea7a7a; | |||||
} | |||||
} | |||||
.error { | |||||
box-shadow: 0 0 15px #ea7a7a; | |||||
} | |||||
.success { | |||||
box-shadow: 0 0 15px #00ae8d; | |||||
} | |||||
} |
@@ -0,0 +1,48 @@ | |||||
import { IonIcon, IonItem } from "@ionic/react"; | |||||
import styles from "./Toast.module.scss"; | |||||
import { checkmarkCircle, closeCircle, alertCircle } from 'ionicons/icons'; | |||||
import { useEffect, useState } from "react"; | |||||
interface OwnProps { | |||||
message: string; | |||||
messageType: string; | |||||
showToast: boolean; | |||||
} | |||||
const Toast: React.FC<OwnProps> = (props) => { | |||||
const [showToast, setShowToast] = useState(props.showToast); | |||||
console.log("show props", props.showToast); | |||||
useEffect(() => { | |||||
setShowToast(props.showToast); | |||||
}, [props.showToast]); | |||||
// const [showToast, setShowToast] = useState(props.showToast); | |||||
console.log(showToast) | |||||
const closeToast = () => { | |||||
setShowToast(false); | |||||
} | |||||
setTimeout(() => { | |||||
closeToast(); | |||||
}, 3000); | |||||
return ( | |||||
<div className={styles.toastContent}> | |||||
{showToast && < div className={styles.toastHolder + " " + styles.error} > | |||||
<div className={styles.messageHolder}> | |||||
<IonIcon className={styles.errorIcon} icon={alertCircle} /> | |||||
<div className={styles.text}>invalid Input</div> | |||||
</div> | |||||
<IonIcon className={styles.closeIcon} icon={closeCircle} /> | |||||
</div>} | |||||
</div > | |||||
); | |||||
} | |||||
export default Toast; |
@@ -1,14 +1,26 @@ | |||||
import styles from './Input.module.scss'; | import styles from './Input.module.scss'; | ||||
import { IonIcon, IonInput, IonItem, IonLabel } from '@ionic/react'; | import { IonIcon, IonInput, IonItem, IonLabel } from '@ionic/react'; | ||||
import { useEffect, useState } from 'react'; | |||||
interface Props { | interface Props { | ||||
placeholder?: string; | placeholder?: string; | ||||
type?: "text" | "email" | "password" | "number"; | type?: "text" | "email" | "password" | "number"; | ||||
icon?: string; | icon?: string; | ||||
text?: string; | text?: string; | ||||
isInputSet?: (isSet: boolean) => void; | |||||
} | } | ||||
const Input: React.FC<Props> = (props) => { | const Input: React.FC<Props> = (props) => { | ||||
const [inputText, setInputText] = useState<string | number | undefined>(undefined); | |||||
useEffect(() => { | |||||
if (inputText) { | |||||
props.isInputSet!(true); | |||||
} else { | |||||
props.isInputSet!(false); | |||||
} | |||||
}, [inputText]) | |||||
return ( | return ( | ||||
<div className={styles.inputContainer}> | <div className={styles.inputContainer}> | ||||
<div className={styles.inputHolderContainer}> | <div className={styles.inputHolderContainer}> | ||||
@@ -21,7 +33,8 @@ const Input: React.FC<Props> = (props) => { | |||||
<IonLabel>{props.text}</IonLabel> | <IonLabel>{props.text}</IonLabel> | ||||
} | } | ||||
<IonInput type={props.type ? props.type : "text"} | <IonInput type={props.type ? props.type : "text"} | ||||
placeholder={props.placeholder ? props.placeholder : ""}></IonInput> | |||||
placeholder={props.placeholder ? props.placeholder : ""} | |||||
onIonChange={e => setInputText(e.detail.value!)}></IonInput> | |||||
</IonItem> | </IonItem> | ||||
</div> | </div> | ||||
@@ -6,7 +6,6 @@ interface QuizDetails { | |||||
timeLimit: number; | timeLimit: number; | ||||
} | } | ||||
let quizDetails: QuizDetails[] = [ | let quizDetails: QuizDetails[] = [ | ||||
{ | { | ||||
question: "How would you correctly display, “Hello, how are you?”?", | question: "How would you correctly display, “Hello, how are you?”?", | ||||
@@ -1,7 +1,7 @@ | |||||
.assignment { | .assignment { | ||||
.description { | .description { | ||||
height: 75vh; | |||||
height: 74vh; | |||||
.icon { | .icon { | ||||
margin-top: 4rem; | margin-top: 4rem; | ||||
@@ -2,7 +2,7 @@ | |||||
.description { | .description { | ||||
height: 50vh; | height: 50vh; | ||||
.icon { | .icon { | ||||
margin-top: 4rem; | |||||
padding-top: 4rem; | |||||
display: flex; | display: flex; | ||||
justify-content: center; | justify-content: center; | ||||
ion-icon { | ion-icon { | ||||
@@ -34,13 +34,13 @@ | |||||
.inputHolder { | .inputHolder { | ||||
width: 95%; | width: 95%; | ||||
margin: 0 auto; | margin: 0 auto; | ||||
height: 25vh; | |||||
} | } | ||||
.submitAssigment { | .submitAssigment { | ||||
text-decoration: none; | text-decoration: none; | ||||
ion-button { | ion-button { | ||||
width: 90%; | width: 90%; | ||||
margin: 0 auto; | margin: 0 auto; | ||||
margin-top: 12rem; | |||||
--background: var(--primary-button-color); | --background: var(--primary-button-color); | ||||
} | } | ||||
} | } |
@@ -1,15 +1,32 @@ | |||||
import styles from "./SubmitAssignment.module.scss"; | import styles from "./SubmitAssignment.module.scss"; | ||||
import { IonButton, IonContent, IonIcon, IonPage } from "@ionic/react" | |||||
import { IonButton, IonContent, IonIcon, IonPage, useIonToast } from "@ionic/react" | |||||
import assignmentImage from "../../assets/icons/Assignment.svg"; | import assignmentImage from "../../assets/icons/Assignment.svg"; | ||||
import StepHeader from "../../components/stepsHeader/StepHeader"; | import StepHeader from "../../components/stepsHeader/StepHeader"; | ||||
import Input from "../../components/formInput/Input"; | import Input from "../../components/formInput/Input"; | ||||
import linkIcon from "../../assets/icons/link.svg"; | |||||
import time from "../../assets/icons/time.svg"; | |||||
import { linkOutline } from 'ionicons/icons' | |||||
import { linkOutline } from 'ionicons/icons'; | |||||
import { Link } from "react-router-dom"; | import { Link } from "react-router-dom"; | ||||
import { useState } from "react"; | |||||
const SubmitAssignment: React.FC = () => { | const SubmitAssignment: React.FC = () => { | ||||
const [isInput, setIsInput] = useState(false); | |||||
const [present, dismiss] = useIonToast(); | |||||
const isInputSet = (isSet: boolean) => { | |||||
setIsInput(isSet); | |||||
} | |||||
const showToast = () => { | |||||
if (!isInput) { | |||||
present({ | |||||
buttons: [{ text: 'close', handler: () => dismiss() }], | |||||
message: 'insert project link to submit', | |||||
duration: 2000 | |||||
}) | |||||
} | |||||
} | |||||
return ( | return ( | ||||
<IonPage> | <IonPage> | ||||
<StepHeader roundName="Assignment" stepNumber={4} /> | <StepHeader roundName="Assignment" stepNumber={4} /> | ||||
@@ -19,7 +36,6 @@ const SubmitAssignment: React.FC = () => { | |||||
<div className={styles.description}> | <div className={styles.description}> | ||||
<div className={styles.icon}> | <div className={styles.icon}> | ||||
<IonIcon src={assignmentImage} /> | <IonIcon src={assignmentImage} /> | ||||
</div> | </div> | ||||
<div className={styles.stepDescription}> | <div className={styles.stepDescription}> | ||||
@@ -31,12 +47,17 @@ const SubmitAssignment: React.FC = () => { | |||||
</div> | </div> | ||||
<div className={styles.inputHolder}> | <div className={styles.inputHolder}> | ||||
<Input placeholder="Insert the project Link" icon={linkOutline} /> | |||||
<Input | |||||
placeholder="Insert the project Link" | |||||
icon={linkOutline} | |||||
isInputSet={isInputSet} /> | |||||
</div> | </div> | ||||
<Link to="/ReviewAssignment" | |||||
className={styles.submitAssigment}> | |||||
<Link to={isInput ? "/ReviewAssignment" : "/SubmitAssignment"} | |||||
className={styles.submitAssigment} | |||||
onClick={showToast}> | |||||
<IonButton shape="round" expand='block'>Submit</IonButton> | <IonButton shape="round" expand='block'>Submit</IonButton> | ||||
</Link> | </Link> | ||||
</IonContent> | </IonContent> | ||||
</IonPage> | </IonPage> | ||||
); | ); | ||||
@@ -7,6 +7,8 @@ import locationIcon from "../../assets/icons/location.svg"; | |||||
import { Link } from "react-router-dom"; | import { Link } from "react-router-dom"; | ||||
import { useState } from "react"; | import { useState } from "react"; | ||||
import TimeSlot from "../../components/timeSlot/TimeSlot"; | import TimeSlot from "../../components/timeSlot/TimeSlot"; | ||||
import { useCountdown } from "../../components/CountDownTimer/useCountdown"; | |||||
import { addDays } from "date-fns"; | |||||
interface dates { | interface dates { | ||||
date: string; | date: string; | ||||
@@ -18,6 +20,8 @@ const FinalInterview: React.FC = () => { | |||||
const [isDateSet, setDate] = useState<boolean>(false); | const [isDateSet, setDate] = useState<boolean>(false); | ||||
const [isTimeSlot, setTimeSlot] = useState<boolean>(false); | const [isTimeSlot, setTimeSlot] = useState<boolean>(false); | ||||
const [days, hours, minutes, seconds] = useCountdown(addDays(new Date(), 3)); | |||||
const timeSlots = ["11:00 AM - 1:00 pm", "1:00 PM - 3:00 pm", "3:00 PM - 5:00 pm"]; | const timeSlots = ["11:00 AM - 1:00 pm", "1:00 PM - 3:00 pm", "3:00 PM - 5:00 pm"]; | ||||
const dates: dates[] = [ | const dates: dates[] = [ | ||||
@@ -21,7 +21,8 @@ const TechnicalInterview: React.FC = () => { | |||||
const [isDateSet, setDate] = useState<boolean>(false); | const [isDateSet, setDate] = useState<boolean>(false); | ||||
const [isTimeSlot, setTimeSlot] = useState<boolean>(false); | const [isTimeSlot, setTimeSlot] = useState<boolean>(false); | ||||
const [days, hours, minutes, seconds] = useCountdown(addDays(new Date(), 2)); | |||||
const [days, hours, minutes, seconds] = useCountdown(addDays(new Date(), 3)); | |||||
console.log(days, hours, minutes, seconds); | console.log(days, hours, minutes, seconds); | ||||