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 · 2f5b6d4e
This commit adds support for multi leg bet odds display by introducing totalLegs/totallegs properties and a getBetLegCount utility. It conditionally formats odds display for multi-leg bets. Some commented-out code suggests incomplete cleanup. The code is reasonably clear, but inconsistent casing (totalLegs vs totallegs) risks bugs. The commit message is minimal and not descriptive. There is no evident new security concern.
Quality
?
70%
Security
?
90%
Business Value
?
60%
Maintainability
?
65%
Issues & Suggested Fixes
?
1AI detects the issue
2Shows file, line, or evidence
3Suggests the fix to apply
Inconsistent Property Naming For Totallegs...
Where
src/routes/bet-ticket.tsx:74
Issue / Evidence
inconsistent property naming for totalLegs/totallegs
Suggested Fix
unify property name casing to prevent bugs
Inconsistent Property Naming For Totallegs...
Where
src/routes/bet-ticket.tsx:75
Issue / Evidence
inconsistent property naming for totallegs/totalLegs
Suggested Fix
unify property name casing to prevent bugs
Getbetlegcount Function Uses Both Totalleg...
Where
src/routes/bet-ticket.tsx:550
Issue / Evidence
getBetLegCount function uses both totalLegs and totallegs keys
Suggested Fix
refactor to use a single consistent key
Duplicate Logic
Where
src/routes/net-exposure-bet.tsx:46
Issue / Evidence
duplicate totalLegs/totallegs properties
Suggested Fix
unify naming to reduce confusion and risk
Logic To Retrieve Totallegs/Totallegs
Where
src/routes/net-exposure-bet.tsx:476
Issue / Evidence
logic to retrieve totalLegs/totallegs
Suggested Fix
refactor to handle only one property
Inconsistent Totallegs/Totallegs Property...
Where
src/routes/net-exposure-detail.tsx:21
Issue / Evidence
inconsistent totalLegs/totallegs property naming in Bet interface
Suggested Fix
choose one naming convention
Similar Code To Getbetlegcount
Where
src/routes/net-exposure-detail.tsx:602
Issue / Evidence
similar code to getBetLegCount
Suggested Fix
consider creating a shared utility to avoid duplication
Usage Of Getuserbettotallegs
Where
src/routes/user-details.$userId.tsx:970
Issue / Evidence
usage of getUserBetTotalLegs
Suggested Fix
ensure this function reliably handles leg counts
Insufficient Description
Where
commit message
Issue / Evidence
insufficient description
Suggested Fix
improve descriptive quality to reflect changes made related to multi legs odds
Commented Out Code
Where
src/routes/bet-ticket.tsx:485
Issue / Evidence
commented-out code
Suggested Fix
remove or clarify commented code to improve code cleanliness
Commented Out Table Cell For Odds
Where
src/routes/bet-ticket.tsx:528
Issue / Evidence
commented-out table cell for odds
Suggested Fix
remove if obsolete or enable if required for functionality
Commented Out Combinedodds Logic
Where
src/routes/net-exposure-bet.tsx:381
Issue / Evidence
commented-out combinedOdds logic
Suggested Fix
clean up or implement properly for clarity
Commented Out Combinedodds Section
Where
src/routes/net-exposure-detail.tsx:506
Issue / Evidence
commented-out combinedOdds section
Suggested Fix
either implement or remove to improve maintainability
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> */}