@eureca/eureca-ui
Version:
UI component library of Eureca's user and admin apps
230 lines (206 loc) • 6.19 kB
JavaScript
import React from 'react';
import PropTypes from 'prop-types';
import { format } from 'date-fns';
import { Typography, Box, useTheme } from '@material-ui/core';
import { IconContext } from 'react-icons';
import { FaCheckCircle, FaRegCheckCircle } from 'react-icons/fa';
import { FiFile, FiChevronRight } from 'react-icons/fi';
import { Flex } from '../Flex';
import { colors } from '../../theme/colors';
const chooseCircle = {
incomplete: <FaRegCheckCircle />,
complete: <FaCheckCircle />,
};
const iconStyle = {
incomplete: {
color: colors.gray3,
fontSize: '1.125rem',
},
complete: {
color: colors.green1,
fontSize: '1.125rem',
},
chevron: {
fontSize: '.75rem',
},
};
const StepperHeader = ({ status, title, score, onClickTrack }) => {
const muiTheme = useTheme();
return (
<Flex directionRow alignCenter justifySpaceBetween>
<Flex directionRow alignCenter>
<IconContext.Provider value={{ style: iconStyle[status] }}>
{chooseCircle[status]}
</IconContext.Provider>
<Box ml={1.5}>
<Typography variant="subtitle2">{title}</Typography>
</Box>
</Flex>
{status === 'complete' ? (
<Typography variant="body2">{score ? 'Pontuado' : 'Não pontuado'}</Typography>
) : (
<Flex
alignCenter
justifyCenter
cursorPointer
width={muiTheme.spacing(3)}
height={muiTheme.spacing(3)}
onClick={onClickTrack}
>
<FiChevronRight size="1rem" />
</Flex>
)}
</Flex>
);
};
StepperHeader.propTypes = {
status: PropTypes.string.isRequired,
title: PropTypes.string.isRequired,
score: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,
};
const StepperScore = ({ type, score, maxScore, companyName }) => {
return (
<Flex directionRow alignCenter data-testid="stepper-score-testid">
<Box mr={0.5}>
<Typography variant="h5">{score}</Typography>
</Box>
{type === 'fit' ? (
<Typography variant="subtitle2">{` de compatibilidade com a cultura da ${companyName}`}</Typography>
) : (
<Typography variant="h5" style={{ color: colors.gray3, fontWeight: 400 }}>
{` / ${maxScore}`}
</Typography>
)}
</Flex>
);
};
StepperScore.propTypes = {
type: PropTypes.string.isRequired,
score: PropTypes.string.isRequired,
maxScore: PropTypes.string.isRequired,
companyName: PropTypes.string.isRequired,
};
const textStyle = muiTheme => ({
fontSize: '0.715rem',
fontWeight: muiTheme.typography.fontWeightLight,
lineHeight: '1.285rem',
minWidth: muiTheme.spacing(11),
color: colors.green1,
textAlign: 'center',
});
const ChallengeSent = ({ date, onClick }) => {
const muiTheme = useTheme();
const theme = textStyle(muiTheme);
return (
<Flex alignCenter justifyCenter>
<Flex
justifyCenter
alignCenter
width={muiTheme.spacing(4)}
height={muiTheme.spacing(4)}
borderRadius="50%"
bgcolor={colors.green1}
onClick={onClick}
>
<FiFile size="1rem" color={colors.white} />
</Flex>
<Typography style={theme}>Desafio enviado</Typography>
<Typography style={theme}>{date && format(date, 'dd/MM/yyyy')}</Typography>
</Flex>
);
};
const StepperContent = ({ type, content }) => {
const categoryContent = {
initial: <div style={{ width: '100%' }} />,
fit: <Typography variant="body2">{content}</Typography>,
pdf: <Typography variant="body2">{content}</Typography>,
audio: <Typography variant="body2">{content}</Typography>,
video: <Typography variant="body2">{content}</Typography>,
};
return (
<Flex directionRow justifySpaceBetween>
{categoryContent[type]}
</Flex>
);
};
StepperContent.propTypes = {
type: PropTypes.string.isRequired,
content: PropTypes.string.isRequired,
};
function TrackStepper({ tracks, companyName, onClickFile, onClickTrack }) {
const muiTheme = useTheme();
const handleClickModule = () => {
// history.push(Routes.Submission);
};
return (
<Flex>
{tracks.flatMap((track, index, array) => (
<Flex key={`${track.title}-key-${index}`} cursorPointer onClick={handleClickModule}>
<StepperHeader
status={track.status}
title={track.title}
score={track.score}
onClickTrack={() => onClickTrack(track.id)}
/>
<Flex
directionRow
left={muiTheme.spacing(1)}
position="relative"
style={{
borderLeft: index + 1 < array.length && `2px dotted ${colors.gray3}`,
}}
>
<Flex width={1}>
{track.content && (
<Flex ml={3} mt={3} directionRow justifySpaceBetween>
<Flex>
<Box mb={2}>
<StepperScore
type={track.type}
score={track.score}
maxScore={track.maxScore}
companyName={companyName}
/>
</Box>
<StepperContent type={track.type} content={track.content} />
</Flex>
<ChallengeSent date={track.date} onClick={() => onClickFile(track.id)} />
</Flex>
)}
<Box
id="divider"
my={3}
style={{
borderBottom: `1px solid ${colors.gray5}`,
}}
/>
</Flex>
</Flex>
</Flex>
))}
</Flex>
);
}
TrackStepper.propTypes = {
tracks: PropTypes.array.isRequired,
companyName: PropTypes.string.isRequired,
onClickFile: PropTypes.func,
onClickTrack: PropTypes.func,
};
TrackStepper.defaultProps = {
tracks: [
{
type: 'initial',
status: 'incomplete',
title: '',
date: null,
score: '',
maxScore: '',
content: '',
},
],
companyName: '',
onClickFile: () => {},
onClickTrack: () => {},
};
export { TrackStepper };