fix: remove incorrect .data wrapper — backend returns arrays directly

All pages expected API responses in { data: [], total } format but
backend APIs return plain arrays. Changed data?.data ?? [] to data ?? []
across 22 page components.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-03-02 09:47:22 -08:00
parent d21f41d7c3
commit 10e0b0ce29
22 changed files with 33 additions and 36 deletions

View File

@ -338,7 +338,7 @@ export default function HooksPage() {
queryFn: () => apiClient<HooksResponse>('/api/v1/agent/hooks'), queryFn: () => apiClient<HooksResponse>('/api/v1/agent/hooks'),
}); });
const hooks = data?.data ?? []; const hooks = data?? [];
// Mutations ------------------------------------------------------------ // Mutations ------------------------------------------------------------
const createMutation = useMutation({ const createMutation = useMutation({

View File

@ -323,7 +323,7 @@ export default function SkillsPage() {
queryFn: () => apiClient<SkillsResponse>('/api/v1/agent/skills'), queryFn: () => apiClient<SkillsResponse>('/api/v1/agent/skills'),
}); });
const skills = data?.data ?? []; const skills = data?? [];
// Mutations ------------------------------------------------------------ // Mutations ------------------------------------------------------------
const createMutation = useMutation({ const createMutation = useMutation({

View File

@ -83,7 +83,7 @@ export default function AuditLogsPage() {
queryFn: () => apiClient<AuditLogsResponse>(`/api/v1/audit/logs?${queryString}`), queryFn: () => apiClient<AuditLogsResponse>(`/api/v1/audit/logs?${queryString}`),
}); });
const logs = data?.data ?? []; const logs = data?? [];
const total = data?.total ?? 0; const total = data?.total ?? 0;
const totalPages = Math.max(1, Math.ceil(total / pageSize)); const totalPages = Math.max(1, Math.ceil(total / pageSize));

View File

@ -192,7 +192,7 @@ export default function SessionReplayPage() {
), ),
}); });
const sessions = sessionsData?.data ?? []; const sessions = sessionsData?? [];
const total = sessionsData?.total ?? 0; const total = sessionsData?.total ?? 0;
// Fetch session events when a session is selected // Fetch session events when a session is selected
@ -209,7 +209,7 @@ export default function SessionReplayPage() {
enabled: !!selectedSessionId, enabled: !!selectedSessionId,
}); });
const events = eventsData?.data ?? []; const events = eventsData?? [];
const selectedSession = sessions.find((s) => s.id === selectedSessionId) ?? null; const selectedSession = sessions.find((s) => s.id === selectedSessionId) ?? null;
// Reset playback when selecting a new session // Reset playback when selecting a new session

View File

@ -178,7 +178,7 @@ function ChannelsTab() {
onSuccess: () => queryClient.invalidateQueries({ queryKey: queryKeys.channels.all }), onSuccess: () => queryClient.invalidateQueries({ queryKey: queryKeys.channels.all }),
}); });
const channels = data?.data ?? []; const channels = data?? [];
if (isLoading) return <p className="text-muted-foreground">{tc('loading')}</p>; if (isLoading) return <p className="text-muted-foreground">{tc('loading')}</p>;
if (error) return <p className="text-red-500">{tc('error')}: {(error as Error).message}</p>; if (error) return <p className="text-red-500">{tc('error')}: {(error as Error).message}</p>;
@ -320,7 +320,7 @@ function ContactsTab() {
onSuccess: () => queryClient.invalidateQueries({ queryKey: queryKeys.contacts.all }), onSuccess: () => queryClient.invalidateQueries({ queryKey: queryKeys.contacts.all }),
}); });
const contacts = data?.data ?? []; const contacts = data?? [];
const handleOpenAdd = () => { const handleOpenAdd = () => {
setEditingContact(null); setEditingContact(null);
@ -533,7 +533,7 @@ function EscalationPoliciesTab() {
queryFn: () => apiClient<PaginatedResponse<Contact>>('/api/v1/comm/contacts'), queryFn: () => apiClient<PaginatedResponse<Contact>>('/api/v1/comm/contacts'),
}); });
const contacts = contactsData?.data ?? []; const contacts = contactsData?? [];
const createMutation = useMutation({ const createMutation = useMutation({
mutationFn: (body: Omit<EscalationPolicy, 'id'>) => mutationFn: (body: Omit<EscalationPolicy, 'id'>) =>
@ -556,7 +556,7 @@ function EscalationPoliciesTab() {
onSuccess: () => queryClient.invalidateQueries({ queryKey: queryKeys.escalationPolicies.all }), onSuccess: () => queryClient.invalidateQueries({ queryKey: queryKeys.escalationPolicies.all }),
}); });
const policies = data?.data ?? []; const policies = data?? [];
return ( return (
<div> <div>

View File

@ -293,7 +293,7 @@ export default function AlertRuleDetailPage() {
enabled: !!id, enabled: !!id,
}); });
const alertEvents = eventsData?.data ?? []; const alertEvents = eventsData?? [];
// Mutations ------------------------------------------------------------ // Mutations ------------------------------------------------------------
const updateMutation = useMutation({ const updateMutation = useMutation({

View File

@ -462,7 +462,7 @@ export default function AlertRulesPage() {
queryFn: () => apiClient<AlertRulesResponse>('/api/v1/monitor/alerts/rules'), queryFn: () => apiClient<AlertRulesResponse>('/api/v1/monitor/alerts/rules'),
}); });
const rules = data?.data ?? []; const rules = data?? [];
// Mutations ------------------------------------------------------------ // Mutations ------------------------------------------------------------
const createMutation = useMutation({ const createMutation = useMutation({

View File

@ -180,7 +180,7 @@ export default function HealthChecksPage() {
queryFn: () => apiClient<HealthChecksResponse>('/api/v1/monitor/health-checks'), queryFn: () => apiClient<HealthChecksResponse>('/api/v1/monitor/health-checks'),
}); });
const allChecks = data?.data ?? []; const allChecks = data?? [];
const filteredChecks = useMemo(() => { const filteredChecks = useMemo(() => {
if (statusFilter === 'all') return allChecks; if (statusFilter === 'all') return allChecks;

View File

@ -255,7 +255,7 @@ export default function MetricsPage() {
queryFn: () => apiClient<ServerMetricsResponse>('/api/v1/monitor/metrics/servers'), queryFn: () => apiClient<ServerMetricsResponse>('/api/v1/monitor/metrics/servers'),
}); });
const allServers = serversData?.data ?? []; const allServers = serversData?? [];
// Auto-refresh --------------------------------------------------------- // Auto-refresh ---------------------------------------------------------
useEffect(() => { useEffect(() => {

View File

@ -272,7 +272,7 @@ export default function RunbookDetailPage() {
enabled: !!id, enabled: !!id,
}); });
const executions = executionsData?.data ?? []; const executions = executionsData?? [];
// Mutations -------------------------------------------------------------- // Mutations --------------------------------------------------------------
const updateMutation = useMutation({ const updateMutation = useMutation({

View File

@ -471,7 +471,7 @@ export default function CredentialsPage() {
apiClient<CredentialsResponse>('/api/v1/inventory/credentials'), apiClient<CredentialsResponse>('/api/v1/inventory/credentials'),
}); });
const credentials = data?.data ?? []; const credentials = data?? [];
// Mutations ------------------------------------------------------------ // Mutations ------------------------------------------------------------
const createMutation = useMutation({ const createMutation = useMutation({

View File

@ -415,14 +415,14 @@ export default function RiskRulesPage() {
queryFn: () => apiClient<RiskRulesResponse>('/api/v1/agent/risk-rules'), queryFn: () => apiClient<RiskRulesResponse>('/api/v1/agent/risk-rules'),
}); });
const rules = rulesData?.data ?? []; const rules = rulesData?? [];
// Queries - permissions matrix ----------------------------------------- // Queries - permissions matrix -----------------------------------------
const { isLoading: matrixLoading } = useQuery({ const { isLoading: matrixLoading } = useQuery({
queryKey: queryKeys.permissions.matrix(), queryKey: queryKeys.permissions.matrix(),
queryFn: () => apiClient<PermissionMatrix>('/api/v1/agent/permissions'), queryFn: () => apiClient<PermissionMatrix>('/api/v1/agent/permissions'),
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
select: (data: any) => data?.data ?? data, select: (data: any) => data,
placeholderData: DEFAULT_MATRIX, placeholderData: DEFAULT_MATRIX,
}); });

View File

@ -349,7 +349,7 @@ export default function RolesPage() {
queryFn: () => apiClient<RolesResponse>('/api/v1/auth/roles'), queryFn: () => apiClient<RolesResponse>('/api/v1/auth/roles'),
}); });
const roles = rolesData?.data ?? []; const roles = rolesData?? [];
// Fetch all permissions (for checkbox lists) // Fetch all permissions (for checkbox lists)
const { data: allPermsData } = useQuery({ const { data: allPermsData } = useQuery({
@ -357,7 +357,7 @@ export default function RolesPage() {
queryFn: () => apiClient<PermissionsListResponse>('/api/v1/auth/permissions'), queryFn: () => apiClient<PermissionsListResponse>('/api/v1/auth/permissions'),
}); });
const allPermissions = allPermsData?.data ?? []; const allPermissions = allPermsData?? [];
// Fetch permissions for expanded role // Fetch permissions for expanded role
const { data: rolePermsData, isLoading: rolePermsLoading } = useQuery({ const { data: rolePermsData, isLoading: rolePermsLoading } = useQuery({
@ -369,7 +369,7 @@ export default function RolesPage() {
enabled: !!expandedRoleId, enabled: !!expandedRoleId,
}); });
const rolePermissions = rolePermsData?.data ?? []; const rolePermissions = rolePermsData?? [];
// Mutations ------------------------------------------------------------ // Mutations ------------------------------------------------------------
const createMutation = useMutation({ const createMutation = useMutation({

View File

@ -288,8 +288,8 @@ export default function ServerDetailPage() {
enabled: !!id, enabled: !!id,
}); });
const healthChecks = healthData?.data ?? []; const healthChecks = healthData?? [];
const recentCommands = commandsData?.data ?? []; const recentCommands = commandsData?? [];
// Mutations ------------------------------------------------------------ // Mutations ------------------------------------------------------------
const updateMutation = useMutation({ const updateMutation = useMutation({

View File

@ -378,7 +378,7 @@ export default function ClustersPage() {
queryFn: () => apiClient<ClustersResponse>('/api/v1/inventory/clusters'), queryFn: () => apiClient<ClustersResponse>('/api/v1/inventory/clusters'),
}); });
const clusters = data?.data ?? []; const clusters = data?? [];
// Fetch servers for the dialog server selection // Fetch servers for the dialog server selection
const { data: serversData, isLoading: serversLoading } = useQuery({ const { data: serversData, isLoading: serversLoading } = useQuery({
@ -387,7 +387,7 @@ export default function ClustersPage() {
enabled: dialogOpen, enabled: dialogOpen,
}); });
const servers = serversData?.data ?? []; const servers = serversData?? [];
// Mutations ------------------------------------------------------------ // Mutations ------------------------------------------------------------
const createMutation = useMutation({ const createMutation = useMutation({

View File

@ -33,10 +33,7 @@ interface ServerFormData {
description: string; description: string;
} }
interface ServersResponse { type ServersResponse = Server[];
data: Server[];
total: number;
}
type EnvironmentFilter = 'all' | 'dev' | 'staging' | 'prod'; type EnvironmentFilter = 'all' | 'dev' | 'staging' | 'prod';
@ -324,7 +321,7 @@ export default function ServersPage() {
}, },
}); });
const servers = data?.data ?? []; const servers = data ?? [];
// Mutations ------------------------------------------------------------ // Mutations ------------------------------------------------------------
const createMutation = useMutation({ const createMutation = useMutation({

View File

@ -280,8 +280,8 @@ export default function SessionDetailPage() {
enabled: !!id, enabled: !!id,
}); });
const events = eventsData?.data ?? []; const events = eventsData?? [];
const tasks = tasksData?.data ?? []; const tasks = tasksData?? [];
// Auto-scroll to bottom when new events arrive // Auto-scroll to bottom when new events arrive
useEffect(() => { useEffect(() => {

View File

@ -475,7 +475,7 @@ export default function StandingOrderDetailPage() {
enabled: !!id, enabled: !!id,
}); });
const executions = executionsData?.data ?? []; const executions = executionsData?? [];
const totalExecutions = executionsData?.total ?? 0; const totalExecutions = executionsData?.total ?? 0;
const totalPages = Math.ceil(totalExecutions / PAGE_SIZE); const totalPages = Math.ceil(totalExecutions / PAGE_SIZE);

View File

@ -255,7 +255,7 @@ export default function TenantDetailPage() {
enabled: !!id, enabled: !!id,
}); });
const members = membersData?.data ?? []; const members = membersData?? [];
const { data: invites = [] } = useQuery({ const { data: invites = [] } = useQuery({
queryKey: queryKeys.tenants.invites(id), queryKey: queryKeys.tenants.invites(id),

View File

@ -136,7 +136,7 @@ export default function TerminalPage() {
queryFn: () => apiClient<ServersResponse>('/api/v1/inventory/servers'), queryFn: () => apiClient<ServersResponse>('/api/v1/inventory/servers'),
}); });
const servers = serversData?.data ?? []; const servers = serversData?? [];
// ---- Auto-scroll ---- // ---- Auto-scroll ----
useEffect(() => { useEffect(() => {

View File

@ -361,7 +361,7 @@ export default function UserDetailPage() {
enabled: !!id, enabled: !!id,
}); });
const activityLog = activityData?.data ?? []; const activityLog = activityData?? [];
// Mutations ------------------------------------------------------------ // Mutations ------------------------------------------------------------
const updateMutation = useMutation({ const updateMutation = useMutation({

View File

@ -487,7 +487,7 @@ export default function UsersPage() {
queryFn: () => apiClient<UsersResponse>('/api/v1/auth/users'), queryFn: () => apiClient<UsersResponse>('/api/v1/auth/users'),
}); });
const allUsers = usersData?.data ?? []; const allUsers = usersData?? [];
// Filter --------------------------------------------------------------- // Filter ---------------------------------------------------------------
const filteredUsers = useMemo(() => { const filteredUsers = useMemo(() => {