Showing AI reviews for super-admin
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> */}