in hasher-matcher-actioner/webapp/src/components/ContentProgressStepper.tsx [165:276]
export default function ContentProgressStepper({
submittedAt,
hashedAt,
matchedAt,
actionEvaluatedAt,
actionPerformedAt,
}: ContentProgressStepperProps): JSX.Element {
const currentStage = getStageFromTimestamps(
hashedAt,
matchedAt,
actionEvaluatedAt,
actionPerformedAt,
);
return (
<Container className="progress-stepper">
<Row className="stage">
<StepperChannelSegment
position="first"
status={getStepperStatus(currentStage, StepperStages.Submitted)}
/>{' '}
<Col xs={11}>
<StageTitle>Submitted</StageTitle>
<div className="stage-description">
All content objects submitted are recorded in our database.
</div>
{submittedAt && (
<StageTimeView
stage={StepperStages.Submitted}
completedAt={submittedAt}
/>
)}
</Col>
</Row>
<Row className="stage">
<StepperChannelSegment
position="in-between"
status={getStepperStatus(currentStage, StepperStages.Hashed)}
/>{' '}
<Col xs={11}>
<StageTitle>Hashed</StageTitle>
<div className="stage-description">
These objects are then hashed into a variety of formats based on
your configuration and the content‘s type.
</div>
{hashedAt && (
<StageTimeView
stage={StepperStages.Hashed}
completedAt={hashedAt}
/>
)}
</Col>
</Row>
<Row className="stage">
<StepperChannelSegment
position="in-between"
status={getStepperStatus(currentStage, StepperStages.Matched)}
/>{' '}
<Col xs={11}>
<StageTitle>Matched</StageTitle>
<div className="stage-description">
The hashes are then matched against the datasets available from
threatexchange.
</div>
{matchedAt && (
<StageTimeView
stage={StepperStages.Matched}
completedAt={matchedAt}
/>
)}
</Col>
</Row>
<Row className="stage">
<StepperChannelSegment
position="in-between"
status={getStepperStatus(currentStage, StepperStages.ActionEvaluated)}
/>{' '}
<Col xs={11}>
<StageTitle>Needs Actioning</StageTitle>
<div className="stage-description">
Your Action Rules then determine whether to perform actions on these
matches.
</div>
{actionEvaluatedAt && (
<StageTimeView
stage={StepperStages.ActionEvaluated}
completedAt={actionEvaluatedAt}
/>
)}
</Col>
</Row>
<Row className="stage">
<StepperChannelSegment
position="last"
status={getStepperStatus(currentStage, StepperStages.ActionPerformed)}
/>{' '}
<Col xs={11}>
<StageTitle>Actioned</StageTitle>
<div className="stage-description">
The actions determined in the previous stage are then performed.
</div>
{actionPerformedAt && (
<StageTimeView
stage={StepperStages.ActionPerformed}
completedAt={actionPerformedAt}
/>
)}
</Col>
</Row>
</Container>
);
}