Skip to content
Snippets Groups Projects
Alerts.jsx 11.5 KiB
Newer Older
import { locationsWithCountries, positionTypes } from "data/jobs-data.json";
Nitin Jadhav's avatar
Nitin Jadhav committed
import { isEqual } from "lodash";
import { useContext, useRef, useState } from "react";
Nitin Jadhav's avatar
Nitin Jadhav committed
import { useForm } from "react-hook-form";
Nitin Jadhav's avatar
Nitin Jadhav committed
import { AppContext } from "../../app/AppContext";
import { VFBreadcrumbs } from "../../component-templates/VFBreadcrumbs";
Nitin Jadhav's avatar
Nitin Jadhav committed
import { EMAIL_VALIDATION_REGEX } from "../../helpers/helpers";
Nitin Jadhav's avatar
Nitin Jadhav committed
import { EmblFooter } from "../EmblFooter";
import { EmblHeader } from "../EmblHeader";
import "./Alerts.scss";
Nitin Jadhav's avatar
Nitin Jadhav committed

Nitin Jadhav's avatar
Nitin Jadhav committed
const locationsWithCountriesValues = Object.values(locationsWithCountries);
const positionTypesValues = Object.keys(positionTypes);

Nitin Jadhav's avatar
Nitin Jadhav committed
/* Subscription-alerts page, uses react-hook-form */
export function Alerts() {
Nitin Jadhav's avatar
Nitin Jadhav committed
  const { isEBISite } = useContext(AppContext);
Nitin Jadhav's avatar
Nitin Jadhav committed
  const formRef = useRef();
  const {
    register,
    handleSubmit,
    watch,
    formState: { errors },
Nitin Jadhav's avatar
Nitin Jadhav committed
    setValue,
Nitin Jadhav's avatar
Nitin Jadhav committed
  } = useForm({
    defaultValues: {
Nitin Jadhav's avatar
Nitin Jadhav committed
      loc: [],
      pos: [],
Nitin Jadhav's avatar
Nitin Jadhav committed
    },
  });

Nitin Jadhav's avatar
Nitin Jadhav committed
  const [subscriptionState, setSubscriptionState] = useState("pending");
  const [validationError, setValidationError] = useState(null);
Nitin Jadhav's avatar
Nitin Jadhav committed

Nitin Jadhav's avatar
Nitin Jadhav committed
  const onSubmit = () => {
Nitin Jadhav's avatar
Nitin Jadhav committed
    // formRef.current.submit();
    const formData = new FormData(formRef.current);
    const params = new URLSearchParams(formData);
    // console.log("params", params);
    const jobUrl = `${process.env.REACT_APP_JOB_URL}${params.toString()}`;
    fetch(jobUrl, {
      method: "GET",
    })
      .then((response) => {
        if (response.status !== 200)
          throw new Error(`${response.status} ${response.statusText}`);
Nitin Jadhav's avatar
Nitin Jadhav committed
        setSubscriptionState("success");
      })
      .catch((error) => {
        console.log(error.message);
Nitin Jadhav's avatar
Nitin Jadhav committed
        setSubscriptionState("error");
        if (error.message.startsWith("422")) {
          setValidationError("Validation Error");
        }
Nitin Jadhav's avatar
Nitin Jadhav committed
      });
Nitin Jadhav's avatar
Nitin Jadhav committed
  };

  /*
   * Below code - takes ("watches") value of the loc or pos field array
   * from react-hooks-form. Then it creates an object {disabled: true/false}
   * object for spreading on the non-all checkboxes.
   * Value is based on if the first element is "0" i.e. "All xxx" selected or not
   * */
Nitin Jadhav's avatar
Nitin Jadhav committed

Nitin Jadhav's avatar
Nitin Jadhav committed
  const allLocationsValue = watch("loc");
Nitin Jadhav's avatar
Nitin Jadhav committed
  const isAllLocationsSelected = isEqual(
    allLocationsValue,
    locationsWithCountriesValues
  );

Nitin Jadhav's avatar
Nitin Jadhav committed
  const allPosValue = watch("pos");
Nitin Jadhav's avatar
Nitin Jadhav committed
  const isAllPositionsSelected = isEqual(allPosValue, positionTypesValues);
Nitin Jadhav's avatar
Nitin Jadhav committed

  return (
    <>
Nitin Jadhav's avatar
Nitin Jadhav committed
      <EmblHeader />
      <VFBreadcrumbs
        breadcrumbItems={[
Nitin Jadhav's avatar
Nitin Jadhav committed
          { title: "EMBL jobs", link: "https://www.embl.org/jobs" },
Nitin Jadhav's avatar
Nitin Jadhav committed
          { title: "Job alerts" },
        ]}
      />
      {subscriptionState === "success" && (
        <section className="vf-intro">
          <div></div>

          <div className="vf-stack">
Nitin Jadhav's avatar
Nitin Jadhav committed
            <h1 className="vf-intro__heading ">EMBL job alerts</h1>
Nitin Jadhav's avatar
Nitin Jadhav committed

            <p className="vf-intro__text">
Nitin Jadhav's avatar
Nitin Jadhav committed
              Thank you for subscribing to the EMBL job alerts.
Nitin Jadhav's avatar
Nitin Jadhav committed
              <br />
              <br />
              You should receive a confirmation email shortly.
              <br />
              <br />
              From now on, you'll be among the first to know about our latest
              career opportunities.
              <br />
Nitin Jadhav's avatar
Nitin Jadhav committed
            </p>
            {isEBISite ? (
              <a
                className="vf-button vf-button--primary"
                href="https://www.ebi.ac.uk/careers/jobs"
              >
                View jobs at EMBL-EBI
              </a>
            ) : (
              <a
                className="vf-button vf-button--primary"
                href="https://www.embl.org/jobs/"
              >
                View jobs at EMBL
              </a>
Nitin Jadhav's avatar
Nitin Jadhav committed
            )}
Nitin Jadhav's avatar
Nitin Jadhav committed
          </div>
        </section>
      )}
      {subscriptionState === "error" && (
        <section className="vf-intro">
          <div></div>
Nitin Jadhav's avatar
Nitin Jadhav committed

Nitin Jadhav's avatar
Nitin Jadhav committed
          <div className="vf-stack">
            <h1 className="vf-intro__heading ">Error</h1>
            {validationError ? (
              <>
                <p className="vf-lede">There was a validation error.</p>
                <p className="vf-intro__text">
                  Please check your details and try again.
                <p className="vf-lede">There was a technical error.</p>
                <p className="vf-intro__text">
                  This problem means that the service you are trying to access
                  currently unavailable. Please try again later.
                </p>
Nitin Jadhav's avatar
Nitin Jadhav committed
          </div>
        </section>
      )}
Nitin Jadhav's avatar
Nitin Jadhav committed

Nitin Jadhav's avatar
Nitin Jadhav committed
      {subscriptionState === "pending" && (
        <>
          <section className="vf-intro" id="an-id-for-anchor">
            <div>{/* empty */}</div>
Nitin Jadhav's avatar
Nitin Jadhav committed

Nitin Jadhav's avatar
Nitin Jadhav committed
            <div className="vf-stack vf-stack--400">
Nitin Jadhav's avatar
Nitin Jadhav committed
              <h1 className="vf-intro__heading ">EMBL job alerts</h1>
Nitin Jadhav's avatar
Nitin Jadhav committed
              <p className="vf-lede">Get the latest postings in your inbox.</p>

              <p className="vf-intro__text">
                Configure your criteria and add your email address to configure
                your alert.{" "}
              </p>
Nitin Jadhav's avatar
Nitin Jadhav committed
            </div>
          </section>
          <section className="vf-intro | embl-grid embl-grid--has-centered-content">
Nitin Jadhav's avatar
Nitin Jadhav committed
            <div className="vf-content">
              <form
                action="https://www.embl.de/jobs/searchjobs/index.php"
                method="GET"
                className="vf-form"
                ref={formRef}
                onSubmit={handleSubmit(onSubmit)}
              >
                <input type="hidden" name="newlang" value="1" />

                <label htmlFor="email_alert" className="vf-form__label">
                  Email address
                </label>
                <input
                  type="text"
                  {...register("email_alert", {
                    required: true,
                    pattern: EMAIL_VALIDATION_REGEX,
                  })}
                  id="email_alert"
                  className={`vf-form__input ${
                    errors.email_alert && "vf-form__input--invalid"
                  }`}
                  placeholder="email@youraddress.net"
                />

                {errors.email_alert && (
                  <p className="vf-form__helper vf-form__helper--error">
                    {errors.email_alert.type === "required"
                      ? "Email address is required."
                      : "Invalid email address."}
                  </p>
                )}

                <br />

                <fieldset className="vf-form__fieldset vf-u-margin__bottom--800">
                  <legend className="form-subtitle vf-form__legend">
                    Location
                  </legend>
                  <div className="vf-u-margin__top--200 vf-u-margin__bottom--400">
                    {!isAllLocationsSelected && (
                      <button
                        className="vf-link link-button"
                        onClick={() => {
                          setValue("loc", locationsWithCountriesValues);
                        }}
                      >
                        Select all locations
                      </button>
                    )}
                    {isAllLocationsSelected && (
                      <button
                        className="vf-link link-button"
                        onClick={() => {
                          setValue("loc", []);
                        }}
Nitin Jadhav's avatar
Nitin Jadhav committed
                        Clear all locations
                      </button>
                    )}
                  </div>
                  <div className="grid">
                    <ul className="vf-list">
                      {Object.entries(locationsWithCountries).map(
                        ([displayText, locationValue]) => (
                          <li
                            key={locationValue}
                            className="vf-form__item vf-form__item--checkbox"
                          >
                            <input
                              type="checkbox"
                              className="vf-form__checkbox"
                              id={"loc" + locationValue}
                              value={locationValue}
                              {...register("loc[]")}
                            />
                            <label
                              htmlFor={"loc" + locationValue}
                              className="vf-form__label"
                            >
                              {displayText}
                            </label>
                          </li>
                        )
                      )}
                    </ul>
                  </div>
                </fieldset>

                <fieldset className="fieldset-job vf-form__fieldset">
                  <legend className="form-subtitle vf-form__legend">
                    Categories
                  </legend>
                  <div className="vf-u-margin__top--200 vf-u-margin__bottom--400">
                    {!isAllPositionsSelected && (
                      <button
                        className="vf-link link-button"
                        onClick={() => {
                          setValue("pos", positionTypesValues);
                        }}
                      >
                        Select all categories
                      </button>
                    )}
                    {isAllPositionsSelected && (
                      <button
                        className="vf-link link-button"
                        onClick={() => {
                          setValue("pos", []);
                        }}
                      >
                        Clear all categories
                      </button>
                    )}
                  </div>
                  <div className="grid">
                    <ul className="vf-list">
                      {Object.entries(positionTypes).map(
                        ([value, displayText], index) => (
                          <li
                            key={value}
                            className="vf-form__item vf-form__item--checkbox"
                          >
                            <input
                              type="checkbox"
                              className="vf-form__checkbox"
                              id={"pos" + index}
                              value={value}
                              {...register("pos[]")}
                            />
                            <label
                              htmlFor={"pos" + index}
                              className="vf-form__label"
                            >
                              {displayText}
                            </label>
                          </li>
                        )
                      )}
                    </ul>
                  </div>
                </fieldset>
                <input type="hidden" name="srch_trm" value="" />
                <input
                  type="hidden"
                  name="create_job_alert"
                  value="Create job alert"
                />

                <div className="buttons clearfix vf-u-margin__top--800">
Nitin Jadhav's avatar
Nitin Jadhav committed
                  <input
Nitin Jadhav's avatar
Nitin Jadhav committed
                    type="submit"
                    id="jobs_alert_btn"
                    className="vf-button vf-button--primary"
                    value="Create job alert"
                    title="Create job alert"
Nitin Jadhav's avatar
Nitin Jadhav committed
                  />
                </div>
Nitin Jadhav's avatar
Nitin Jadhav committed
              </form>
Nitin Jadhav's avatar
Nitin Jadhav committed
            </div>
Nitin Jadhav's avatar
Nitin Jadhav committed
          </section>
        </>
      )}
      <EmblFooter />
Nitin Jadhav's avatar
Nitin Jadhav committed
    </>
  );
}