Showing AI reviews for website
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 {