import { useEffect, useState } from 'react'; import type { NativeApi } from '@api/native'; import { Button } from '@components/ui/button'; import type { NativeAuditEvent } from '@typings/native'; export function NativeAuditLog({ api, onError }: { api: NativeApi; onError: (value: unknown) => void }) { const [items, setItems] = useState([]); const [loading, setLoading] = useState(true); const [refresh, setRefresh] = useState(0); useEffect(() => { const controller = new AbortController(); setLoading(true); void api.audit(controller.signal).then(result => { if (!controller.signal.aborted) setItems(result.items); }).catch(value => { if (!controller.signal.aborted) onError(value); }) .finally(() => { if (!controller.signal.aborted) setLoading(false); }); return () => controller.abort(); }, [api, refresh, onError]); return

认证、API key 与管理操作的服务端审计记录

{loading ?

正在读取审计记录…

: items.length === 0 ?

暂无审计记录

:
    {items.map(item =>
  1. {item.event}

    操作者:{item.actor || '匿名 / 系统'}{item.profile_id ? ` · Profile:${item.profile_id}` : ''}

    {item.detail != null &&
    {typeof item.detail === 'string' ? item.detail : JSON.stringify(item.detail, null, 2)}
    }
  2. )}
}
; }