/** * @copyright nhcarrigan * @license Naomi's Public License * @author Naomi Carrigan */ "use client"; import { faCalendar, faQuestionCircle, faTasks, } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { type JSX, useCallback, useState } from "react"; import { Volunteer } from "../icons/Volunteer"; interface JobProperties { readonly title: string; readonly company: string; readonly start: Date; readonly end: Date | null; readonly link: string; readonly type: "volunteer" | "fixed" | "project" | "hypothetical"; readonly description: string; readonly logo: string; } const IconMap = { fixed: faCalendar, hypothetical: faQuestionCircle, project: faTasks, volunteer: Volunteer, }; const getColor = (type: JobProperties["type"], end: JobProperties["end"]): string => { if (type === "hypothetical") { return "text-[--primary]"; } if (end) { return "text-[--former]"; } return "text-[--current]"; }; const getBorder = (type: JobProperties["type"], end: JobProperties["end"]): string => { if (type === "hypothetical") { return "border-[--primary]"; } if (end) { return "border-[--former]"; } return "border-[--current]"; }; /** * Renders the view for a job. * @param properties - The job to render. * @returns A JSX element. */ export const Job = (properties: JobProperties): JSX.Element => { const { title, company, start, end, type, description } = properties; const [ showDescription, setShowDescription ] = useState(false); const toggleDescription = useCallback((): void => { setShowDescription(!showDescription); }, [ showDescription ]); const color = getColor(type, end); const border = getBorder(type, end); const borderStyle = end ? "border-dashed border-2" : "border-double border-4"; return (
  • {`${title} for ${company}`}

    {showDescription ?
    : null}
  • ); };