import { useTheme } from '@emotion/react'; import React, { useMemo } from 'react'; import type { LayoutChangeEvent, ViewProps } from 'react-native'; import { StyledSingleStep, StyledSingleStepContainer, StyledStep, StyledStepContainer, } from './StyledStep'; export interface ProgressStepProps extends ViewProps { /** * The total number of steps. */ steps: number; /** * The current step. */ current: number; /** * Test ID of the component. */ testID?: string; } type StepState = 'complete' | 'incomplete' | 'current'; export const getStepState = (current: number, index: number): StepState => { if (index < current) { return 'complete'; } if (index === current) { return 'current'; } return 'incomplete'; }; const ProgressStep = ({ steps, current, onLayout, ...props }: ProgressStepProps) => { const theme = useTheme(); const [containerWidth, setContainerWidth] = React.useState(0); const onContainerLayout = (event: LayoutChangeEvent) => { setContainerWidth(event.nativeEvent.layout.width); onLayout?.(event); }; // Calculate the width for each step const stepWidth = useMemo(() => { let width = 0; if (containerWidth > 0) { width = (containerWidth - (steps - 1) * theme.__hd__.progress.space.stepGap) / steps; } return width; }, [containerWidth, steps, theme]); if (steps === 1) { return ( = steps ? 'complete' : 'incomplete'} /> ); } return ( {Array.from({ length: steps }).map((_, index) => ( ))} ); }; export default ProgressStep;