Skip to content

Commit e8df2d7

Browse files
committed
add table filters
1 parent 715f506 commit e8df2d7

File tree

3 files changed

+302
-56
lines changed

3 files changed

+302
-56
lines changed

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

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

33
import { useQueryState } from 'nuqs'
4-
import { useEffect, useState } from 'react'
4+
import { useEffect, useState, useCallback } from 'react'
55
import { pipe } from '@/lib/tinybird'
66
import MetricCard from './metric'
77
import { DauChart, DauDataPoint } from './dau-chart'
@@ -102,6 +102,17 @@ export default function Auth0Dashboard() {
102102
const [timeRange, setTimeRange] = useState<'hourly' | 'daily' | 'monthly'>('daily')
103103
const [userRetentionData, setUserRetentionData] = useState<UserRetentionDataPoint[]>([])
104104
const [logs, setLogs] = useState<LogEntry[]>([])
105+
const [logsPage, setLogsPage] = useState(0)
106+
const [isLoading, setIsLoading] = useState(false)
107+
const [logsFilters, setLogsFilters] = useState({
108+
eventType: 'all',
109+
connection: 'all',
110+
clientName: 'all'
111+
})
112+
const [logsDateRange, setLogsDateRange] = useState<DateRange>({
113+
from: startOfDay(new Date(new Date().setDate(new Date().getDate() - 7))),
114+
to: endOfDay(new Date())
115+
})
105116

106117
useEffect(() => {
107118
async function fetchInitialData() {
@@ -131,27 +142,27 @@ export default function Auth0Dashboard() {
131142

132143
async function fetchMetrics() {
133144
if (!token) return
145+
setIsLoading(true)
146+
try {
147+
const fromDate = format(dateRange.from, "yyyy-MM-dd HH:mm:ss")
148+
const toDate = format(dateRange.to, "yyyy-MM-dd HH:mm:ss")
149+
const thirtyDaysAgo = format(subDays(new Date(), 30), "yyyy-MM-dd HH:mm:ss")
134150

135-
const fromDate = format(dateRange.from, "yyyy-MM-dd HH:mm:ss")
136-
const toDate = format(dateRange.to, "yyyy-MM-dd HH:mm:ss")
137-
const thirtyDaysAgo = format(subDays(new Date(), 30), "yyyy-MM-dd HH:mm:ss")
138-
139-
const params = {
140-
date_from: fromDate,
141-
date_to: toDate,
142-
time_range: timeRange,
143-
...(selectedApp !== 'all' && { client_id: selectedApp }),
144-
...(selectedConnection !== 'all' && { connection_id: selectedConnection })
145-
}
151+
const params = {
152+
date_from: fromDate,
153+
date_to: toDate,
154+
time_range: timeRange,
155+
...(selectedApp !== 'all' && { client_id: selectedApp }),
156+
...(selectedConnection !== 'all' && { connection_id: selectedConnection })
157+
}
146158

147-
const thirtyDayParams = {
148-
date_from: thirtyDaysAgo,
149-
time_range: timeRange,
150-
...(selectedApp !== 'all' && { client_id: selectedApp }),
151-
...(selectedConnection !== 'all' && { connection_id: selectedConnection })
152-
}
159+
const thirtyDayParams = {
160+
date_from: thirtyDaysAgo,
161+
time_range: timeRange,
162+
...(selectedApp !== 'all' && { client_id: selectedApp }),
163+
...(selectedConnection !== 'all' && { connection_id: selectedConnection })
164+
}
153165

154-
try {
155166
const [
156167
usersResult,
157168
applicationsResult,
@@ -190,10 +201,12 @@ export default function Auth0Dashboard() {
190201
pipe<{ data: DailySignupsDataPoint[] }>(token, 'auth0_daily_signups', params),
191202
pipe<{ data: DailyLoginFailsDataPoint[] }>(token, 'auth0_daily_login_fails', params),
192203
pipe<{ data: LogEntry[] }>(token, 'auth0_logs', {
193-
date_from: fromDate,
194-
date_to: toDate,
195-
...(selectedApp !== 'all' && { client_id: selectedApp }),
196-
...(selectedConnection !== 'all' && { connection_id: selectedConnection })
204+
page: logsPage,
205+
date_from: format(logsDateRange.from, "yyyy-MM-dd HH:mm:ss"),
206+
date_to: format(logsDateRange.to, "yyyy-MM-dd HH:mm:ss"),
207+
...(logsFilters.eventType !== 'all' && { event_type: logsFilters.eventType }),
208+
...(logsFilters.connection !== 'all' && { connection: logsFilters.connection }),
209+
...(logsFilters.clientName !== 'all' && { client_name: logsFilters.clientName })
197210
})
198211
])
199212

@@ -215,14 +228,40 @@ export default function Auth0Dashboard() {
215228
setLogs(logsResult?.data ?? [])
216229
} catch (error) {
217230
console.error('Failed to fetch metrics:', error)
231+
} finally {
232+
setIsLoading(false)
218233
}
219234
}
220235

221236
fetchMetrics()
222237
return () => {
223238
mounted = false
224239
}
225-
}, [token, dateRange.from, dateRange.to, dateRange.compareMode, selectedApp, selectedConnection, timeRange])
240+
}, [token, dateRange.from, dateRange.to, dateRange.compareMode, selectedApp, selectedConnection, timeRange, logsPage])
241+
242+
const fetchLogs = useCallback(async () => {
243+
if (!token || !logsDateRange?.from || !logsDateRange?.to) return
244+
setIsLoading(true)
245+
try {
246+
const logsResult = await pipe<{ data: LogEntry[] }>(token, 'auth0_logs', {
247+
page: logsPage,
248+
date_from: format(new Date(logsDateRange.from), "yyyy-MM-dd HH:mm:ss"),
249+
date_to: format(new Date(logsDateRange.to), "yyyy-MM-dd HH:mm:ss"),
250+
...(logsFilters.eventType !== 'all' && { event_type: logsFilters.eventType }),
251+
...(logsFilters.connection !== 'all' && { connection: logsFilters.connection }),
252+
...(logsFilters.clientName !== 'all' && { client_name: logsFilters.clientName })
253+
})
254+
setLogs(logsResult?.data ?? [])
255+
} catch (error) {
256+
console.error('Failed to fetch logs:', error)
257+
} finally {
258+
setIsLoading(false)
259+
}
260+
}, [token, logsPage, logsDateRange, logsFilters])
261+
262+
useEffect(() => {
263+
fetchLogs()
264+
}, [logsPage, logsDateRange, logsFilters, fetchLogs])
226265

227266
return (
228267
<div className="space-y-8">
@@ -366,12 +405,30 @@ export default function Auth0Dashboard() {
366405
className="h-[300px]"
367406
/>
368407
</div>
408+
<Separator className="my-6" />
369409
<Card>
370410
<CardHeader>
371411
<CardTitle>Logs</CardTitle>
372412
</CardHeader>
373413
<CardContent>
374-
<LogsTable data={logs} />
414+
<LogsTable
415+
data={logs}
416+
page={logsPage}
417+
dateRange={logsDateRange}
418+
isLoading={isLoading}
419+
connections={connections}
420+
applications={applications}
421+
onPageChange={(newPage) => {
422+
setLogsPage(newPage)
423+
}}
424+
onFiltersChange={(filters) => {
425+
if (filters.dateRange) setLogsDateRange(filters.dateRange)
426+
if (filters.eventType) setLogsFilters(prev => ({ ...prev, eventType: filters.eventType }))
427+
if (filters.connection) setLogsFilters(prev => ({ ...prev, connection: filters.connection }))
428+
if (filters.clientName) setLogsFilters(prev => ({ ...prev, clientName: filters.clientName }))
429+
setLogsPage(0)
430+
}}
431+
/>
375432
</CardContent>
376433
</Card>
377434

0 commit comments

Comments
 (0)