Showing AI reviews for super-admin
Project AI Score ?
72%
Quality Avg ?
77%
Security Avg ?
64%
Reviews ?
91

Review Result ?

solutionbowl/super-admin · 1a911597
The commit introduces a new 'Bet Ticker' route and component along with related hooks and utilities, improving features and UI components. The code includes a reusable auto-refresh hook, effective use of React query for data fetching, and well-structured typescript interfaces which enhance maintainability and readability. Commented-out code in bet-list.tsx might indicate incomplete cleanup. The navigation onClick with bet._id rather than userId may cause navigation issues. Default parameters and query usage supports modularity, though no explicit security measures for sensitive data or user input validation are evident.
Quality ?
80%
Security ?
60%
Business Value ?
75%
Maintainability ?
80%
Issues & Suggested Fixes ?
1AI detects the issue
2Shows file, line, or evidence
3Suggests the fix to apply
Commented Out Code
Where src/routes/bet-list.tsx:373
Issue / Evidence commented out code
Suggested Fix remove commented out onClick to improve code clarity and quality score
Onclick Navigation Uses Bet. Id For User D...
Where src/routes/bet-list.tsx:377
Issue / Evidence onClick navigation uses bet._id for user details
Suggested Fix consider using a verified userId to reduce bug risk and improve business value
Vague Message 'Merged In Manya1'
Where commit message
Issue / Evidence vague message 'Merged in Manya1'
Suggested Fix improve commit message to clearly describe the changes for better business value and quality tracking
Api Call Params Are Passed As Is
Where src/routes/bet-ticket.tsx:83
Issue / Evidence API call params are passed as is
Suggested Fix consider input sanitization or validation to improve security score
Added Menu Entry With 'Publicvisible: True...
Where src/components/app-sidebar.tsx:110
Issue / Evidence added menu entry with 'publicVisible: true'
Suggested Fix confirm this visibility setting matches access control policies to reduce security risks
Code Change Preview · src/components/app-sidebar.tsx ?
Removed / Before Commit
- diff --git a/src/components/app-sidebar.tsx b/src/components/app-sidebar.tsx
- index 8b68095..493ccdc 100644
- publicVisible: true, // Always visible for all roles
- items: [
- { title: "Net Exposure", url: "/net-exposure", icon: TrendingUp, publicVisible: true },
-       { title: "Bet Ticket", url: "/bet-ticket", icon: Ticket, publicVisible: true },
- ],
- },
- {
Added / After Commit
+ diff --git a/src/components/app-sidebar.tsx b/src/components/app-sidebar.tsx
+ index 8b68095..493ccdc 100644
+ publicVisible: true, // Always visible for all roles
+ items: [
+ { title: "Net Exposure", url: "/net-exposure", icon: TrendingUp, publicVisible: true },
+       { title: "Bet Ticker", url: "/bet-ticket", icon: Ticket, publicVisible: true },
+ ],
+ },
+ {
Removed / Before Commit
- diff --git a/src/hooks/useAutoRefresh.ts b/src/hooks/useAutoRefresh.ts
- new file mode 100644
- index 0000000..3194256
Added / After Commit
+ diff --git a/src/hooks/useAutoRefresh.ts b/src/hooks/useAutoRefresh.ts
+ new file mode 100644
+ index 0000000..3194256
+ import { useEffect, useRef, useState } from "react";
+ 
+ 
+         
+ export function useAutoRefresh(onRefresh: () => void, seconds = 30) {
+   const [countdown, setCountdown] = useState(seconds);
+   const onRefreshRef = useRef(onRefresh);
+   onRefreshRef.current = onRefresh;
+ 
+   useEffect(() => {
+     setCountdown(seconds);
+     const interval = setInterval(() => {
+       setCountdown((prev) => {
+         if (prev <= 1) {
+           onRefreshRef.current();
Removed / Before Commit
- diff --git a/src/routes/bet-list.tsx b/src/routes/bet-list.tsx
- index 7be6b73..a7a3e8a 100644
- import { createFileRoute } from "@tanstack/react-router";
- import { useQuery } from "@tanstack/react-query";
- import { format } from "date-fns";
- import { Calendar as CalendarIcon, Download, Eye } from "lucide-react";
- SelectTrigger,
- SelectValue,
- } from "@/components/ui/select";
- import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs";
- import { internalServices } from "@/services/api/internalServices";
- import type { Bet, MultiBetLeg } from "@/services/api/betTypes";
- import { cn } from "@/lib/utils";
- head: () => ({ meta: [{ title: "Bets List - B2B-B2C Panel" }] }),
- });
- 
- type BetView = "current" | "past";
- type BetRadioFilter = "matched" | "unmatched" | "multi";
Added / After Commit
+ diff --git a/src/routes/bet-list.tsx b/src/routes/bet-list.tsx
+ index 7be6b73..a7a3e8a 100644
+ import { createFileRoute, useNavigate } from "@tanstack/react-router";
+ import { useQuery } from "@tanstack/react-query";
+ import { format } from "date-fns";
+ import { Calendar as CalendarIcon, Download, Eye } from "lucide-react";
+ SelectTrigger,
+ SelectValue,
+ } from "@/components/ui/select";
+ import { internalServices } from "@/services/api/internalServices";
+ import type { Bet, MultiBetLeg } from "@/services/api/betTypes";
+ import { cn } from "@/lib/utils";
+ head: () => ({ meta: [{ title: "Bets List - B2B-B2C Panel" }] }),
+ });
+ 
+ const tableColumns = [
+ "Legs",
+ "User",
Removed / Before Commit
- diff --git a/src/routes/bet-ticket.tsx b/src/routes/bet-ticket.tsx
- index be84d5e..703e2dd 100644
- import { createFileRoute } from "@tanstack/react-router";
- import { useState } from "react";
- import { motion } from "motion/react";
- import { Card } from "@/components/ui/card";
- import { Button } from "@/components/ui/button";
- import { Input } from "@/components/ui/input";
- TableHeader,
- TableRow,
- } from "@/components/ui/table";
- 
- export const Route = createFileRoute("/bet-ticket")({
- component: BetTicketPage,
-   head: () => ({ meta: [{ title: "Bet Ticket - B2B-B2C Panel" }] }),
- });
- 
- function BetTicketPage() {
Added / After Commit
+ diff --git a/src/routes/bet-ticket.tsx b/src/routes/bet-ticket.tsx
+ index be84d5e..703e2dd 100644
+ import { createFileRoute ,useNavigate} from "@tanstack/react-router";
+ import { useState } from "react";
+ import { useQuery } from "@tanstack/react-query";
+ import { motion } from "motion/react";
+ import { RefreshCw } from "lucide-react";
+ import { Card } from "@/components/ui/card";
+ import { Button } from "@/components/ui/button";
+ import { Input } from "@/components/ui/input";
+ TableHeader,
+ TableRow,
+ } from "@/components/ui/table";
+ import { tenantApiClient } from "@/services/api/apiClient";
+ import { cn } from "@/lib/utils";
+ import { format } from "date-fns";
+ import { useAutoRefresh } from "@/hooks/useAutoRefresh";
+ 
Removed / Before Commit
- diff --git a/src/routes/net-exposure-bet.tsx b/src/routes/net-exposure-bet.tsx
- index da748b9..60b3882 100644
- 
- // Breadcrumb title
- const breadcrumb = race
-     ? `${race.raceName} ${race.marketId ?? ""}`
- : "";
- 
- return (
- className="border-b border-border/40 hover:bg-muted/20"
- >
- {/* User */}
-                       <td className="px-4 py-3 font-medium text-emerald-500 whitespace-nowrap">
-                         {bet.username || "—"}
- </td>
- 
- {/* BetId */}
- {/* Type badge */}
Added / After Commit
+ diff --git a/src/routes/net-exposure-bet.tsx b/src/routes/net-exposure-bet.tsx
+ index da748b9..60b3882 100644
+ 
+ // Breadcrumb title
+ const breadcrumb = race
+     ? `${race.raceName} ${""}`
+ : "";
+ 
+ return (
+ className="border-b border-border/40 hover:bg-muted/20"
+ >
+ {/* User */}
+                      <td
+                       className="px-3 py-2 font-medium text-emerald-500 cursor-pointer hover:underline"
+                       onClick={() => navigate({ to: `/user-details/${bet.userId}` })}
+                           >
+                       {bet.username}
+ </td>
Removed / Before Commit
- diff --git a/src/routes/net-exposure-detail.tsx b/src/routes/net-exposure-detail.tsx
- index f2f8ba6..12b3611 100644
- import { createFileRoute, useNavigate } from "@tanstack/react-router";
- import { useQuery } from "@tanstack/react-query";
- import { useState } from "react";
- import { ArrowLeft, RefreshCw, ChevronUp, ChevronDown } from "lucide-react";
- import { Button } from "@/components/ui/button";
- import { cn } from "@/lib/utils";
- import { tenantApiClient } from "@/services/api/apiClient";
- 
- // ─── Route ────────────────────────────────────────────────────────────────────
- 
- export const Route = createFileRoute("/net-exposure-detail")({
- <div className="p-5 space-y-6">
- 
- {/* Net Exposure label */}
-             <p className="text-sm font-semibold text-emerald-500">Net Exposure</p>
- 
Added / After Commit
+ diff --git a/src/routes/net-exposure-detail.tsx b/src/routes/net-exposure-detail.tsx
+ index f2f8ba6..12b3611 100644
+ import { createFileRoute, useNavigate } from "@tanstack/react-router";
+ import { useQuery } from "@tanstack/react-query";
+ import { useState } from "react";
+ import { ArrowLeft, RefreshCw, ArrowDownToLine } from "lucide-react";
+ import { Button } from "@/components/ui/button";
+ import { cn } from "@/lib/utils";
+ import { tenantApiClient } from "@/services/api/apiClient";
+ 
+ 
+ 
+ 
+ // ─── Route ────────────────────────────────────────────────────────────────────
+ 
+ export const Route = createFileRoute("/net-exposure-detail")({
+ <div className="p-5 space-y-6">
+ 
Removed / Before Commit
- diff --git a/src/routes/net-exposure-herarchy.tsx b/src/routes/net-exposure-herarchy.tsx
- index 287fcf5..294f4e7 100644
- import { createFileRoute, useNavigate } from "@tanstack/react-router";
- import { useQuery } from "@tanstack/react-query";
- import { useState } from "react";
- import { ChevronDown, RefreshCw, ArrowLeft } from "lucide-react";
- import { tenantApiClient } from "@/services/api/apiClient";
- import { Button } from "@/components/ui/button";
- import { cn } from "@/lib/utils";
- 
- 
- export const Route = createFileRoute("/net-exposure-herarchy")({
- component: NetExposureHierarchyPage,
- validateSearch: (search: Record<string, unknown>) => ({
- head: () => ({ meta: [{ title: "Net Exposure Hierarchy - B2B-B2C Panel" }] }),
- });
- 
- // ─── Types 
Added / After Commit
+ diff --git a/src/routes/net-exposure-herarchy.tsx b/src/routes/net-exposure-herarchy.tsx
+ index 287fcf5..294f4e7 100644
+ import { createFileRoute, useNavigate } from "@tanstack/react-router";
+ import { useQuery } from "@tanstack/react-query";
+ import { useState } from "react";
+ import { ArrowDownToLine, RefreshCw, ArrowLeft } from "lucide-react";
+ import { tenantApiClient } from "@/services/api/apiClient";
+ import { Button } from "@/components/ui/button";
+ import { cn } from "@/lib/utils";
+ 
+ export const Route = createFileRoute("/net-exposure-herarchy")({
+ component: NetExposureHierarchyPage,
+ validateSearch: (search: Record<string, unknown>) => ({
+ head: () => ({ meta: [{ title: "Net Exposure Hierarchy - B2B-B2C Panel" }] }),
+ });
+ 
+ interface HierarchyUser {
+ id: string;
Removed / Before Commit
- diff --git a/src/routes/net-exposure.tsx b/src/routes/net-exposure.tsx
- index 41f7901..bc7361c 100644
- import { cn } from "@/lib/utils";
- import { useQuery } from "@tanstack/react-query";
- import { Gauge, List, Users } from "lucide-react";
- import { internalServices } from "@/services/api/internalServices";
- 
- export const Route = createFileRoute("/net-exposure")({
- 
- const data: RaceExposure[] = Array.isArray(rawData) ? rawData : [];
- 
- // Fixed runner labels
- const runnerLabels = ["1", "X", "2"];
- 
- onClick={() => refetch()}
- disabled={isFetching}
- >
-             Refresh
Added / After Commit
+ diff --git a/src/routes/net-exposure.tsx b/src/routes/net-exposure.tsx
+ index 41f7901..bc7361c 100644
+ import { cn } from "@/lib/utils";
+ import { useQuery } from "@tanstack/react-query";
+ import { Gauge, List, Users } from "lucide-react";
+ import { useAutoRefresh } from "@/hooks/useAutoRefresh";
+ import { internalServices } from "@/services/api/internalServices";
+ 
+ export const Route = createFileRoute("/net-exposure")({
+ 
+ const data: RaceExposure[] = Array.isArray(rawData) ? rawData : [];
+ 
+   const countdown = useAutoRefresh(() => refetch());
+ 
+ // Fixed runner labels
+ const runnerLabels = ["1", "X", "2"];
+ 
+ onClick={() => refetch()}
Removed / Before Commit
- diff --git a/src/routes/user-details.$userId.tsx b/src/routes/user-details.$userId.tsx
- index 635bfad..f1697da 100644
- import { createFileRoute } from "@tanstack/react-router";
- import { useQuery } from "@tanstack/react-query";
- import { useState } from "react";
- import { motion } from "motion/react";
- TableHeader,
- TableRow,
- } from "@/components/ui/table";
- import { Calendar, Search, Download, RefreshCw, Filter } from "lucide-react";
- import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover";
- import { Calendar as CalendarComponent } from "@/components/ui/calendar";
- import { internalServices } from "@/services/api/internalServices";
- import { cn } from "@/lib/utils";
- import { format } from "date-fns";
- 
- const { data: userDetails, isLoading } = useQuery({
- queryKey: ["user-details", userId],
Added / After Commit
+ diff --git a/src/routes/user-details.$userId.tsx b/src/routes/user-details.$userId.tsx
+ index 635bfad..f1697da 100644
+ import { createFileRoute,useNavigate} from "@tanstack/react-router";
+ import { useQuery } from "@tanstack/react-query";
+ import { useState } from "react";
+ import { motion } from "motion/react";
+ TableHeader,
+ TableRow,
+ } from "@/components/ui/table";
+ import { Calendar, Search, Download, RefreshCw, Filter, Gauge, List, Users } from "lucide-react";
+ import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover";
+ import { Calendar as CalendarComponent } from "@/components/ui/calendar";
+ import { internalServices } from "@/services/api/internalServices";
+ import { tenantApiClient } from "@/services/api/apiClient";
+ import { cn } from "@/lib/utils";
+ import { format } from "date-fns";
+ 
+ const { data: userDetails, isLoading } = useQuery({
Removed / Before Commit
- diff --git a/src/routes/user-listing.tsx b/src/routes/user-listing.tsx
- index 8d47131..bb75e56 100644
- </Button>
- </div>
- </div>
- 
- <div className="p-5">
- <div className="mb-4 flex items-center justify-between">
- {downlineTabs.length > 1 ? (
- >
- {downlineTabs.map((tab) => {
- const isSelected = tab.value === effectiveDownlineTab;
- 
- return (
- <button
Added / After Commit
+ diff --git a/src/routes/user-listing.tsx b/src/routes/user-listing.tsx
+ index 8d47131..bb75e56 100644
+ </Button>
+ </div>
+ </div>
+ <div className="p-5">
+ <div className="mb-4 flex items-center justify-between">
+ {downlineTabs.length > 1 ? (
+ >
+ {downlineTabs.map((tab) => {
+ const isSelected = tab.value === effectiveDownlineTab;
+                   
+ 
+ return (
+ <button
Removed / Before Commit
- diff --git a/src/services/api/betTypes.ts b/src/services/api/betTypes.ts
- index 81cd64b..954632a 100644
- odds_matched?: number;
- }
- 
- export interface MultiBetLeg {
- _id?: string;
- id?: string;
- 
- export interface Bet {
- _id?: string;
- event_id?: string;
- odds_type?: "back" | "lay" | string;
- market_name?: string;
- return_amount?: number;
- bet_status?: "WON" | "LOST" | "ACCEPTED" | "PENDING" | "CANCELLED" | string;
- is_multi_bet?: boolean;
- multi_bet_type?: string | null;
Added / After Commit
+ diff --git a/src/services/api/betTypes.ts b/src/services/api/betTypes.ts
+ index 81cd64b..954632a 100644
+ odds_matched?: number;
+ }
+ 
+ export interface BetUserReference {
+   _id?: string;
+   id?: string;
+   userId?: string;
+   username?: string;
+   name?: string;
+   [key: string]: unknown;
+ }
+ 
+ export interface MultiBetLeg {
+ _id?: string;
+ id?: string;
+