import { useState } from 'preact/hooks'; import { RefreshCw, ShieldCheck, ShieldX } from 'lucide-preact'; import LoadingState from '@/components/LoadingState'; import type { AuthRequest } from '@/lib/types'; import { t } from '@/lib/i18n'; interface PendingAuthRequestsPanelProps { pendingAuthRequests: AuthRequest[]; pendingAuthRequestsLoading: boolean; onRefreshPendingAuthRequests: () => Promise; onApproveAuthRequest: (request: AuthRequest) => Promise; onDenyAuthRequest: (request: AuthRequest) => Promise; className?: string; loadingVariant?: 'placeholder' | 'compact'; } function formatDateTime(value: string | null | undefined): string { if (!value) return t('txt_dash'); const date = new Date(value); return Number.isNaN(date.getTime()) ? t('txt_dash') : date.toLocaleString(); } export default function PendingAuthRequestsPanel(props: PendingAuthRequestsPanelProps) { const [authRequestSubmittingId, setAuthRequestSubmittingId] = useState(null); async function approveAuthRequest(authRequest: AuthRequest): Promise { if (authRequestSubmittingId) return; setAuthRequestSubmittingId(authRequest.id); try { await props.onApproveAuthRequest(authRequest); } finally { setAuthRequestSubmittingId(null); } } async function denyAuthRequest(authRequest: AuthRequest): Promise { if (authRequestSubmittingId) return; setAuthRequestSubmittingId(authRequest.id); try { await props.onDenyAuthRequest(authRequest); } finally { setAuthRequestSubmittingId(null); } } return (

{t('txt_pending_device_logins')}

{props.pendingAuthRequestsLoading && props.pendingAuthRequests.length === 0 ? ( props.loadingVariant === 'compact' ? ( ) : (
{t('txt_loading')}
) ) : props.pendingAuthRequests.length === 0 ? (
{t('txt_no_pending_device_logins')}
) : ( props.pendingAuthRequests.map((authRequest) => (
{authRequest.requestDeviceType || t('txt_unknown_device')} {authRequest.requestDeviceIdentifier} {t('txt_created_value', { value: formatDateTime(authRequest.creationDate) })}
{authRequest.fingerprintPhrase || t('txt_dash')}
)) )}
); }