'use client'; import {useCallback, useEffect, useState} from 'react'; import {useRouter, useSearchParams} from 'next/navigation'; import {toast} from 'sonner'; import {Skeleton} from '@/components/ui/skeleton'; import {Tabs, TabsContent, TabsList, TabsTrigger} from '@/components/ui/tabs'; import type {ProxyRouteConfigSection, ProxyRouteItem} from '@/lib/services/openflare'; import {ProxyRouteService} from '@/lib/services/openflare'; import {getProxyRouteConfigSection, proxyRouteConfigSections} from '../components/helpers'; import {AuthSection} from './components/auth-section'; import {CacheSection} from './components/cache-section'; import {DomainSection} from './components/domain-section'; import {LimitsSection} from './components/limits-section'; import {ProxySection} from './components/proxy-section'; import {RouteHeader} from './components/route-header'; import {WafSection} from './components/waf-section'; export function ProxyRouteDetailPageClient() { const router = useRouter(); const searchParams = useSearchParams(); const routeId = Number(searchParams.get('id')); const activeSection = getProxyRouteConfigSection(searchParams.get('section')); const [route, setRoute] = useState(null); const [loading, setLoading] = useState(true); const handleSectionChange = useCallback( (section: ProxyRouteConfigSection) => { const params = new URLSearchParams(searchParams.toString()); params.set('section', section); router.replace(`/openflare/proxy-routes/detail?${params.toString()}`); }, [router, searchParams], ); useEffect(() => { if (!Number.isFinite(routeId) || routeId <= 0) { setLoading(false); setRoute(null); return; } let cancelled = false; const fetchRoute = async () => { setLoading(true); try { const data = await ProxyRouteService.getById(routeId); if (!cancelled) { setRoute(data); } } catch (error) { if (!cancelled) { setRoute(null); toast.error('规则详情加载失败', { description: error instanceof Error ? error.message : '未知错误', }); } } finally { if (!cancelled) { setLoading(false); } } }; void fetchRoute(); return () => { cancelled = true; }; }, [routeId]); if (!Number.isFinite(routeId) || routeId <= 0) { return (

缺少有效的规则 ID。

); } if (loading) { return (
); } if (!route) { return (

未找到对应规则,请返回列表重试。

); } return (
handleSectionChange(value as ProxyRouteConfigSection)} className="w-full" > {proxyRouteConfigSections.map((section) => ( {section.label} ))}
); }