import React, { useState } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { frpcApi } from '../api/client'; import { Server, Play, Square, RotateCcw, RefreshCw, FileText, Activity } from 'lucide-react'; import { toast } from 'react-hot-toast'; const ServerStatus: React.FC = () => { const [logsLines, setLogsLines] = useState(50); const queryClient = useQueryClient(); const { data: frpcStatus, isLoading: statusLoading } = useQuery({ queryKey: ['frpc-status'], queryFn: frpcApi.getStatus, refetchInterval: 3000, }); const { data: logs, isLoading: logsLoading } = useQuery({ queryKey: ['frpc-logs', logsLines], queryFn: () => frpcApi.getLogs(logsLines), refetchInterval: 5000, }); const startMutation = useMutation({ mutationFn: frpcApi.start, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['frpc-status'] }); toast.success('FRPC service started'); }, onError: (error) => { console.error('Start error:', error); toast.error('Failed to start FRPC service'); }, }); const stopMutation = useMutation({ mutationFn: frpcApi.stop, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['frpc-status'] }); toast.success('FRPC service stopped'); }, onError: (error) => { console.error('Stop error:', error); toast.error('Failed to stop FRPC service'); }, }); const restartMutation = useMutation({ mutationFn: frpcApi.restart, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['frpc-status'] }); toast.success('FRPC service restarted'); }, onError: (error) => { console.error('Restart error:', error); toast.error('Failed to restart FRPC service'); }, }); const regenerateMutation = useMutation({ mutationFn: frpcApi.regenerate, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['frpc-status'] }); toast.success('FRPC configuration regenerated'); }, onError: (error) => { console.error('Regenerate error:', error); toast.error('Failed to regenerate FRPC configuration'); }, }); const handleStart = () => startMutation.mutate(); const handleStop = () => stopMutation.mutate(); const handleRestart = () => restartMutation.mutate(); const handleRegenerate = () => regenerateMutation.mutate(); const isLoading = statusLoading || logsLoading; const isAnyMutationPending = startMutation.isPending || stopMutation.isPending || restartMutation.isPending || regenerateMutation.isPending; return (
{logs?.logs || 'No logs available'}
)}
Fast Reverse Proxy Client for tunneling services
Status: {frpcStatus?.running ? 'Active' : 'Inactive'}
RESTful API for managing tunnel configurations
Status: Running
Tunnel configurations stored in SQLite database
Auto-generated FRPC config from active tunnels