"use client" import { Providers } from '@/components/providers' import { RootLayout } from '@/components/layout' import { Header } from '@/components/header' import { useEffect, useState } from 'react' import { ClientSelector } from '@/components/base/client-selector' import { parseStreaming } from '@/lib/stream' import { Button } from '@/components/ui/button' import { getClientsStatus } from '@/api/platform' import { ClientType } from '@/lib/pb/common' import dynamic from 'next/dynamic' import { BaseSelector } from '@/components/base/selector' import { ServerSelector } from '@/components/base/server-selector' import LoadingCircle from '@/components/base/status' import { useSearchParams } from 'next/navigation' import { useTranslation } from 'react-i18next' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' // import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' import { PlayCircle, StopCircle, RefreshCcw, Eraser } from 'lucide-react' import { cn } from '@/lib/utils' const LogTerminalComponent = dynamic(() => import('@/components/base/readonly-xterm'), { ssr: false }) export default function StreamLogPage() { const { t } = useTranslation(); const [clientID, setClientID] = useState(undefined) const [log, setLog] = useState(undefined) const [clear, setClear] = useState(0) const [enabled, setEnabled] = useState(false) const [timeoutID, setTimeoutID] = useState(null); const [clientType, setClientType] = useState(ClientType.FRPS) const [status, setStatus] = useState<"loading" | "success" | "error" | undefined>() const searchParams = useSearchParams() const paramClientID = searchParams.get('clientID') const paramClientType = searchParams.get('clientType') useEffect(() => { if (paramClientID) { setClientID(paramClientID) } if (paramClientType) { if (paramClientType == ClientType.FRPC.toString()) { setClientType(ClientType.FRPC) } else if (paramClientType == ClientType.FRPS.toString()) { setClientType(ClientType.FRPS) } } if (paramClientID && paramClientType) { setEnabled(true) } }, [paramClientID, paramClientType]) useEffect(() => { setClear(Math.random()) setStatus(undefined) if (!clientID || !enabled) { return; } const abortController = new AbortController(); setStatus("loading"); void parseStreaming( abortController, clientID, setLog, (status: number) => { if (status === 200) { setStatus("success") } else { setStatus("error") } }, () => { console.log("parseStreaming success") setStatus("success") } ); return () => { abortController.abort("unmount"); setEnabled(false); }; }, [clientID, enabled]); const handleConnect = () => { if (enabled) { setEnabled(false) } if (timeoutID) { clearTimeout(timeoutID) } setTimeoutID(setTimeout(() => { setEnabled(true) }, 10)) } const handleRefresh = () => { setClear(Math.random()); if (clientID) { getClientsStatus({ clientIds: [clientID], clientType: clientType }) } } const handleDisconnect = () => { setEnabled(false) setClear(Math.random()); } return ( }>
{ setClientType(value === ClientType.FRPC.toString() ? ClientType.FRPC : ClientType.FRPS) }} value={clientType.toString()} label={t('common.clientType')} className="h-8" />
{clientType === ClientType.FRPC && ( )} {clientType === ClientType.FRPS && ( )}
) }