import { useState } from 'react' import { useQuery } from '@tanstack/react-query' import { Copy, Check, Key, AlertCircle } from 'lucide-react' import { useTranslation } from 'react-i18next' import { Button } from './ui/Button' import { Card, CardContent, CardHeader, CardTitle } from './ui/Card' import { Badge } from './ui/Badge' import { Skeleton } from './ui/Skeleton' import { toast } from '../utils/toast' import client from '../api/client' interface BouncerInfo { name: string key_preview: string key_source: 'env_var' | 'file' | 'none' file_path: string registered: boolean } interface BouncerKeyResponse { key: string source: string } async function fetchBouncerInfo(): Promise { const response = await client.get('/admin/crowdsec/bouncer') return response.data } async function fetchBouncerKey(): Promise { const response = await client.get('/admin/crowdsec/bouncer/key') return response.data.key } export function CrowdSecBouncerKeyDisplay() { const { t, ready } = useTranslation() const [copied, setCopied] = useState(false) const [isCopying, setIsCopying] = useState(false) const { data: info, isLoading, error } = useQuery({ queryKey: ['crowdsec-bouncer-info'], queryFn: fetchBouncerInfo, refetchInterval: 30000, retry: 1, }) const handleCopyKey = async () => { if (isCopying) return setIsCopying(true) try { const key = await fetchBouncerKey() await navigator.clipboard.writeText(key) setCopied(true) toast.success(t('security.crowdsec.keyCopied')) setTimeout(() => setCopied(false), 2000) } catch { toast.error(t('security.crowdsec.copyFailed')) } finally { setIsCopying(false) } } if (!ready || isLoading) { return ( ) } if (error || !info) { return null } if (info.key_source === 'none') { return ( {t('security.crowdsec.noKeyConfigured')} ) } return ( {t('security.crowdsec.bouncerApiKey')}
{info.key_preview}
{info.registered ? t('security.crowdsec.registered') : t('security.crowdsec.notRegistered')} {info.key_source === 'env_var' ? t('security.crowdsec.sourceEnvVar') : t('security.crowdsec.sourceFile')}

{t('security.crowdsec.keyStoredAt')}: {info.file_path}

) }