|
|
@@ -5,42 +5,90 @@ import Col from 'react-bootstrap/Col'; |
|
|
|
import Row from 'react-bootstrap/Row'; |
|
|
|
import JobCard from './JobCard'; |
|
|
|
import { partition } from '../utils'; |
|
|
|
import { Jobs } from '@/PersonalDataTypes'; |
|
|
|
import { Job, Jobs } from '@/PersonalDataTypes'; |
|
|
|
import useSize from '../hooks/Size'; |
|
|
|
import { Accordion } from 'react-bootstrap'; |
|
|
|
|
|
|
|
export type Props = { |
|
|
|
type JobListProps = { |
|
|
|
jobs: Jobs, |
|
|
|
heading: string, |
|
|
|
entriesPerRow?: number, |
|
|
|
currentHeading?: string, |
|
|
|
} |
|
|
|
|
|
|
|
export type Props = { |
|
|
|
heading: string, |
|
|
|
} & JobListProps |
|
|
|
|
|
|
|
const defaultProps = { |
|
|
|
entriesPerRow: 2, |
|
|
|
currentHeading: 'Currently', |
|
|
|
} |
|
|
|
|
|
|
|
function FullList(props: JobListProps) { |
|
|
|
const {jobs} = props |
|
|
|
const config = {...defaultProps, ...props} |
|
|
|
return ( |
|
|
|
<Container> |
|
|
|
{jobs.current && ( |
|
|
|
<Row> |
|
|
|
<Col> |
|
|
|
<JobCard heading={config.currentHeading} {...jobs.current} /> |
|
|
|
</Col> |
|
|
|
</Row> |
|
|
|
)} |
|
|
|
{partition(jobs.previous, config.entriesPerRow).map((jobs, index) => ( |
|
|
|
<Row key={index}> |
|
|
|
{(jobs.map((job, subindex) => ( |
|
|
|
<Col key={index + '_' + subindex}> |
|
|
|
<JobCard {...job} /> |
|
|
|
</Col> |
|
|
|
)))} |
|
|
|
</Row> |
|
|
|
))} |
|
|
|
</Container> |
|
|
|
) |
|
|
|
} |
|
|
|
|
|
|
|
function SmallList(props: JobListProps) { |
|
|
|
const {jobs} = props |
|
|
|
const config = {...defaultProps, ...props} |
|
|
|
function jobTitle(job: Job) { |
|
|
|
return `${job.position} at ${job.company}, ${job.timerange}` |
|
|
|
} |
|
|
|
return ( |
|
|
|
<Accordion defaultActiveKey={jobs.current ? 'current' : 'previous-0'} alwaysOpen> |
|
|
|
{jobs.current && ( |
|
|
|
<Accordion.Item eventKey="current"> |
|
|
|
<Accordion.Header>{config.currentHeading}:<br />{jobTitle(jobs.current)} </Accordion.Header> |
|
|
|
<Accordion.Body> |
|
|
|
{jobs.current.position} |
|
|
|
</Accordion.Body> |
|
|
|
</Accordion.Item> |
|
|
|
)} |
|
|
|
{jobs.previous?.map((job, index) => ( |
|
|
|
<Accordion.Item eventKey={`previous-${index}`} key={index}> |
|
|
|
<Accordion.Header>{jobTitle(job)}</Accordion.Header> |
|
|
|
<Accordion.Body> |
|
|
|
{job.description} |
|
|
|
</Accordion.Body> |
|
|
|
</Accordion.Item> |
|
|
|
))} |
|
|
|
</Accordion> |
|
|
|
) |
|
|
|
} |
|
|
|
|
|
|
|
export default function JobHistory(props: Props) { |
|
|
|
const jobs = props.jobs |
|
|
|
const config = {...defaultProps, ...props} |
|
|
|
return ( |
|
|
|
const {SizeWrapper, size} = useSize() |
|
|
|
const jobs = props.jobs |
|
|
|
|
|
|
|
const jobsList = size.width < 600 ? <SmallList {...props} /> : <FullList {...props} /> |
|
|
|
|
|
|
|
return ( |
|
|
|
<Container> |
|
|
|
<h2>{config.heading}</h2> |
|
|
|
{jobs.current && ( |
|
|
|
<Row> |
|
|
|
<Col> |
|
|
|
<JobCard heading={config.currentHeading} {...jobs.current} /> |
|
|
|
</Col> |
|
|
|
</Row> |
|
|
|
)} |
|
|
|
{partition(jobs.previous, config.entriesPerRow).map((jobs, index) => ( |
|
|
|
<Row key={index}> |
|
|
|
{(jobs.map((job, subindex) => ( |
|
|
|
<Col key={index + '_' + subindex}> |
|
|
|
<JobCard {...job} /> |
|
|
|
</Col> |
|
|
|
)))} |
|
|
|
</Row> |
|
|
|
))} |
|
|
|
<h2>{props.heading}</h2> |
|
|
|
<SizeWrapper> |
|
|
|
{jobsList} |
|
|
|
</SizeWrapper> |
|
|
|
</Container> |
|
|
|
) |
|
|
|
) |
|
|
|
} |