| @@ -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'; | |||
| /* 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 SignaturePhoto from './pages/joiningLetter/SignaturePhoto'; | |||
| import TechinicalInterviewResults from './pages/technicalInterview/TechinicalInterviewResults'; | |||
| import CountdownTimer from './components/CountDownTimer/CountdownTimer'; | |||
| setupIonicReact(); | |||
| @@ -48,67 +46,68 @@ const App: React.FC = () => ( | |||
| <IonApp> | |||
| <IonReactRouter> | |||
| <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> | |||
| </IonReactRouter> | |||
| </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 { IonIcon, IonInput, IonItem, IonLabel } from '@ionic/react'; | |||
| import { useEffect, useState } from 'react'; | |||
| interface Props { | |||
| placeholder?: string; | |||
| type?: "text" | "email" | "password" | "number"; | |||
| icon?: string; | |||
| text?: string; | |||
| isInputSet?: (isSet: boolean) => void; | |||
| } | |||
| 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 ( | |||
| <div className={styles.inputContainer}> | |||
| <div className={styles.inputHolderContainer}> | |||
| @@ -21,7 +33,8 @@ const Input: React.FC<Props> = (props) => { | |||
| <IonLabel>{props.text}</IonLabel> | |||
| } | |||
| <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> | |||
| </div> | |||
| @@ -6,7 +6,6 @@ interface QuizDetails { | |||
| timeLimit: number; | |||
| } | |||
| let quizDetails: QuizDetails[] = [ | |||
| { | |||
| question: "How would you correctly display, “Hello, how are you?”?", | |||
| @@ -1,7 +1,7 @@ | |||
| .assignment { | |||
| .description { | |||
| height: 75vh; | |||
| height: 74vh; | |||
| .icon { | |||
| margin-top: 4rem; | |||
| @@ -2,7 +2,7 @@ | |||
| .description { | |||
| height: 50vh; | |||
| .icon { | |||
| margin-top: 4rem; | |||
| padding-top: 4rem; | |||
| display: flex; | |||
| justify-content: center; | |||
| ion-icon { | |||
| @@ -34,13 +34,13 @@ | |||
| .inputHolder { | |||
| width: 95%; | |||
| margin: 0 auto; | |||
| height: 25vh; | |||
| } | |||
| .submitAssigment { | |||
| text-decoration: none; | |||
| ion-button { | |||
| width: 90%; | |||
| margin: 0 auto; | |||
| margin-top: 12rem; | |||
| --background: var(--primary-button-color); | |||
| } | |||
| } | |||
| @@ -1,15 +1,32 @@ | |||
| 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 StepHeader from "../../components/stepsHeader/StepHeader"; | |||
| 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 { useState } from "react"; | |||
| 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 ( | |||
| <IonPage> | |||
| <StepHeader roundName="Assignment" stepNumber={4} /> | |||
| @@ -19,7 +36,6 @@ const SubmitAssignment: React.FC = () => { | |||
| <div className={styles.description}> | |||
| <div className={styles.icon}> | |||
| <IonIcon src={assignmentImage} /> | |||
| </div> | |||
| <div className={styles.stepDescription}> | |||
| @@ -31,12 +47,17 @@ const SubmitAssignment: React.FC = () => { | |||
| </div> | |||
| <div className={styles.inputHolder}> | |||
| <Input placeholder="Insert the project Link" icon={linkOutline} /> | |||
| <Input | |||
| placeholder="Insert the project Link" | |||
| icon={linkOutline} | |||
| isInputSet={isInputSet} /> | |||
| </div> | |||
| <Link to="/ReviewAssignment" | |||
| className={styles.submitAssigment}> | |||
| <Link to={isInput ? "/ReviewAssignment" : "/SubmitAssignment"} | |||
| className={styles.submitAssigment} | |||
| onClick={showToast}> | |||
| <IonButton shape="round" expand='block'>Submit</IonButton> | |||
| </Link> | |||
| </IonContent> | |||
| </IonPage> | |||
| ); | |||
| @@ -7,6 +7,8 @@ import locationIcon from "../../assets/icons/location.svg"; | |||
| import { Link } from "react-router-dom"; | |||
| import { useState } from "react"; | |||
| import TimeSlot from "../../components/timeSlot/TimeSlot"; | |||
| import { useCountdown } from "../../components/CountDownTimer/useCountdown"; | |||
| import { addDays } from "date-fns"; | |||
| interface dates { | |||
| date: string; | |||
| @@ -18,6 +20,8 @@ const FinalInterview: React.FC = () => { | |||
| const [isDateSet, setDate] = 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 dates: dates[] = [ | |||
| @@ -21,7 +21,8 @@ const TechnicalInterview: React.FC = () => { | |||
| const [isDateSet, setDate] = 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); | |||