diff --git a/apps/web/app/routes/ws/deployments/_components/environmentversiondecisions/rule-results/EnvironmentProgressionDetail.tsx b/apps/web/app/routes/ws/deployments/_components/environmentversiondecisions/rule-results/EnvironmentProgressionDetail.tsx index e0b167c4f..9feff5fdf 100644 --- a/apps/web/app/routes/ws/deployments/_components/environmentversiondecisions/rule-results/EnvironmentProgressionDetail.tsx +++ b/apps/web/app/routes/ws/deployments/_components/environmentversiondecisions/rule-results/EnvironmentProgressionDetail.tsx @@ -41,6 +41,15 @@ type ProgressionDetails = { failed_environments?: number; }; +function safeFormatDistanceToNowStrict( + value: Date | string | null | undefined, +) { + if (value == null) return null; + const date = value instanceof Date ? value : new Date(value); + if (isNaN(date.getTime())) return null; + return formatDistanceToNowStrict(date); +} + function extractEnvDetails(details: Record): PerEnvDetail[] { const envDetails: PerEnvDetail[] = []; for (const [key, value] of Object.entries(details)) { @@ -127,6 +136,35 @@ function SoakTimeStatus({ detail }: { detail: PerEnvDetail }) { ); } +function LastSuccessLine({ + mostRecentSuccess, +}: { + mostRecentSuccess?: string; +}) { + const formatted = safeFormatDistanceToNowStrict(mostRecentSuccess); + if (formatted == null) return null; + return ( +
+ + Last success: {formatted} ago +
+ ); +} + +function NextEvaluationLine({ + nextEvaluationAt, +}: { + nextEvaluationAt: Date | null; +}) { + const formatted = safeFormatDistanceToNowStrict(nextEvaluationAt); + if (formatted == null) return null; + return ( + + re-check in {formatted} + + ); +} + function EnvironmentCard({ detail }: { detail: PerEnvDetail }) { const minRequired = detail.minimum_success_percentage ?? 100; const passRatePassed = @@ -167,16 +205,7 @@ function EnvironmentCard({ detail }: { detail: PerEnvDetail }) { )} - {detail.most_recent_success && ( -
- - - Last success:{" "} - {formatDistanceToNowStrict(new Date(detail.most_recent_success))}{" "} - ago - -
- )} + ); } @@ -292,12 +321,7 @@ function ProgressionRow({ allPassed={allPassed} isPending={isPending} /> - {!allPassed && rule.nextEvaluationAt != null && ( - - re-check in{" "} - {formatDistanceToNowStrict(new Date(rule.nextEvaluationAt))} - - )} + {!allPassed && }