import React from 'react'; import superagent from 'superagent'; import { Table, Message, Loader, Label } from 'semantic-ui-react'; /** * Audit log viewer for a single OAuth client. Paged. */ export default class OAuthAuditLog extends React.Component { constructor(props) { super(props); this.state = { loading: true, events: [], error: null }; } async componentDidMount() { if (!this.props.uniqueId) return; try { const res = await superagent .get(`/api/admin/oauth/clients/${this.props.uniqueId}/audit`) .query({ limit: 200 }) .accept('json'); this.setState({ events: res.body.events || [], loading: false }); } catch (e) { this.setState({ error: e.response?.body?.message || e.message, loading: false }); } } eventColor(eventType) { if (eventType.includes('failure') || eventType.includes('denied') || eventType.includes('reuse')) return 'red'; if (eventType === 'client_disabled' || eventType === 'client_deleted' || eventType.includes('revoked')) return 'orange'; if (eventType === 'client_created' || eventType === 'client_enabled') return 'green'; return 'grey'; } render() { const { loading, events, error } = this.state; if (loading) return Loading audit log…; if (error) return {error}; if (events.length === 0) return No audit events yet.; return ( When Event Actor IP Details {events.map(ev => ( {new Date(ev.at).toLocaleString()} {ev.actorAccountId || '—'} {ev.ip || '—'}
                                    {ev.details ? JSON.stringify(ev.details, null, 0) : ''}
                                
))}
); } }