import React, { CSSProperties, HTMLAttributes } from 'react';
import styled from 'styled-components';
import { colors, typography } from '../../../constants';
import { Colors } from '../../../constants/colors';
import Text from '../../atoms/Text/Text';
import { useThemeContext } from '../../styles/Theme';
import HiddenText from '../../atoms/HiddenText/HiddenText';
export interface ProgressionStyleProps {
/**
* Progress bar colour
* @default `colors.brand`
*/
progressColor?: Colors | string;
}
export interface ProgressProps extends ProgressionStyleProps, HTMLAttributes {
totalSteps: number;
currentStep: number;
style?: CSSProperties;
withStep?: boolean;
}
export interface ProgressionProps extends ProgressionStyleProps {
position?: number;
}
export interface ProgressPointProps extends ProgressionStyleProps, ProgressionProps {
completed: boolean;
}
const PROGRESS_POINT_RADIUS = 6;
const ProgressWrapper = styled.div`
margin-left: ${PROGRESS_POINT_RADIUS}px;
margin-right: ${PROGRESS_POINT_RADIUS}px;
`;
const ProgressBar = styled.div`
position: relative;
width: 100%;
border-radius: 100px;
background: ${colors.greyLighter};
height: 4px;
`;
const Progression = styled.div`
width: ${({ position }) => `${position}%`};
position: relative;
border-radius: 100px;
height: 4px;
display: block;
background: ${({ progressColor, theme }) => (progressColor ? progressColor : theme.progressBar.color)};
transition: width 0.5s ease-in-out;
> span {
position: absolute;
top: 10px;
right: 0;
font-size: ${typography.sizes.text.small};
line-height: 16px;
font-weight: 600;
color: ${colors.greyDarkest};
}
`;
const ProgressPoint = styled.span`
position: absolute;
top: 50%;
left: ${({ position }) => `${position}%`};
display: block;
width: ${PROGRESS_POINT_RADIUS * 2}px;
height: ${PROGRESS_POINT_RADIUS * 2}px;
background: ${({ completed, progressColor, theme }) =>
completed ? (progressColor ? progressColor : theme.progressBar.color) : colors.greyLighter};
border-radius: 100%;
transform: translate(-50%, -50%);
`;
const getStepPosition = (steps: number, stepIndex: number) => {
const position = (100 / (steps - 1)) * stepIndex;
if (position < 0) {
return 0;
}
if (position > 100) {
return 100;
}
return position;
};
const Progress = ({ totalSteps, currentStep, withStep = false, progressColor, ...rest }: ProgressProps) => {
const theme = useThemeContext();
const renderPoints = () => {
return [...Array(totalSteps).keys()].map((stepPoint) => {
return (
);
});
};
return (
In progress
{renderPoints()}
{withStep && (
Step {currentStep} of {totalSteps}
)}
);
};
export default Progress;