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 · ab3b1a1f
This commit adds functionality to handle bet start and end times, integrating checks to disable betting appropriately once the bet end time has passed. UI components reflect the bet closed state, and the bet end time is persisted in the store and synchronized with race data. The implementation improves UX and enforces business rules by restricting betting windows.
Quality
?
85%
Security
?
80%
Business Value
?
90%
Maintainability
?
83%
Issues & Suggested Fixes
?
1AI detects the issue
2Shows file, line, or evidence
3Suggests the fix to apply
Dependency List In Useeffect Includes Many...
Where
src/components/bets/DesktopBetSidebar.tsx:87
Issue / Evidence
Dependency list in useEffect includes many items, potential for unnecessary re-renders
Suggested Fix
reconsider dependencies to optimize performance and prevent possible bugs
Toast Error Message For Closed Bet Trigger...
Where
src/components/bets/BetSlipDrawer.tsx:90
Issue / Evidence
Toast error message for closed bet triggers but no accessibility notification
Suggested Fix
add ARIA live region to announce bet closed status for screen reader users
Commit Message Is Vague And Short
Where
commit message
Issue / Evidence
commit message is vague and short
Suggested Fix
provide more descriptive message explaining why bet start and end time was added and how it impacts the application
Duplicate Logic
Where
src/pages/HorseRacingDetails.tsx:380
Issue / Evidence
betStart and betEnd timestamp conversions repeated
Suggested Fix
abstract into a helper function to reduce duplication and potential inconsistencies
Inline Style Usage For Disabled Button Bac...
Where
src/components/bets/BetSlipDrawer.tsx:232
Issue / Evidence
Inline style usage for disabled button background color
Suggested Fix
consider moving styles to CSS classes for better maintainability and theming
Code Change Preview · src/components/bets/BetSlipDrawer.tsx
?
Removed / Before Commit
- diff --git a/src/components/bets/BetSlipDrawer.tsx b/src/components/bets/BetSlipDrawer.tsx - index a4a98c3..827e1aa 100644 - - const BetSlipDrawer = memo(() => { - const colors = useThemeColors(); - const { bets, isDrawerOpen, setDrawerOpen, clearAllBets, setPlacingBet, isPlacingBet } = useBetStore(); - const betCount = useBetCount(); - const totalStake = useTotalStake(); - const potentialWinnings = usePotentialWinnings(); - const [showOddsSettings, setShowOddsSettings] = useState(false); - const [globalAcceptAnyOdds, setGlobalAcceptAnyOdds] = useState(false); - - // Draggable state (desktop only) - const drawerRef = useRef<HTMLDivElement>(null); - const isDragging = useRef(false); - setError(''); - setSuccess(''); -
Added / After Commit
+ diff --git a/src/components/bets/BetSlipDrawer.tsx b/src/components/bets/BetSlipDrawer.tsx + index a4a98c3..827e1aa 100644 + + const BetSlipDrawer = memo(() => { + const colors = useThemeColors(); + const { bets, isDrawerOpen, setDrawerOpen, clearAllBets, setPlacingBet, isPlacingBet, betEndTime } = useBetStore(); + const betCount = useBetCount(); + const totalStake = useTotalStake(); + const potentialWinnings = usePotentialWinnings(); + const [showOddsSettings, setShowOddsSettings] = useState(false); + const [globalAcceptAnyOdds, setGlobalAcceptAnyOdds] = useState(false); + + const isBettingClosed = betEndTime !== null && Date.now() > betEndTime; + + // Draggable state (desktop only) + const drawerRef = useRef<HTMLDivElement>(null); + const isDragging = useRef(false); + setError('');
Removed / Before Commit
- diff --git a/src/components/bets/DesktopBetSidebar.tsx b/src/components/bets/DesktopBetSidebar.tsx - index b579d86..fd99a49 100644 - heightOffset = 66, - }: DesktopBetSidebarProps) => { - const colors = useThemeColors(); - const { bets, clearAllBets, setPlacingBet, isPlacingBet } = useBetStore(); - const betCount = useBetCount(); - const totalStake = useTotalStake(); - const potentialWinnings = usePotentialWinnings(); - const { isAuthenticated, refreshUser } = useAuth(); - const [acceptAnyOdds, setAcceptAnyOdds] = useState(false); - - const betKeys = Object.keys(bets); - const latestBetKey = betKeys.length > 0 ? betKeys[betKeys.length - 1] : null; - const latestBet = latestBetKey ? bets[latestBetKey] : null; - return; - } -
Added / After Commit
+ diff --git a/src/components/bets/DesktopBetSidebar.tsx b/src/components/bets/DesktopBetSidebar.tsx + index b579d86..fd99a49 100644 + heightOffset = 66, + }: DesktopBetSidebarProps) => { + const colors = useThemeColors(); + const { bets, clearAllBets, setPlacingBet, isPlacingBet, betEndTime } = useBetStore(); + const betCount = useBetCount(); + const totalStake = useTotalStake(); + const potentialWinnings = usePotentialWinnings(); + const { isAuthenticated, refreshUser } = useAuth(); + const [acceptAnyOdds, setAcceptAnyOdds] = useState(false); + + const isBettingClosed = betEndTime !== null && Date.now() > betEndTime; + + const betKeys = Object.keys(bets); + const latestBetKey = betKeys.length > 0 ? betKeys[betKeys.length - 1] : null; + const latestBet = latestBetKey ? bets[latestBetKey] : null; + return;
Removed / Before Commit
- diff --git a/src/pages/HorseRacingDetails.tsx b/src/pages/HorseRacingDetails.tsx - index 1a7a731..b634173 100644 - - - - const DEFAULT_BET_START_BEFORE_IN_MIN = 5 - const DEFAULT_FANCY_TYPE = "DEFAULT" - const STANDALONE_FANCY_TYPES = new Set(["OBJECTION", "ODDS & EVENS", "PHOTO"]) - const MARKET_TYPE_DISPLAY_ORDER = [ - return settle === true || String(settle).trim().toLowerCase() === "true" - } - - const getBetStartBeforeInMin = (value: Race["betStartBeforeInMin"]) => { - if (value === null || value === undefined || value === "") { - return DEFAULT_BET_START_BEFORE_IN_MIN - } - - const minutes = Number(value)
Added / After Commit
+ diff --git a/src/pages/HorseRacingDetails.tsx b/src/pages/HorseRacingDetails.tsx + index 1a7a731..b634173 100644 + + + + const DEFAULT_FANCY_TYPE = "DEFAULT" + const STANDALONE_FANCY_TYPES = new Set(["OBJECTION", "ODDS & EVENS", "PHOTO"]) + const MARKET_TYPE_DISPLAY_ORDER = [ + return settle === true || String(settle).trim().toLowerCase() === "true" + } + + const filterMarketsBySettleFlags = (marketsData: Market[], raceData: Race | null) => { + if (!raceData) return marketsData + + const [error, setError] = useState<string | null>(null) + const [currentTime, setCurrentTime] = useState(() => Date.now()) + const clearAllBets = useBetStore((state) => state.clearAllBets) + const setBetEndTime = useBetStore((state) => state.setBetEndTime)
Removed / Before Commit
- diff --git a/src/store/useBetStore.ts b/src/store/useBetStore.ts - index 4a86e45..4a95b0e 100644 - bets: Record<string, RacingBet>; - isDrawerOpen: boolean; - isPlacingBet: boolean; - } - - interface BetActions { - clearAllBets: () => void; - setDrawerOpen: (isOpen: boolean) => void; - setPlacingBet: (isPlacing: boolean) => void; - getBetCount: () => number; - getTotalStake: () => number; - getPotentialWinnings: () => number; - bets: {}, - isDrawerOpen: false, - isPlacingBet: false, -
Added / After Commit
+ diff --git a/src/store/useBetStore.ts b/src/store/useBetStore.ts + index 4a86e45..4a95b0e 100644 + bets: Record<string, RacingBet>; + isDrawerOpen: boolean; + isPlacingBet: boolean; + betEndTime: number | null; // ms timestamp, null = no restriction + } + + interface BetActions { + clearAllBets: () => void; + setDrawerOpen: (isOpen: boolean) => void; + setPlacingBet: (isPlacing: boolean) => void; + setBetEndTime: (time: number | null) => void; + getBetCount: () => number; + getTotalStake: () => number; + getPotentialWinnings: () => number; + bets: {}, + isDrawerOpen: false,
Removed / Before Commit
- diff --git a/src/types/racing.ts b/src/types/racing.ts - index 44fed37..22c8db6 100644 - winnerSettle?: boolean - fancySettle?: boolean - insurance_bet?: boolean - } - - export interface RaceEvent {
Added / After Commit
+ diff --git a/src/types/racing.ts b/src/types/racing.ts + index 44fed37..22c8db6 100644 + winnerSettle?: boolean + fancySettle?: boolean + insurance_bet?: boolean + bet_start_time?: string | null + bet_end_time?: string | null + } + + export interface RaceEvent {