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
?
72%
Quality Avg
?
77%
Security Avg
?
64%
Reviews
?
91
Review Result ?
solutionbowl/super-admin · 1b1a9e3b
The commit introduces multi-legs odds handling by adding totalLegs/totallegs fields and updating the logic to hide odds display for multi-leg bets. The code adds small utility functions and comments out existing lines. However, there is inconsistency in property naming (totalLegs vs totallegs), some commented-out code left in place, and unclear naming conventions impacting maintainability and potential for bugs. Business value is moderate as it supports multi-leg bets but lacks clear description and test coverage evidence. Security risk is low as no sensitive logic is changed.
Quality
?
65%
Security
?
90%
Business Value
?
55%
Maintainability
?
65%
Issues & Suggested Fixes
?
1AI detects the issue
2Shows file, line, or evidence
3Suggests the fix to apply
Inconsistent Casing Between 'Totallegs' An...
Where
src/routes/bet-ticket.tsx:74
Issue / Evidence
inconsistent casing between 'totalLegs' and 'totallegs'
Suggested Fix
unify property naming to avoid confusion and bugs
Inconsistent Casing Between 'Totallegs' An...
Where
src/routes/bet-ticket.tsx:75
Issue / Evidence
inconsistent casing between 'totalLegs' and 'totallegs'
Suggested Fix
unify property naming to avoid confusion and bugs
Commented Out Jsx Code Left In Place
Where
src/routes/bet-ticket.tsx:485
Issue / Evidence
commented-out JSX code left in place
Suggested Fix
remove unused code to improve readability and maintainability
Inconsistent Casing Between 'Totallegs' An...
Where
src/routes/net-exposure-bet.tsx:46
Issue / Evidence
inconsistent casing between 'totalLegs' and 'totallegs'
Suggested Fix
unify property naming to avoid confusion and bugs
Inconsistent Casing Between 'Totallegs' An...
Where
src/routes/net-exposure-bet.tsx:47
Issue / Evidence
inconsistent casing between 'totalLegs' and 'totallegs'
Suggested Fix
unify property naming to avoid confusion and bugs
The Bet Interface Has Both 'Totallegs' And...
Where
src/routes/net-exposure-detail.tsx:21
Issue / Evidence
the Bet interface has both 'totalLegs' and 'totallegs'
Suggested Fix
unify property naming for clarity
Commented Out Code Remains
Where
src/routes/net-exposure-detail.tsx:506
Issue / Evidence
commented-out code remains
Suggested Fix
remove to reduce clutter
Missing Test Coverage
Where
src/routes/user-details.$userId.tsx:969
Issue / Evidence
logic using getUserBetTotalLegs could be documented better or tested to ensure correctness
Suggested Fix
Review and simplify this section.
Lacks Detail And Context
Where
commit message
Issue / Evidence
lacks detail and context
Suggested Fix
improve message to clearly explain what multi-leg odds changes were made and why
Code Change Preview · src/routes/bet-ticket.tsx
?
Removed / Before Commit
- diff --git a/src/routes/bet-ticket.tsx b/src/routes/bet-ticket.tsx - index f6eadff..cb3010e 100644 - placedAt: string; - isMultiBet: boolean; - multiBetType: string | null; - totalLegs?: number; - legs?: Array<{ - legId?: string; - legNumber?: number; - </TableRow> - ) : ( - bets.map((bet) => { - const isMulti = bet.isMultiBet || (bet.totalLegs != null && bet.totalLegs > 1); - const isExpanded = expandedBetId === bet.betId; - - return ( - </div> - </TableCell>
Added / After Commit
+ diff --git a/src/routes/bet-ticket.tsx b/src/routes/bet-ticket.tsx + index f6eadff..cb3010e 100644 + placedAt: string; + isMultiBet: boolean; + multiBetType: string | null; + totalLegs?: number | string; + totallegs?: number | string; + legs?: Array<{ + legId?: string; + legNumber?: number; + </TableRow> + ) : ( + bets.map((bet) => { + const isMulti = getBetLegCount(bet) > 1; + const isExpanded = expandedBetId === bet.betId; + + return ( + </div>
Removed / Before Commit
- diff --git a/src/routes/net-exposure-bet.tsx b/src/routes/net-exposure-bet.tsx - index c2bc9b4..b130a69 100644 - lastUpdated: string; - isMultiBet?: boolean; - multiBetType?: string | null; - totalLegs?: number; - combinedOdds?: number; - legs?: BetLeg[]; - } - - {/* Odds req. */} - <td className="px-4 py-3 text-center tabular-nums"> - {bet.oddsRequested} - </td> - - {/* Odds matched */} - <td className="px-4 py-3 text-center tabular-nums"> - {bet.oddsMatched}
Added / After Commit
+ diff --git a/src/routes/net-exposure-bet.tsx b/src/routes/net-exposure-bet.tsx + index c2bc9b4..b130a69 100644 + lastUpdated: string; + isMultiBet?: boolean; + multiBetType?: string | null; + totalLegs?: number | string; + totallegs?: number | string; + combinedOdds?: number; + legs?: BetLeg[]; + } + + {/* Odds req. */} + <td className="px-4 py-3 text-center tabular-nums"> + {hasLegs ? "--" : formatOptionalNum(bet.oddsRequested)} + </td> + + {/* Odds matched */} + <td className="px-4 py-3 text-center tabular-nums">
Removed / Before Commit
- diff --git a/src/routes/net-exposure-detail.tsx b/src/routes/net-exposure-detail.tsx - index 8782b8a..d09428c 100644 - interface DetailRunner { runnerId: string; runnerName: string; exposure: number; exposureProfit: number; } - interface DetailMarket { marketId: string; marketName: string; totalStake: number; runners: DetailRunner[]; worstBook: number; bestBook: number; } - interface Race { raceId: string; raceName: string; raceNo: number; startTime: string; } - interface Bet { userId: string; username: string; betId: string; event: string; market: string; marketId: string; selection: string; runnerId: string; type: string; oddsRequested: number; oddsMatched: number; bet_amount: number; return_amount: number; liability_amount: number; ipAddress: string; placedAt: string; isMultiBet?: boolean; multiBetType?: string | null; totalLegs?: number; combinedOdds?: number; legs?: BetLeg[]; } - interface BetLeg { legId?: string; legNumber?: number; position?: number; raceId?: string; market?: string; marketId?: string; selection?: string; runnerId?: string; oddsRequested?: number; oddsMatched?: number; legStatus?: string; stakeAtLeg?: number; grossProfit?: number; deductionPercent?: number; deductionAmount?: number; netProfit?: number; } - interface DetailData { race: Race; market: DetailMarket; bets: Bet[]; } - interface OddsRunner { runnerId: string; name: string; back_odd: number | null; lay_odd: number | null; runner: { horse_number: number }; } - {runner.exposure !== 0 ? (neg ? runner.exposure : `+${runner.exposure}`) : "0"} - </p> - </td> - <td className={cn("px-4 py-2 text-center tabular-nums font-semibold text-sm min-w-[36px]", backOdd !== null ? "bg-[#7EC8FF]" : "bg-muted/20 text-muted-foreground")}> - {backOdd ?? "—"} - </td> - <td className={cn("px-4 py-2 text-center tabular-nums font-semibold text-sm min-w-[36px]", layOdd !== null ? "bg-[#FFB5C6]" : "bg-muted/20 text-muted-foreground")}> - {layOdd ?? "—"} - </td>
Added / After Commit
+ diff --git a/src/routes/net-exposure-detail.tsx b/src/routes/net-exposure-detail.tsx + index 8782b8a..d09428c 100644 + interface DetailRunner { runnerId: string; runnerName: string; exposure: number; exposureProfit: number; } + interface DetailMarket { marketId: string; marketName: string; totalStake: number; runners: DetailRunner[]; worstBook: number; bestBook: number; } + interface Race { raceId: string; raceName: string; raceNo: number; startTime: string; } + interface Bet { userId: string; username: string; betId: string; event: string; market: string; marketId: string; selection: string; runnerId: string; type: string; oddsRequested: number; oddsMatched: number; bet_amount: number; return_amount: number; liability_amount: number; ipAddress: string; placedAt: string; isMultiBet?: boolean; multiBetType?: string | null; totalLegs?: number | string; totallegs?: number | string; combinedOdds?: number; legs?: BetLeg[]; } + interface BetLeg { legId?: string; legNumber?: number; position?: number; raceId?: string; market?: string; marketId?: string; selection?: string; runnerId?: string; oddsRequested?: number; oddsMatched?: number; legStatus?: string; stakeAtLeg?: number; grossProfit?: number; deductionPercent?: number; deductionAmount?: number; netProfit?: number; } + interface DetailData { race: Race; market: DetailMarket; bets: Bet[]; } + interface OddsRunner { runnerId: string; name: string; back_odd: number | null; lay_odd: number | null; runner: { horse_number: number }; } + {runner.exposure !== 0 ? (neg ? runner.exposure : `+${runner.exposure}`) : "0"} + </p> + </td> + <td + className={cn("px-4 py-2 text-center tabular-nums font-semibold text-sm min-w-[36px]",backOdd !== null + ? "bg-[#7EC8FF]" + : "bg-muted/20 text-muted-foreground" + )} + >
Removed / Before Commit
- diff --git a/src/routes/user-details.$userId.tsx b/src/routes/user-details.$userId.tsx - index 6682960..e56e802 100644 - setBetTimeFilter: (filter: BetTimeFilter) => void; - }) { - const [expandedMultiBetId, setExpandedMultiBetId] = useState<string | null>(null); - const COL_COUNT = 11; - const [currentPage, setCurrentPage] = useState(1); - const pageSize = 10; - - <TableHead className="font-bold">Market</TableHead> - <TableHead className="font-bold">Selection</TableHead> - <TableHead className="font-bold">Type</TableHead> - {/* <TableHead className="font-bold">Odds Req.</TableHead> */} - <TableHead className="font-bold">Odds Matched</TableHead> - <TableHead className="font-bold">Stake</TableHead> - <TableHead className="font-bold">Liability</TableHead> - {bet.odds_type.toUpperCase()} - </Badge>
Added / After Commit
+ diff --git a/src/routes/user-details.$userId.tsx b/src/routes/user-details.$userId.tsx + index 6682960..e56e802 100644 + setBetTimeFilter: (filter: BetTimeFilter) => void; + }) { + const [expandedMultiBetId, setExpandedMultiBetId] = useState<string | null>(null); + const COL_COUNT = 10; + const [currentPage, setCurrentPage] = useState(1); + const pageSize = 10; + + <TableHead className="font-bold">Market</TableHead> + <TableHead className="font-bold">Selection</TableHead> + <TableHead className="font-bold">Type</TableHead> + <TableHead className="font-bold">Odds Req.</TableHead> + <TableHead className="font-bold">Odds Matched</TableHead> + <TableHead className="font-bold">Stake</TableHead> + <TableHead className="font-bold">Liability</TableHead> + {bet.odds_type.toUpperCase()} + </Badge>
Removed / Before Commit
- diff --git a/src/routes/user-listing.tsx b/src/routes/user-listing.tsx - index b9c6134..d1abb4b 100644 - className="mt-1.5 h-9 rounded-lg" - /> - <div className="mt-1 flex items-center justify-between text-xs text-muted-foreground"> - <span>Min: 0</span> - {user?.role?.toUpperCase() !== "OWNER" && ( - <span> - Max:{" "} - tone={balance < 0 ? "negative" : balance > 0 ? "positive" : undefined} - /> */} - {/* <DownlineCell value={0} numeric /> */} - <DownlineCell - value={ - drillDownlineUserId - ? downlineUser.role === "MASTER" || downlineUser.role === "USER" - ? downlineUser.walletBalance - : downlineUser.availableCredit
Added / After Commit
+ diff --git a/src/routes/user-listing.tsx b/src/routes/user-listing.tsx + index b9c6134..d1abb4b 100644 + className="mt-1.5 h-9 rounded-lg" + /> + <div className="mt-1 flex items-center justify-between text-xs text-muted-foreground"> + {/* <span>Min: 0</span> */} + {user?.role?.toUpperCase() !== "OWNER" && ( + <span> + Max:{" "} + tone={balance < 0 ? "negative" : balance > 0 ? "positive" : undefined} + /> */} + {/* <DownlineCell value={0} numeric /> */} + <DownlineCell value={downlineUser.availableCredit} numeric /> + {/* <TableCell> + <Pencil className="h-4 w-4 text-primary" /> + </TableCell> */}