Showing AI reviews for website
Project AI Score ?
71%
Quality Avg ?
72%
Security Avg ?
74%
Reviews ?
123

Review Result ?

solutionbowl/website · 0948238e
This commit introduces a jersey horse icon with associated color theming for empty jersey states in HorseRow component, improving UI/UX. It also includes race event fetching logic with proper cancellation and visibility change handling in HorseRacing page, enhancing data freshness and user interaction. The changes are well isolated and use proper React hooks and state management.
Quality ?
85%
Security ?
80%
Business Value ?
80%
Maintainability ?
88%
Issues & Suggested Fixes ?
1AI detects the issue
2Shows file, line, or evidence
3Suggests the fix to apply
Hardcoded Colors
Where src/components/racing/HorseRow.tsx:48-54
Issue / Evidence Hardcoded colors
Suggested Fix consider moving color definitions to a centralized constants or theme file to improve maintainability and consistency.
Inline Styling With Rgba And Bordercolor
Where src/components/racing/HorseRow.tsx:609-627
Issue / Evidence Inline styling with rgba and borderColor
Suggested Fix consider extracting styles to CSS modules or styled-components to improve readability and maintainability.
Async Fetch With Cancellation Id
Where src/pages/HorseRacing.tsx:31-47
Issue / Evidence Async fetch with cancellation id
Suggested Fix add error handling to the fetchRaceEvents function to improve robustness and user feedback on failures.
Visibility Event Listener
Where src/pages/HorseRacing.tsx:60-70
Issue / Evidence Visibility event listener
Suggested Fix add throttling or debouncing to prevent excessive calls if visibility toggles quickly.
Vague Description
Where commit message
Issue / Evidence vague description
Suggested Fix update the commit message to more specifically describe the changes made (e.g., "Add jersey horse icon and color theming; implement race events fetching with visibility change support") to improve clarity.
Code Change Preview · src/components/racing/HorseRow.tsx ?
Removed / Before Commit
- diff --git a/src/components/racing/HorseRow.tsx b/src/components/racing/HorseRow.tsx
- index 53e13b4..a1a86c7 100644
- "w-full h-[44px] text-white px-[8px] rounded-[6px] text-[11px] font-semibold transition-colors flex flex-col justify-center overflow-hidden active:scale-95"
- const ODDS_VALUE_CLASS = "h-[14px] leading-[14px] font-bold truncate"
- const ODDS_VOLUME_CLASS = "h-[12px] leading-[12px] text-[9px] opacity-80 truncate"
- const isSelectableOddsValue = (odds: number | null | undefined, isFancyMarket: boolean) => {
- if (odds === null || odds === undefined || !Number.isFinite(odds) || odds <= 0) {
- return false
- 
- const projectedExp = calculateProjectedValue(baseExposure)
- 
- 
- let projectedExpProfit = baseExposureProfit
- 
- const [jerseyImageFailed, setJerseyImageFailed] = useState(false)
- const shouldShowJerseyImage = Boolean(jerseyImageUrl && !jerseyImageFailed)
- const shouldRenderJerseySlot = shouldShowJerseyImage || isJerseyFallbackMarket
- 
Added / After Commit
+ diff --git a/src/components/racing/HorseRow.tsx b/src/components/racing/HorseRow.tsx
+ index 53e13b4..a1a86c7 100644
+ "w-full h-[44px] text-white px-[8px] rounded-[6px] text-[11px] font-semibold transition-colors flex flex-col justify-center overflow-hidden active:scale-95"
+ const ODDS_VALUE_CLASS = "h-[14px] leading-[14px] font-bold truncate"
+ const ODDS_VOLUME_CLASS = "h-[12px] leading-[12px] text-[9px] opacity-80 truncate"
+ const EMPTY_JERSEY_COLORS = [
+   { border: "#16a34a", background: "rgba(22, 163, 74, 0.12)" },
+   { border: "#db2777", background: "rgba(219, 39, 119, 0.12)" },
+   { border: "#2563eb", background: "rgba(37, 99, 235, 0.12)" },
+   { border: "#ca8a04", background: "rgba(202, 138, 4, 0.12)" },
+   { border: "#7c3aed", background: "rgba(124, 58, 237, 0.12)" },
+   { border: "#0891b2", background: "rgba(8, 145, 178, 0.12)" },
+ ]
+ 
+ const isSelectableOddsValue = (odds: number | null | undefined, isFancyMarket: boolean) => {
+ if (odds === null || odds === undefined || !Number.isFinite(odds) || odds <= 0) {
+ return false
+ 
Removed / Before Commit
- diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx
- index 39d2190..cd18f8c 100644
- 
- // All eventIds for socket join
- const allEventIds = useMemo(() => matches.map(m => m.eventId), [matches.length]);
- 
- const handleSocketUpdate = useCallback((socketData: any) => {
- const updatedEventId = String(socketData?.eventId);
Added / After Commit
+ diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx
+ index 39d2190..cd18f8c 100644
+ 
+ // All eventIds for socket join
+ const allEventIds = useMemo(() => matches.map(m => m.eventId), [matches.length]);
+   
+ 
+ const handleSocketUpdate = useCallback((socketData: any) => {
+ const updatedEventId = String(socketData?.eventId);
Removed / Before Commit
- diff --git a/src/pages/HorseRacing.tsx b/src/pages/HorseRacing.tsx
- index 6d6887b..7e93e19 100644
- import { useEffect, useState } from "react"
- import { getRaceEvents, getCountries } from "../services/racing"
- import type { Country, RaceEvent, Race } from "../types/racing"
- import BannerCarousel from "../components/banner/BannerCarousel"
- const [raceEvents, setRaceEvents] = useState<RaceEvent[]>([])
- const [loading, setLoading] = useState(true)
- const [watchLiveRaceId, setWatchLiveRaceId] = useState<string | null>(null)
- const selectedCountry = countries.find((country) => country._id === activeCountry) ?? null
- 
- useEffect(() => {
- loadCountries()
- }, [])
- 
- useEffect(() => {
-   if (!activeCountry) return
- 
Added / After Commit
+ diff --git a/src/pages/HorseRacing.tsx b/src/pages/HorseRacing.tsx
+ index 6d6887b..7e93e19 100644
+ import { useCallback, useEffect, useRef, useState } from "react"
+ import { getRaceEvents, getCountries } from "../services/racing"
+ import type { Country, RaceEvent, Race } from "../types/racing"
+ import BannerCarousel from "../components/banner/BannerCarousel"
+ const [raceEvents, setRaceEvents] = useState<RaceEvent[]>([])
+ const [loading, setLoading] = useState(true)
+ const [watchLiveRaceId, setWatchLiveRaceId] = useState<string | null>(null)
+   const raceEventsRequestIdRef = useRef(0)
+ const selectedCountry = countries.find((country) => country._id === activeCountry) ?? null
+ 
+ useEffect(() => {
+ loadCountries()
+ }, [])
+ 
+   const fetchRaceEvents = useCallback(async (countryId: string) => {
+     const requestId = raceEventsRequestIdRef.current + 1
Removed / Before Commit
- diff --git a/src/services/racing.ts b/src/services/racing.ts
- index e929594..bc433bd 100644
- 
- const raceEventsCache = new Map<string, RaceEvent[]>()
- 
- export const getRaceEvents = async (countryId: string): Promise<RaceEvent[]> => {
- console.log(">>> getRaceEvents API", countryId)
- 
- // 🔥 CACHE HIT
- const cached = raceEventsCache.get(countryId)
-   if (cached) {
- console.log("⚡ Returning cached race events for", countryId)
- return cached
- }
Added / After Commit
+ diff --git a/src/services/racing.ts b/src/services/racing.ts
+ index e929594..bc433bd 100644
+ 
+ const raceEventsCache = new Map<string, RaceEvent[]>()
+ 
+ export const getRaceEvents = async (
+   countryId: string,
+   options: { forceRefresh?: boolean } = {}
+ ): Promise<RaceEvent[]> => {
+ console.log(">>> getRaceEvents API", countryId)
+ 
+ // 🔥 CACHE HIT
+ const cached = raceEventsCache.get(countryId)
+   if (cached && !options.forceRefresh) {
+ console.log("⚡ Returning cached race events for", countryId)
+ return cached
+ }