import { useParams } from 'common' import { ExternalLink, RefreshCw } from 'lucide-react' import Link from 'next/link' import { useQueryState } from 'nuqs' import { useEffect } from 'react' import { Button, cn, CriticalIcon, Separator } from 'ui' import { Admonition, TimestampInfo } from 'ui-patterns' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { UserHeader } from './UserHeader' import { PANEL_PADDING } from './Users.constants' import { LOGS_TABLES } from '@/components/interfaces/Settings/Logs/Logs.constants' import { ButtonTooltip } from '@/components/ui/ButtonTooltip' import { User } from '@/data/auth/users-infinite-query' import useLogsPreview from '@/hooks/analytics/useLogsPreview' import { useLogsUrlState } from '@/hooks/analytics/useLogsUrlState' interface UserLogsProps { user: User } const API_LOGS_QUERY = (userId: string) => `select\n cast(timestamp as datetime) as timestamp,\n event_message, metadata \nfrom edge_logs \nWHERE (\n metadata[SAFE_OFFSET(0)].request[SAFE_OFFSET(0)].sb[SAFE_OFFSET(0)].auth_user\n = '${userId}'\n)\nlimit 100` export const UserLogs = ({ user }: UserLogsProps) => { const { ref } = useParams() const { filters, setFilters } = useLogsUrlState() const [, setFiltersValue] = useQueryState('f') const { logData: authLogs, isSuccess: isSuccessAuthLogs, isLoading: isLoadingAuthLogs, refresh, } = useLogsPreview({ projectRef: ref as string, table: LOGS_TABLES.auth, filterOverride: { search_query: user.id }, limit: 5, }) useEffect(() => { if (user.id) setFilters({ ...filters, search_query: user.id }) return () => { setFiltersValue(null) } // eslint-disable-next-line react-hooks/exhaustive-deps }, [user.id]) return (

API logs

View edge logs for requests made by this user

Authentication logs

Latest logs from authentication for this user in the past hour

{/* [Joshen] This whole thing here i reckon we can shift to a component, if in the future we wanna add more user logs */}
{isLoadingAuthLogs && !isSuccessAuthLogs ? ( ) : authLogs.length === 0 ? ( ) : (
{authLogs.map((log) => { const status = ((log.status ?? '-') as any).toString() const is400 = status.startsWith('4') const is500 = status.startsWith('5') return (

{(is400 || is500) && ( )} {status}

{`${log.path} | ${log.msg}`}

) })}
)}
) }