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 · ebe1ea50
The commit provides multiple UI and business logic improvements including bet filtering by date range, better date formatting handling, and UI updates for net exposure bets with refresh functionality and detailed legs data display. Code is generally clear and structured but with minor issues.
Quality
?
85%
Security
?
90%
Business Value
?
80%
Maintainability
?
85%
Issues & Suggested Fixes
?
1AI detects the issue
2Shows file, line, or evidence
3Suggests the fix to apply
Isdateinrange Expects Datevalue As String...
Where
src/routes/bet-list.tsx:677
Issue / Evidence
isDateInRange expects dateValue as string but checks typeof string; consider adding type safety or parsing handling
Suggested Fix
change this to improve bug risk score
Duplicate Logic
Where
src/routes/bet-list.tsx:664
Issue / Evidence
The fallback logic for toDate is 'value?.from' repeated, which might be clearer if restructured to avoid redundancy
Suggested Fix
change this to improve quality score
Long Function
Where
src/routes/net-exposure-bet.tsx:354-380
Issue / Evidence
Consider splitting large component or extracting complex UI logic for better maintainability
Suggested Fix
change this to improve quality score
Commented Out Strictmode Might Reduce Reac...
Where
src/main.tsx:15,17
Issue / Evidence
Commented out StrictMode might reduce React error detection in development
Suggested Fix
consider re-enabling StrictMode for better quality and bug detection
The Commit Message Is A Minimal Auto Merge...
Where
commit message
Issue / Evidence
The commit message is a minimal auto-merge message without context
Suggested Fix
improving commit messages to describe changes would improve business value and reviewability
Code Change Preview · src/main.tsx
?
Removed / Before Commit
- diff --git a/src/main.tsx b/src/main.tsx - index 73cbbf3..fd8c3ab 100644 - } - - createRoot(rootElement).render( - <StrictMode> - <RouterProvider router={router} /> - </StrictMode>, - );
Added / After Commit
+ diff --git a/src/main.tsx b/src/main.tsx + index 73cbbf3..fd8c3ab 100644 + } + + createRoot(rootElement).render( + // <StrictMode> + <RouterProvider router={router} /> + // </StrictMode>, + + + );
Removed / Before Commit
- diff --git a/src/routes/bet-list.tsx b/src/routes/bet-list.tsx - index ef27ba7..94f8630 100644 - }); - - const pagination = isAgentMode ? undefined : data?.pagination; - const bets = isAgentMode - ? ((agentBetsQuery.data as { bets?: Bet[] })?.bets ?? (Array.isArray(agentBetsQuery.data) ? (agentBetsQuery.data as Bet[]) : [])) - : (data?.bets ?? []); - const activeIsLoading = isAgentMode ? agentBetsQuery.isLoading : isLoading; - const activeError = isAgentMode ? agentBetsQuery.error : error; - - - function parseDateRange(value?: DateRange) { - return { - fromDate: value?.from ? format(value.from, "dd/MM/yyyy 00:00:00") : undefined, - toDate: value?.to ? format(value.to, "dd/MM/yyyy 23:59:59") : undefined, - }; - }
Added / After Commit
+ diff --git a/src/routes/bet-list.tsx b/src/routes/bet-list.tsx + index ef27ba7..94f8630 100644 + }); + + const pagination = isAgentMode ? undefined : data?.pagination; + const rawBets = isAgentMode + ? ((agentBetsQuery.data as { bets?: Bet[] })?.bets ?? (Array.isArray(agentBetsQuery.data) ? (agentBetsQuery.data as Bet[]) : [])) + : (data?.bets ?? []); + const bets = useMemo( + () => + rawBets.filter((bet) => + isDateInRange(bet.placed_at ?? bet.createdAt, appliedFilters.dateRange), + ), + [appliedFilters.dateRange, rawBets], + ); + const activeIsLoading = isAgentMode ? agentBetsQuery.isLoading : isLoading; + const activeError = isAgentMode ? agentBetsQuery.error : error; +
Removed / Before Commit
- diff --git a/src/routes/marketing.tsx b/src/routes/marketing.tsx - index 1e1be2a..2de88f8 100644 - const maxImageSize = 5 * 1024 * 1024; - - function defaultPublishTime() { - return new Date().toISOString().slice(0, 16); - - } - - function emptyForm(): BannerFormValues { - if (!formData.publish_time || Number.isNaN(new Date(formData.publish_time).getTime())) { - return "Publish time is required."; - } - if (!editingBanner && formData.images.length === 0) return "At least one image is required."; - return ""; - }; - - const totalPages =
Added / After Commit
+ diff --git a/src/routes/marketing.tsx b/src/routes/marketing.tsx + index 1e1be2a..2de88f8 100644 + const maxImageSize = 5 * 1024 * 1024; + + function defaultPublishTime() { + return formatDatetimeLocal(new Date()); + } + + function emptyForm(): BannerFormValues { + if (!formData.publish_time || Number.isNaN(new Date(formData.publish_time).getTime())) { + return "Publish time is required."; + } + if (isPastPublishTime(formData.publish_time)) { + return "Publish time cannot be in the past."; + } + if (!editingBanner && formData.images.length === 0) return "At least one image is required."; + return ""; + };
Removed / Before Commit
- diff --git a/src/routes/net-exposure-bet.tsx b/src/routes/net-exposure-bet.tsx - index 4c58b31..00a4a82 100644 - import { createFileRoute, useNavigate } from "@tanstack/react-router"; - import { useQuery } from "@tanstack/react-query"; - import { ArrowLeft, RefreshCw } from "lucide-react"; - import { Button } from "@/components/ui/button"; - import { cn } from "@/lib/utils"; - import { tenantApiClient } from "@/services/api/apiClient"; - liability: number; - ipAddress: string; - lastUpdated: string; - } - - interface BetsResponse { - function NetExposureBetPage() { - const { raceId, marketId, userId } = getExposureParams(); - const navigate = useNavigate(); -
Added / After Commit
+ diff --git a/src/routes/net-exposure-bet.tsx b/src/routes/net-exposure-bet.tsx + index 4c58b31..00a4a82 100644 + import { createFileRoute, useNavigate } from "@tanstack/react-router"; + import { useQuery } from "@tanstack/react-query"; + import { Fragment, useEffect, useState } from "react"; + import { ArrowLeft, Eye, RefreshCw } from "lucide-react"; + import { Button } from "@/components/ui/button"; + import { cn } from "@/lib/utils"; + import { tenantApiClient } from "@/services/api/apiClient"; + liability: number; + ipAddress: string; + lastUpdated: string; + isMultiBet?: boolean; + multiBetType?: string | null; + totalLegs?: number; + combinedOdds?: number; + legs?: BetLeg[]; + }
Removed / Before Commit
- diff --git a/src/routes/net-exposure-detail.tsx b/src/routes/net-exposure-detail.tsx - index f81274a..6ebede2 100644 - import { createFileRoute, useNavigate } from "@tanstack/react-router"; - import { useQuery } from "@tanstack/react-query"; - import { useState } from "react"; - import type React from "react"; - import { ArrowLeft, RefreshCw, ChevronDown, Network } from "lucide-react"; - import { Button } from "@/components/ui/button"; - import { cn } from "@/lib/utils"; - import { tenantApiClient } from "@/services/api/apiClient"; - 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; matched: number; unmatched: number; profitLiability: number; ipAddress: string; placedAt: string; } - 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 }; } - interface OddsMarket { marketId: string; marketName: string; odds: OddsRunner[]; } - const { raceId, marketId, parentUserId } = getExposureParams();
Added / After Commit
+ diff --git a/src/routes/net-exposure-detail.tsx b/src/routes/net-exposure-detail.tsx + index f81274a..6ebede2 100644 + import { createFileRoute, useNavigate } from "@tanstack/react-router"; + import { useQuery } from "@tanstack/react-query"; + import { Fragment, useEffect, useState } from "react"; + import type React from "react"; + import { ArrowLeft, RefreshCw, ChevronDown, Network, Eye } from "lucide-react"; + import { Button } from "@/components/ui/button"; + import { cn } from "@/lib/utils"; + import { tenantApiClient } from "@/services/api/apiClient"; + 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 }; } + interface OddsMarket { marketId: string; marketName: string; odds: OddsRunner[]; }
Removed / Before Commit
- diff --git a/src/routes/statement.tsx b/src/routes/statement.tsx - index 102d604..af8a97a 100644 - .trim() - .toLowerCase(); - const isDebitAmount = amountType === "debit" || (!amountType && isRevoke); - const amountColorClass = isDebitAmount - ? "text-red-400" - : amountType === "credit"
Added / After Commit
+ diff --git a/src/routes/statement.tsx b/src/routes/statement.tsx + index 102d604..af8a97a 100644 + .trim() + .toLowerCase(); + const isDebitAmount = amountType === "debit" || (!amountType && isRevoke); + + const amountColorClass = isDebitAmount + ? "text-red-400" + : amountType === "credit"
Removed / Before Commit
- diff --git a/src/routes/user-details.$userId.tsx b/src/routes/user-details.$userId.tsx - index 6f56dde..c44f7aa 100644 - import { Badge } from "@/components/ui/badge"; - import TablePagination from "@/components/common/TablePagination"; - import DateRangePicker from "@/components/common/DateRangePicker"; - import { Fragment, useState, useMemo } from "react"; - import type { DateRange } from "react-day-picker"; - import { - Table, - type BetStatus = "matched" | "unmatched"; - type BetTimeFilter = "current" | "past"; - - type UserBetLeg = MultiBetLeg & { - odds_request?: number | string; - stake_at_leg?: number | string; - function UserDetailsPage() { - const { userId } = Route.useParams(); - const [activeTab, setActiveTab] = useState<TabType>("activity");
Added / After Commit
+ diff --git a/src/routes/user-details.$userId.tsx b/src/routes/user-details.$userId.tsx + index 6f56dde..c44f7aa 100644 + import { Badge } from "@/components/ui/badge"; + import TablePagination from "@/components/common/TablePagination"; + import DateRangePicker from "@/components/common/DateRangePicker"; + import { Fragment, useEffect, useState, useMemo } from "react"; + import type { DateRange } from "react-day-picker"; + import { + Table, + type BetStatus = "matched" | "unmatched"; + type BetTimeFilter = "current" | "past"; + + function getDefaultStatementDateRange(): DateRange { + return { + from: new Date(), + to: new Date(), + }; + }
Removed / Before Commit
- diff --git a/src/routes/user-listing.tsx b/src/routes/user-listing.tsx - index 6f7c530..eb80873 100644 - import { createFileRoute, Link } from "@tanstack/react-router"; - import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; - import { type ReactNode, useEffect, useMemo, useState } from "react"; - import { motion } from "motion/react"; - import { toast } from "sonner"; - import { Card } from "@/components/ui/card"; - permissions: [] as string[], - }; - - type DateFilterKey = "createdAt" | "lastLoginAt" | "paymentDoneAt"; - type CreditAdjustmentMode = "credit" | "debit"; - type UserSearchFrom = "login_name" | "ip"; - - userId: string; - }; -
Added / After Commit
+ diff --git a/src/routes/user-listing.tsx b/src/routes/user-listing.tsx + index 6f7c530..eb80873 100644 + import { createFileRoute, Link } from "@tanstack/react-router"; + import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; + import { type ReactNode, useEffect, useMemo, useState } from "react"; + import type { DateRange } from "react-day-picker"; + import { motion } from "motion/react"; + import { toast } from "sonner"; + import { Card } from "@/components/ui/card"; + permissions: [] as string[], + }; + + type CreditAdjustmentMode = "credit" | "debit"; + type UserSearchFrom = "login_name" | "ip"; + + userId: string; + }; +
Removed / Before Commit
- diff --git a/src/routes/virtual-report.tsx b/src/routes/virtual-report.tsx - index 42c1006..480d1c9 100644 - import { Button } from "@/components/ui/button"; - import { useQuery } from "@tanstack/react-query"; - import { toast } from "sonner"; - import { internalServices } from "@/services/api/internalServices"; - import { Calendar as CalendarIcon, Download } from "lucide-react"; - import { Calendar } from "@/components/ui/calendar"; - import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; - }; - const [appliedFilters, setAppliedFilters] = useState(defaultFilters); - - const reportQuery = useQuery({ - queryKey: ["virtual-report", appliedFilters], - queryFn: () => internalServices.horseRacingReports.globalProfitLoss(appliedFilters.fromDate, appliedFilters.toDate), - staleTime: 30_000, - retry: 1, - });
Added / After Commit
+ diff --git a/src/routes/virtual-report.tsx b/src/routes/virtual-report.tsx + index 42c1006..480d1c9 100644 + import { Button } from "@/components/ui/button"; + import { useQuery } from "@tanstack/react-query"; + import { toast } from "sonner"; + // import { internalServices } from "@/services/api/internalServices"; + import { Calendar as CalendarIcon, Download } from "lucide-react"; + import { Calendar } from "@/components/ui/calendar"; + import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; + }; + const [appliedFilters, setAppliedFilters] = useState(defaultFilters); + + // const reportQuery = useQuery({ + // queryKey: ["virtual-report", appliedFilters], + // queryFn: () => internalServices.horseRacingReports.globalProfitLoss(appliedFilters.fromDate, appliedFilters.toDate), + // staleTime: 30_000, + // retry: 1, + // });
Removed / Before Commit
- diff --git a/src/services/api/internalServices.ts b/src/services/api/internalServices.ts - index 9789069..748cb41 100644 - params?: { - page?: number; - limit?: number; - }, - ) { - const queryString = toQueryString({ - page: params?.page || 1, - limit: params?.limit || 100, - }); - return unwrapData<{ - user: { - params?: { - page?: number; - limit?: number; - }, - ) {
Added / After Commit
+ diff --git a/src/services/api/internalServices.ts b/src/services/api/internalServices.ts + index 9789069..748cb41 100644 + params?: { + page?: number; + limit?: number; + fromDate?: string; + toDate?: string; + }, + ) { + const queryString = toQueryString({ + page: params?.page || 1, + limit: params?.limit || 100, + fromDate: params?.fromDate, + toDate: params?.toDate, + }); + return unwrapData<{ + user: { + params?: {