Skip to content

Commit a693eaf

Browse files
committed
fix
1 parent 34ef345 commit a693eaf

File tree

2 files changed

+31
-39
lines changed

2 files changed

+31
-39
lines changed

apps/web/src/components/incident-categories-table.tsx

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,13 @@ interface IncidentType {
1616

1717
interface IncidentCategoriesTableProps {
1818
data: IncidentType[]
19-
onPageChange: (page: number) => void
2019
page: number
20+
onPageChange: (page: number) => void
2121
pageSize: number
22+
isLoading: boolean
2223
}
2324

24-
export default function IncidentCategoriesTable({ data, onPageChange, page, pageSize }: IncidentCategoriesTableProps) {
25+
export default function IncidentCategoriesTable({ data, onPageChange, page, pageSize, isLoading }: IncidentCategoriesTableProps) {
2526
const [sortConfig, setSortConfig] = useState<{
2627
key: keyof IncidentType
2728
direction: 'asc' | 'desc'
@@ -78,15 +79,23 @@ export default function IncidentCategoriesTable({ data, onPageChange, page, page
7879
</TableRow>
7980
</TableHeader>
8081
<TableBody>
81-
{sortedData.map((item) => (
82-
<TableRow key={`${item.title}-${item.cloud}-${item.cluster}`}>
83-
<TableCell className="truncate max-w-[300px]">{item.title}</TableCell>
84-
<TableCell className="truncate max-w-[100px]">{item.cloud}</TableCell>
85-
<TableCell className="truncate max-w-[150px]">{item.cluster}</TableCell>
86-
<TableCell className="text-right">{item.total_incidents}</TableCell>
87-
<TableCell className="text-right">{parseInt(formatPercentage(item.high_urgency_incidents / item.total_incidents * 100))}%</TableCell>
82+
{isLoading ? (
83+
<TableRow>
84+
<TableCell colSpan={5} className="text-center">
85+
Loading...
86+
</TableCell>
8887
</TableRow>
89-
))}
88+
) : (
89+
sortedData.map((item) => (
90+
<TableRow key={`${item.title}-${item.cloud}-${item.cluster}`}>
91+
<TableCell className="truncate max-w-[300px]">{item.title}</TableCell>
92+
<TableCell className="truncate max-w-[100px]">{item.cloud}</TableCell>
93+
<TableCell className="truncate max-w-[150px]">{item.cluster}</TableCell>
94+
<TableCell className="text-right">{item.total_incidents}</TableCell>
95+
<TableCell className="text-right">{parseInt(formatPercentage(item.high_urgency_incidents / item.total_incidents * 100))}%</TableCell>
96+
</TableRow>
97+
))
98+
)}
9099
</TableBody>
91100
</Table>
92101
</CardContent>

apps/web/src/components/tools/pagerduty/dashboard.tsx

Lines changed: 12 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"use client"
22

33
import { useQueryState } from 'nuqs'
4-
import { useState, useEffect } from 'react'
4+
import { useState, useEffect, useCallback } from 'react'
55
import { pipe } from '@/lib/tinybird'
66
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
77
import { formatDuration, formatNumber, formatPercentage } from '@/lib/utils'
@@ -63,13 +63,9 @@ export default function PagerDutyDashboard() {
6363
const [page, setPage] = useState(0)
6464
const pageSize = 10
6565
const [incidentTypes, setIncidentTypes] = useState<IncidentType[]>([])
66-
const [services, setServices] = useState<Array<{
67-
service_name: string
68-
service_id: string
69-
}>>([])
7066
const [selectedService, setSelectedService] = useState<string>()
7167

72-
const fetchIncidentTypes = async (newPage: number) => {
68+
const fetchIncidentTypes = useCallback(async (newPage: number) => {
7369
if (!token) return
7470
setIsTableLoading(true)
7571
try {
@@ -90,22 +86,14 @@ export default function PagerDutyDashboard() {
9086
} finally {
9187
setIsTableLoading(false)
9288
}
93-
}
89+
}, [token, dateRange.from, dateRange.to, selectedService, pageSize])
9490

9591
const handlePageChange = async (newPage: number) => {
9692
setPage(newPage)
9793
await fetchIncidentTypes(newPage)
9894
}
9995

100-
useEffect(() => {
101-
fetchMetrics()
102-
}, [token, dateRange.from, dateRange.to, selectedService])
103-
104-
useEffect(() => {
105-
fetchIncidentTypes(page)
106-
}, [token, dateRange.from, dateRange.to, selectedService, page])
107-
108-
const fetchMetrics = async () => {
96+
const fetchMetrics = useCallback(async () => {
10997
if (!token) return
11098
setIsLoading(true)
11199
try {
@@ -182,27 +170,21 @@ export default function PagerDutyDashboard() {
182170
} finally {
183171
setIsLoading(false)
184172
}
185-
}
173+
}, [token, dateRange.from, dateRange.to, selectedService])
186174

187-
const fetchServices = async () => {
188-
if (!token) return
189-
try {
190-
const servicesData = await pipe(token, 'pagerduty_services')
191-
setServices(servicesData.data)
192-
} catch (error) {
193-
console.error('Failed to fetch services:', error)
194-
}
195-
}
175+
useEffect(() => {
176+
fetchMetrics()
177+
}, [fetchMetrics])
196178

197179
useEffect(() => {
198-
fetchServices()
199-
}, [token])
180+
fetchIncidentTypes(page)
181+
}, [fetchIncidentTypes, page])
200182

201183
return (
202184
<div className="space-y-8">
203185
<div className="flex justify-end items-center gap-4">
204186
<Filter
205-
token={token}
187+
token={token || ''}
206188
pipeName="pagerduty_services"
207189
label="Service"
208190
value={selectedService}
@@ -319,6 +301,7 @@ export default function PagerDutyDashboard() {
319301
page={page}
320302
onPageChange={handlePageChange}
321303
pageSize={pageSize}
304+
isLoading={isTableLoading}
322305
/>
323306
</div>
324307
</div>

0 commit comments

Comments
 (0)