diff --git a/src/constants/index.js b/src/constants/index.js index ff52aac..072b023 100644 --- a/src/constants/index.js +++ b/src/constants/index.js @@ -48,6 +48,19 @@ export const POSITION_STATUS = { CANCELLED: "cancelled", }; +/** + * Interview related constants + */ +export const INTERVIEW_STATUS = { + SCHEDULING: "Scheduling", + SCHEDULED: "Scheduled", + REQUESTEDFORRESCHEDULE: "Requested for reschedule", + RESCHEDULED: "Rescheduled", + COMPLETED: "Completed", + CANCELLED: "Cancelled", + EXPIRED: "Expired", +}; + /** * Mapping between position status "server value" and human readable value */ diff --git a/src/root.component.jsx b/src/root.component.jsx index 9c89234..159e979 100644 --- a/src/root.component.jsx +++ b/src/root.component.jsx @@ -19,6 +19,7 @@ import InputSkills from "./routes/CreateNewTeam/pages/InputSkills"; import InputJobDescription from "./routes/CreateNewTeam/pages/InputJobDescription"; import SelectRole from "./routes/CreateNewTeam/pages/SelectRole"; import CreateTaasPayment from "./routes/CreateNewTeam/pages/CreateTaasPayment"; +import SchedulingPage from "./routes/SchedulingPage"; import ReduxToastr from "react-redux-toastr"; import store from "./store"; import "./styles/main.vendor.scss"; @@ -50,6 +51,7 @@ export default function Root() { <InputSkills path="skills/*" /> <SelectRole path="role/*" /> </CreateNewTeam> + <SchedulingPage path="/taas/interview/:interviewId" /> </Router> {/* Global config for Toastr popups */} diff --git a/src/routes/SchedulingPage/index.jsx b/src/routes/SchedulingPage/index.jsx new file mode 100644 index 0000000..c425945 --- /dev/null +++ b/src/routes/SchedulingPage/index.jsx @@ -0,0 +1,70 @@ +/** + * Scheduling Page + * + * Allows users to set up bookings for an interview in Nylas + */ +import React, { useEffect, useState } from "react"; +import { getAuthUserProfile } from "@topcoder/micro-frontends-navbar-app"; +import _ from "lodash"; +import Page from "components/Page"; +import LoadingIndicator from "components/LoadingIndicator"; +import PageHeader from "components/PageHeader"; +import { getInterview } from "services/interviews"; +import { INTERVIEW_STATUS } from "constants"; +import withAuthentication from "../../hoc/withAuthentication"; + +const SchedulingPage = ({ interviewId }) => { + const [schedulingPageUrl, setSchedulingPageUrl] = useState(null); + const [errorMessage, setErrorMessage] = useState(null); + + // if there are some candidates to review, then show "To Review" tab by default + useEffect(() => { + getAuthUserProfile() + .then((res) => { + return { + firstName: res.firstName, + lastName: res.lastName, + email: res.email, + }; + }) + .then((profile) => { + getInterview(interviewId) + .then(({ data }) => { + if (data.status === INTERVIEW_STATUS.SCHEDULING) { + setSchedulingPageUrl( + `https://schedule.nylas.com/${data.nylasPageSlug}?email=${ + profile.email + }&name=${encodeURI( + profile.firstName + " " + profile.lastName + )}&prefilled_readonly=true` + ); + } else { + setErrorMessage("No interviews scheduled"); + } + }) + .catch((err) => { + setErrorMessage(err); + }); + }); + }, [interviewId]); + + return ( + <Page title="Schedule Interview"> + {!schedulingPageUrl ? ( + <LoadingIndicator error={errorMessage} /> + ) : ( + <> + <PageHeader title="Schedule Interview" /> + <iframe + title="Nylas Scheduling Page" + src={schedulingPageUrl} + width="1020" + height="900" + /> + </> + )} + </Page> + ); +}; + +export default withAuthentication(SchedulingPage); diff --git a/src/services/interviews.js b/src/services/interviews.js index c8b93fe..139d68a 100644 --- a/src/services/interviews.js +++ b/src/services/interviews.js @@ -17,3 +17,12 @@ export const confirmInterview = (candidateJobId, data) => { data ); }; + +/** + * Returns the interview page url for the given interview + * @param {String} interviewId The interview id + * @returns Promise + */ +export const getInterview = (interviewId) => { + return axios.get(`${config.API.V5}/getInterview/${interviewId}`); +};