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 · 8bb4fedc
The commit introduces conditional rendering updates for photo fancy markets involving dead_heat logic, filtering out 'Dead Heat' runners appropriately. Type definitions and UI components handle the new deadHeat flag and market active status, improving market display logic. The implementation appears consistent and well-scoped but lacks comments and testing evidence. The commit message is brief and vague.
Quality
?
85%
Security
?
80%
Business Value
?
75%
Maintainability
?
85%
Issues & Suggested Fixes
?
1AI detects the issue
2Shows file, line, or evidence
3Suggests the fix to apply
Issue
Where
commit message
Issue / Evidence
issue
Suggested Fix
improve commit message to describe purpose and impact of changes for better tracking
Inconsistent Optional Chaining And Propert...
Where
src/components/racing/BettingPanel.tsx:582
Issue / Evidence
inconsistent optional chaining and property casing (fancy_type vs fancyType)
Suggested Fix
standardize property access to reduce bugs
Filtering String Constants Like 'Dead Heat...
Where
src/components/racing/BettingPanel.tsx:588
Issue / Evidence
filtering string constants like 'dead heat'
Suggested Fix
extract to a constant to avoid typos and facilitate reuse
Duplicate Logic
Where
src/components/racing/HorseRow.tsx:104
Issue / Evidence
complex boolean expressions repeated for isDeadHeatRow and market type detection
Suggested Fix
add comments explaining conditions for maintainability
Explicit Style Strings
Where
src/components/racing/HorseRow.tsx:414
Issue / Evidence
explicit style strings
Suggested Fix
consider extracting style classes into constants or CSS modules for clarity and consistency
Property Casing And Checks For Fancy Type...
Where
src/components/racing/MarketCard.tsx:397
Issue / Evidence
property casing and checks for fancy_type and fancyType
Suggested Fix
unify these checks to avoid mismatch bugs
Check For Is Active Flag
Where
src/pages/HorseRacingDetails.tsx:103
Issue / Evidence
check for is_active flag
Suggested Fix
add explicit comment or unit test to confirm behavior under different market active states
Optional Is Active And Dead Heat Props Add...
Where
src/types/raceMarkets.ts:44
Issue / Evidence
optional is_active and dead_heat props added to types
Suggested Fix
ensure code consuming these handles undefined appropriately and add type documentation
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..d5a38cb 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..d5a38cb 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..d74b091 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..d74b091 100644 + blockBetStake?: string + onBlockBetToggle?: () => void + onBlockBetStakeChange?: (value: string) => void + /** When true, renders this row as a 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/pages/HorseRacingDetails.tsx b/src/pages/HorseRacingDetails.tsx - index 1a7a731..dc80810 100644 - return marketsData.filter(market => { - const marketNameLower = (market.marketName || "").toLowerCase() - - if (isMarketSettled(market.settle)) { - return false - }
Added / After Commit
+ diff --git a/src/pages/HorseRacingDetails.tsx b/src/pages/HorseRacingDetails.tsx + index 1a7a731..dc80810 100644 + return marketsData.filter(market => { + const marketNameLower = (market.marketName || "").toLowerCase() + + // Hide market if is_active is explicitly false + if (market.is_active === false) { + return false + } + + if (isMarketSettled(market.settle)) { + return false + }
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 + }