11"use client"
22
33import { useQueryState } from 'nuqs'
4- import { useEffect , useState } from 'react'
4+ import { useEffect , useState , useCallback } from 'react'
55import { pipe } from '@/lib/tinybird'
66import MetricCard from './metric'
77import { 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