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

Review Result ?

solutionbowl/super-admin · 1804989f
The commit implements a custom React hook for managing socket connections with well-defined event listeners and reconnection logic. It cleanly abstracts complex behavior with references and conditions. However, there are commented out lines related to auth configuration which could weaken security. Some sensitive operations and error handling could be improved.
Quality ?
85%
Security ?
50%
Business Value ?
70%
Maintainability ?
83%
Issues & Suggested Fixes ?
1AI detects the issue
2Shows file, line, or evidence
3Suggests the fix to apply
Security Issue
Where src/hooks/useReportSocket.tsx:50
Issue / Evidence commented out auth options for socket connection present
Suggested Fix enable and properly test the auth options to improve security
Localstorage Access Without Fallback
Where src/hooks/useReportSocket.tsx:42
Issue / Evidence localStorage access without fallback
Suggested Fix add error handling for localStorage retrieval to reduce bug risk
Forcibly Stopping Reconnection On Session ...
Where src/hooks/useReportSocket.tsx:94-95
Issue / Evidence forcibly stopping reconnection on SESSION_INVALID error only by string comparison
Suggested Fix consider more robust token/session management and fallback logic
Wide Usage Of Console Logging For All Even...
Where src/hooks/useReportSocket.tsx:131
Issue / Evidence wide usage of console logging for all events
Suggested Fix replace or complement console logs with proper monitoring/logging tools for production stability
Lack Of Detailed Prop Typing Or Defaults F...
Where src/hooks/useReportSocket.tsx:19-24
Issue / Evidence lack of detailed prop typing or defaults for all options
Suggested Fix consider stricter types and default values for clarity and better type safety
Code Change Preview · src/hooks/use-mobile.tsx ?
Removed / Before Commit
- diff --git a/src/hooks/use-mobile.tsx b/src/hooks/use-mobile.tsx
- index 502fd32..facc22f 100644
- setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
- return () => mql.removeEventListener("change", onChange);
- }, []);
- 
- return !!isMobile;
- }
Added / After Commit
+ diff --git a/src/hooks/use-mobile.tsx b/src/hooks/use-mobile.tsx
+ index 502fd32..facc22f 100644
+ setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
+ return () => mql.removeEventListener("change", onChange);
+ }, []);
+   
+   
+ 
+ return !!isMobile;
+ }
+ 
Removed / Before Commit
- diff --git a/src/hooks/useReportSocket.tsx b/src/hooks/useReportSocket.tsx
- new file mode 100644
- index 0000000..1c5ac8c
Added / After Commit
+ diff --git a/src/hooks/useReportSocket.tsx b/src/hooks/useReportSocket.tsx
+ new file mode 100644
+ index 0000000..1c5ac8c
+ import { useEffect, useRef } from "react";
+ import { io, type Socket } from "socket.io-client";
+ import { authConfig } from "@/config/auth.config";
+ 
+ 
+ type ReportSocketOptions = {
+   enabled?: boolean;
+   joinRaceId?: string;
+   url?: string;
+   onBet?: (payload: unknown) => void;
+   onProfitLoss?: () => void;
+ };
+ 
+ const PROFIT_LOSS_EVENT = "profitLoss";
+ const BETS_EVENT = "bets";
Removed / Before Commit
- diff --git a/src/routes/bet-ticket.tsx b/src/routes/bet-ticket.tsx
- index 8bee2a3..e7fefbe 100644
- staleTime: 30_000,
- retry: 1,
- });
- 
- const bets = data?.bets ?? [];
- const total = data?.total ?? 0;
- <TableCell className="text-center tabular-nums">
- {bet.liability_amount.toLocaleString()}
- </TableCell>
-                           <TableCell className="text-center tabular-nums">
-                             {bet.oddsRequested}
-                           </TableCell>
-                           <TableCell className="text-center tabular-nums">
-                             {bet.oddsMatched}
-                           </TableCell>
-                           <TableCell className="text-center tabular-nums">
Added / After Commit
+ diff --git a/src/routes/bet-ticket.tsx b/src/routes/bet-ticket.tsx
+ index 8bee2a3..e7fefbe 100644
+ staleTime: 30_000,
+ retry: 1,
+ });
+  
+ 
+   
+ 
+ const bets = data?.bets ?? [];
+ const total = data?.total ?? 0;
+ <TableCell className="text-center tabular-nums">
+ {bet.liability_amount.toLocaleString()}
+ </TableCell>
+ 
+ <TableCell
+ className={cn(
Removed / Before Commit
- diff --git a/src/routes/net-exposure-detail.tsx b/src/routes/net-exposure-detail.tsx
- index d09428c..6c1cee9 100644
- import { cn } from "@/lib/utils";
- import { tenantApiClient } from "@/services/api/apiClient";
- import { getExposureParams } from "@/lib/nav-params";
- 
- export const Route = createFileRoute("/net-exposure-detail")({
- component: NetExposureDetailPage,
- 
- // ─── Types ────────────────────────────────────────────────────────────────────
- 
- 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 }; }
Added / After Commit
+ diff --git a/src/routes/net-exposure-detail.tsx b/src/routes/net-exposure-detail.tsx
+ index d09428c..6c1cee9 100644
+ import { cn } from "@/lib/utils";
+ import { tenantApiClient } from "@/services/api/apiClient";
+ import { getExposureParams } from "@/lib/nav-params";
+ import { useReportSocket } from "@/hooks/useReportSocket";
+ 
+ export const Route = createFileRoute("/net-exposure-detail")({
+ component: NetExposureDetailPage,
+ 
+ // ─── Types ────────────────────────────────────────────────────────────────────
+ 
+ interface DetailRunner {
+   runnerId: string;
+   runnerName: string;
+   exposure: number;
+   exposureProfit: number;
+ }
Removed / Before Commit
- diff --git a/src/routes/net-exposure-herarchy.tsx b/src/routes/net-exposure-herarchy.tsx
- index bc7e760..c074f5e 100644
- import { createFileRoute, useNavigate } from "@tanstack/react-router";
- import { useQuery } from "@tanstack/react-query";
- import { useState } from "react";
- import type React from "react";
- import { ChevronDown, Network, RefreshCw, ArrowLeft } from "lucide-react";
- import { tenantApiClient } from "@/services/api/apiClient";
- import { Button } from "@/components/ui/button";
- import { cn } from "@/lib/utils";
- 
- interface HierarchyUser {
- id: string;
- username: string;
- name: string;
- role: string;
- hierarchy: HierarchyUser[];
- }
Added / After Commit
+ diff --git a/src/routes/net-exposure-herarchy.tsx b/src/routes/net-exposure-herarchy.tsx
+ index bc7e760..c074f5e 100644
+ import { createFileRoute, useNavigate } from "@tanstack/react-router";
+ import { useQuery } from "@tanstack/react-query";
+ import { useState } from "react";
+ import { ArrowLeft, Network, RefreshCw } from "lucide-react";
+ import { tenantApiClient } from "@/services/api/apiClient";
+ import { Button } from "@/components/ui/button";
+ import { cn } from "@/lib/utils";
+ 
+ interface HierarchyUser {
+ id: string;
+   _id?: string;
+   userId?: string;
+   user_id?: string;
+ username: string;
+ name: string;
+ role: string;
Removed / Before Commit
- diff --git a/src/routes/net-exposure.tsx b/src/routes/net-exposure.tsx
- index 9460c7a..21b2b6c 100644
- Refresh {countdown}s
- </Button>
- </div>
- 
- {/* Sport filter */}
- <div className="border-b border-border/60 p-5">
Added / After Commit
+ diff --git a/src/routes/net-exposure.tsx b/src/routes/net-exposure.tsx
+ index 9460c7a..21b2b6c 100644
+ Refresh {countdown}s
+ </Button>
+ </div>
+         
+         
+ 
+ {/* Sport filter */}
+ <div className="border-b border-border/60 p-5">
Removed / Before Commit
- diff --git a/src/routes/pl-by-agent.tsx b/src/routes/pl-by-agent.tsx
- index bc0a29f..c464e9f 100644
- TableRow,
- } from "@/components/ui/table";
- import { internalServices } from "@/services/api/internalServices";
- import type {
- ProfitLossAgentRow,
- ProfitLossDateGroup,
- const csvRows = useMemo(() => flattenCsvRows(report), [report]);
- const refetchReport = reportQuery.refetch;
- 
- useEffect(() => {
- const timer = window.setInterval(() => {
- setRefreshCountdown((current) => Math.max(0, current - 1));
- }, [refreshCountdown, refetchReport]);
- 
- const handleManualRefresh = () => {
-     refetchReport();
Added / After Commit
+ diff --git a/src/routes/pl-by-agent.tsx b/src/routes/pl-by-agent.tsx
+ index bc0a29f..c464e9f 100644
+ TableRow,
+ } from "@/components/ui/table";
+ import { internalServices } from "@/services/api/internalServices";
+ import { useReportSocket } from "@/hooks/useReportSocket";
+ import type {
+ ProfitLossAgentRow,
+ ProfitLossDateGroup,
+ const csvRows = useMemo(() => flattenCsvRows(report), [report]);
+ const refetchReport = reportQuery.refetch;
+ 
+   const refreshAppliedReport = () => {
+     refetchReport();
+     setRefreshCountdown(refreshIntervalSeconds);
+   };
+   useReportSocket({ onProfitLoss: refreshAppliedReport });
+ 
Removed / Before Commit
- diff --git a/src/routes/pl-by-market.tsx b/src/routes/pl-by-market.tsx
- index 62c0f40..5fc49b6 100644
- import { createFileRoute } from "@tanstack/react-router";
- import { useQuery } from "@tanstack/react-query";
- import { useEffect, useMemo, useState } from "react";
- import { motion } from "motion/react";
- import { format } from "date-fns";
- import { toast } from "sonner";
- TableRow,
- } from "@/components/ui/table";
- import { internalServices } from "@/services/api/internalServices";
- import type {
- ProfitLossDateGroup,
- ProfitLossMarketRow,
- const csvRows = useMemo(() => flattenCsvRows(report), [report]);
- const refetchReport = reportQuery.refetch;
- 
- useEffect(() => {
Added / After Commit
+ diff --git a/src/routes/pl-by-market.tsx b/src/routes/pl-by-market.tsx
+ index 62c0f40..5fc49b6 100644
+ import { createFileRoute } from "@tanstack/react-router";
+ import { useQuery } from "@tanstack/react-query";
+ import { useMemo, useState, useEffect } from "react";
+ import { motion } from "motion/react";
+ import { format } from "date-fns";
+ import { toast } from "sonner";
+ TableRow,
+ } from "@/components/ui/table";
+ import { internalServices } from "@/services/api/internalServices";
+ import { useReportSocket } from "@/hooks/useReportSocket";
+ import type {
+ ProfitLossDateGroup,
+ ProfitLossMarketRow,
+ const csvRows = useMemo(() => flattenCsvRows(report), [report]);
+ const refetchReport = reportQuery.refetch;
+ 
Removed / Before Commit
- diff --git a/src/routes/user-exposure-bet.tsx b/src/routes/user-exposure-bet.tsx
- deleted file mode 100644
- index 87ea24c..0000000
- import { createFileRoute } from '@tanstack/react-router'
- 
- export const Route = createFileRoute('/user-exposure-bet')({
-   component: RouteComponent,
- })
- 
- function RouteComponent() {
-   return <div>Hello "/user-exposure-bet"!</div>
- }
Added / After Commit
+ diff --git a/src/routes/user-exposure-bet.tsx b/src/routes/user-exposure-bet.tsx
+ deleted file mode 100644
+ index 87ea24c..0000000
Removed / Before Commit
- diff --git a/src/routes/user-exposure-detail.tsx b/src/routes/user-exposure-detail.tsx
- index 6e017de..4f9cdcb 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";
- import { getExposureParams } from "@/lib/nav-params";
- 
- export const Route = createFileRoute("/user-exposure-detail")({
- component: UserExposureDetailPage,
- 
- // ─── Types ────────────────────────────────────────────────────────────────────
- 
- interface DetailRunner { runnerId: string; runnerName: string; exposure: number; exposureProfit: number; }
Added / After Commit
+ diff --git a/src/routes/user-exposure-detail.tsx b/src/routes/user-exposure-detail.tsx
+ index 6e017de..4f9cdcb 100644
+ import { createFileRoute, useNavigate } from "@tanstack/react-router";
+ import { useQuery } from "@tanstack/react-query";
+ import { Fragment, useEffect, useMemo, 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";
+ import { getExposureParams } from "@/lib/nav-params";
+ import { useReportSocket } from "@/hooks/useReportSocket";
+ 
+ export const Route = createFileRoute("/user-exposure-detail")({
+ component: UserExposureDetailPage,
+ 
+ // ─── Types ────────────────────────────────────────────────────────────────────
+ 
Removed / Before Commit
- diff --git a/src/routes/user-listing.tsx b/src/routes/user-listing.tsx
- index e3e0b1d..0609262 100644
- },
- };
- 
- function getStatusColorKey(status: unknown): StatusColorKey {
- const normalized = String(status ?? "")
- .trim()
Added / After Commit
+ diff --git a/src/routes/user-listing.tsx b/src/routes/user-listing.tsx
+ index e3e0b1d..0609262 100644
+ },
+ };
+ 
+ 
+ function getStatusColorKey(status: unknown): StatusColorKey {
+ const normalized = String(status ?? "")
+ .trim()
Removed / Before Commit
- diff --git a/src/routeTree.gen.ts b/src/routeTree.gen.ts
- index 24cab2a..5856f39 100644
- import { Route as UsersRouteImport } from './routes/users'
- import { Route as UserListingRouteImport } from './routes/user-listing'
- import { Route as UserExposureDetailRouteImport } from './routes/user-exposure-detail'
- import { Route as UserExposureBetRouteImport } from './routes/user-exposure-bet'
- import { Route as UploadFilesRouteImport } from './routes/upload-files'
- import { Route as TransferStatementRouteImport } from './routes/transfer-statement'
- import { Route as TransferRouteImport } from './routes/transfer'
- path: '/user-exposure-detail',
- getParentRoute: () => rootRouteImport,
- } as any)
- const UserExposureBetRoute = UserExposureBetRouteImport.update({
-   id: '/user-exposure-bet',
-   path: '/user-exposure-bet',
-   getParentRoute: () => rootRouteImport,
- } as any)
- const UploadFilesRoute = UploadFilesRouteImport.update({
Added / After Commit
+ diff --git a/src/routeTree.gen.ts b/src/routeTree.gen.ts
+ index 24cab2a..5856f39 100644
+ import { Route as UsersRouteImport } from './routes/users'
+ import { Route as UserListingRouteImport } from './routes/user-listing'
+ import { Route as UserExposureDetailRouteImport } from './routes/user-exposure-detail'
+ import { Route as UploadFilesRouteImport } from './routes/upload-files'
+ import { Route as TransferStatementRouteImport } from './routes/transfer-statement'
+ import { Route as TransferRouteImport } from './routes/transfer'
+ path: '/user-exposure-detail',
+ getParentRoute: () => rootRouteImport,
+ } as any)
+ const UploadFilesRoute = UploadFilesRouteImport.update({
+ id: '/upload-files',
+ path: '/upload-files',
+ '/transfer': typeof TransferRoute
+ '/transfer-statement': typeof TransferStatementRoute
+ '/upload-files': typeof UploadFilesRoute
+ '/user-exposure-detail': typeof UserExposureDetailRoute