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 (

Server Status

{frpcStatus?.running ? 'Running' : 'Stopped'}

Service Controls

Service Information

Status: {frpcStatus?.running ? 'Running' : 'Stopped'}
Container: frpc
Last Updated: {new Date().toLocaleString()}

Service Logs

{logsLoading ? (
Loading logs...
) : (
              {logs?.logs || 'No logs available'}
            
)}

System Information

FRPC Service

Fast Reverse Proxy Client for tunneling services

Status: {frpcStatus?.running ? 'Active' : 'Inactive'}

API Server

RESTful API for managing tunnel configurations

Status: Running

Configuration

Tunnel configurations stored in SQLite database

Auto-generated FRPC config from active tunnels

); }; export default ServerStatus;