AI Review Center
Commit Review Workspace ?
Select a commit on the left to inspect quality, security, business value, findings, and suggested code changes.
Project AI Score
?
71%
Quality Avg
?
72%
Security Avg
?
74%
Reviews
?
123
Review Result ?
solutionbowl/website · 7e126130
The commit introduces a feature to handle 'dead heat' conditions in the racing betting components by conditionally filtering runners and visually distinguishing 'dead heat' runner rows. The main logic is clean with consistent use of optional chaining and logical operators. However, the commit message is poorly written and does not adequately describe the work. The filtering code repeats in two components, suggesting a potential for DRY improvements.
Quality
?
80%
Security
?
90%
Business Value
?
75%
Maintainability
?
73%
Issues & Suggested Fixes
?
1AI detects the issue
2Shows file, line, or evidence
3Suggests the fix to apply
Poor Clarity And Spelling
Where
commit message
Issue / Evidence
poor clarity and spelling
Suggested Fix
improve commit message to clearly describe the changes made, their purpose, and any behavior impact
Duplicate Logic
Where
src/components/racing/BettingPanel.tsx:582-583
Issue / Evidence
duplicated market property checks with similar logic in MarketCard.tsx
Suggested Fix
abstract dead heat detection logic into a shared utility function
Duplicate Logic
Where
src/components/racing/MarketCard.tsx:397-398
Issue / Evidence
duplicated market property checks
Suggested Fix
same as above, use shared helper
Long Function
Where
src/components/racing/HorseRow.tsx:104-109
Issue / Evidence
improve readability by breaking down complex ternary expressions into clearer conditional statements or helper variables
Suggested Fix
Review and simplify this section.
Long Function
Where
src/components/racing/HorseRow.tsx:414-415
Issue / Evidence
use CSS classes consistently and avoid inline complex classnames if possible to improve maintainability
Suggested Fix
Review and simplify this section.
Missing Jsdoc Comments
Where
src/types/raceMarkets.ts:44-45
Issue / Evidence
missing JSDoc comments
Suggested Fix
add comments explaining new optional properties added
Code Change Preview · src/components/racing/BettingPanel.tsx
?
Removed / Before Commit
- diff --git a/src/components/racing/BettingPanel.tsx b/src/components/racing/BettingPanel.tsx - index 72436f1..6a73aee 100644 - </div> - - {filteredRunners && filteredRunners.length > 0 ? ( - filteredRunners.map((runner, index) => { - const runnerId = getRunnerId(runner, index) - const blockBetKey = getBlockBetKey( - runnerId, - activeMarket - ) - - return ( - <HorseRow - key={ - runner.runner?.runnerId || - runner.runnerId || - index
Added / After Commit
+ diff --git a/src/components/racing/BettingPanel.tsx b/src/components/racing/BettingPanel.tsx + index 72436f1..6a73aee 100644 + </div> + + {filteredRunners && filteredRunners.length > 0 ? ( + (() => { + const isPhotoFancyMarket = + (selectedMarket?.fancy_type || selectedMarket?.fancyType)?.trim().toLowerCase() === 'photo' || + selectedMarket?.marketType?.trim().toUpperCase() === 'PHOTO OF' + const deadHeatActive = isPhotoFancyMarket && selectedMarket?.dead_heat === true + + // If dead_heat is false, filter out the runner whose name is "Dead Heat" + const visibleRunners = isPhotoFancyMarket && !deadHeatActive + ? filteredRunners.filter(r => (r.runner?.name || r.name || '').trim().toLowerCase() !== 'dead heat') + : filteredRunners + + return visibleRunners.map((runner, index) => { + const runnerId = getRunnerId(runner, index)
Removed / Before Commit
- diff --git a/src/components/racing/HorseRow.tsx b/src/components/racing/HorseRow.tsx - index 54d199d..7bbeff0 100644 - blockBetStake?: string - onBlockBetToggle?: () => void - onBlockBetStakeChange?: (value: string) => void - } - - const BACK_ODDS_BUTTON_CLASS = "bg-[#4a90c4] hover:bg-[#3d7aa8]" - blockBetChecked = false, - blockBetStake = "", - onBlockBetToggle, - onBlockBetStakeChange - }: HorseRowProps) => { - - const { isAuthenticated } = useAuth() - const isFancyMarket = - !isPhotoFancyMarket && (marketNameLower.includes('fancy') || normalizedMarketType === 'FANCY') - const isWinStyleMarket = isWinnerMarket || isFancyMarket || isPhotoMarket
Added / After Commit
+ diff --git a/src/components/racing/HorseRow.tsx b/src/components/racing/HorseRow.tsx + index 54d199d..7bbeff0 100644 + blockBetStake?: string + onBlockBetToggle?: () => void + onBlockBetStakeChange?: (value: string) => void + /** When true, this row is the Dead Heat entry — hides horse number, gate, jockey, trainer */ + isDeadHeatRow?: boolean + } + + const BACK_ODDS_BUTTON_CLASS = "bg-[#4a90c4] hover:bg-[#3d7aa8]" + blockBetChecked = false, + blockBetStake = "", + onBlockBetToggle, + onBlockBetStakeChange, + isDeadHeatRow = false, + }: HorseRowProps) => { + + const { isAuthenticated } = useAuth()
Removed / Before Commit
- diff --git a/src/components/racing/MarketCard.tsx b/src/components/racing/MarketCard.tsx - index c95c068..c41e7d2 100644 - </div> - - {market.odds.length > 0 ? ( - market.odds.map((runner, index) => { - const runnerId = getRunnerId(runner, index) - const blockBetKey = getBlockBetKey(runnerId, market.marketId) - - return ( - <HorseRow - key={runner.runner?.runnerId || runner.runnerId || index} - runner={runner} - index={index} - raceId={raceId} - marketId={market.marketId} - raceType={raceType} - marketType={market.marketType}
Added / After Commit
+ diff --git a/src/components/racing/MarketCard.tsx b/src/components/racing/MarketCard.tsx + index c95c068..c41e7d2 100644 + </div> + + {market.odds.length > 0 ? ( + (() => { + const isPhotoFancyMarket = + (market.fancy_type || market.fancyType)?.trim().toLowerCase() === 'photo' || + market.marketType?.trim().toUpperCase() === 'PHOTO OF' + const deadHeatActive = isPhotoFancyMarket && market.dead_heat === true + + // If dead_heat is false, filter out the runner whose name is "Dead Heat" + const visibleOdds = isPhotoFancyMarket && !deadHeatActive + ? market.odds.filter(r => (r.runner?.name || r.name || '').trim().toLowerCase() !== 'dead heat') + : market.odds + + return visibleOdds.map((runner, index) => { + const runnerId = getRunnerId(runner, index)
Removed / Before Commit
- diff --git a/src/types/raceMarkets.ts b/src/types/raceMarkets.ts - index a22b63f..09c5a39 100644 - odds: RunnerOdds[], - marketOddsType: string - settle?: boolean | string - }
Added / After Commit
+ diff --git a/src/types/raceMarkets.ts b/src/types/raceMarkets.ts + index a22b63f..09c5a39 100644 + odds: RunnerOdds[], + marketOddsType: string + settle?: boolean | string + is_active?: boolean + dead_heat?: boolean + }