import React, { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { ipc } from '@/ipc/manager'; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { useToast } from '@/components/ui/use-toast'; import { Loader2, Play, RefreshCw, Clock, AlertCircle, CheckCircle } from 'lucide-react'; interface ReplayEntry { id: string; timestamp: number; method: string; endpoint: string; status?: number; duration?: number; body?: unknown; } export const ReplayTab: React.FC = () => { const { t } = useTranslation(); const { toast } = useToast(); const queryClient = useQueryClient(); const [selectedRequestId, setSelectedRequestId] = useState(null); const { data: requestsData, isLoading: requestsLoading, refetch: refetchRequests, } = useQuery({ queryKey: ['proxyAdvanced', 'recentRequests'], queryFn: () => ipc.client.proxyAdvanced.getRecentRequests(), refetchInterval: 10000, }); const replayMutation = useMutation({ mutationFn: (requestId: string) => ipc.client.proxyAdvanced.replayRequest({ requestId }), onSuccess: (data) => { if (data.success) { toast({ title: t('proxy.advanced.replay.success'), description: t('proxy.advanced.replay.replayedSuccessfully'), }); } else { toast({ title: t('proxy.advanced.replay.error'), description: data.error || t('proxy.advanced.replay.unknownError'), variant: 'destructive', }); } setSelectedRequestId(null); }, onError: (error) => { toast({ title: t('proxy.advanced.replay.error'), description: error instanceof Error ? error.message : t('proxy.advanced.replay.unknownError'), variant: 'destructive', }); setSelectedRequestId(null); }, }); const requests: ReplayEntry[] = requestsData?.success ? (requestsData.data as ReplayEntry[]) : []; const handleReplay = (requestId: string) => { setSelectedRequestId(requestId); replayMutation.mutate(requestId); }; const formatTimestamp = (timestamp: number): string => { return new Date(timestamp).toLocaleTimeString(); }; const getStatusBadge = (status?: number) => { if (!status) return {t('proxy.advanced.replay.pending')}; if (status >= 200 && status < 300) { return ( {status} ); } if (status >= 400) { return ( {status} ); } return {status}; }; return (
{/* Header */}

{t('proxy.advanced.replay.title')}

{t('proxy.advanced.replay.description')}

{/* Requests List */} {t('proxy.advanced.replay.recentRequests')} {t('proxy.advanced.replay.clickToReplay')} {requestsLoading ? (
) : requests.length === 0 ? (

{t('proxy.advanced.replay.noRequests')}

) : (
{requests.map((request) => (
{getStatusBadge(request.status)}
{request.method} {request.endpoint} {formatTimestamp(request.timestamp)} {request.duration && ` ยท ${request.duration}ms`}
))}
)}
); };