'use client'; import Link from 'next/link'; import {useMemo, useState} from 'react'; import {useQuery} from '@tanstack/react-query'; import {Globe, Plus, Search} from 'lucide-react'; import {Button} from '@/components/ui/button'; import {Card, CardContent, CardDescription, CardHeader, CardTitle} from '@/components/ui/card'; import {EmptyStateWithBorder} from '@/components/layout/empty'; import {ErrorInline} from '@/components/layout/error'; import {Input} from '@/components/ui/input'; import {LoadingStateWithBorder} from '@/components/layout/loading'; import {ZoneService, zoneQueryKey} from '@/lib/services/openflare'; import {ZoneEditorDialog} from './[zoneId]/components/zone-editor-dialog'; import {getErrorMessage} from './components/website-utils'; export default function WebsitesPage() { const [search, setSearch] = useState(''); const [editorOpen, setEditorOpen] = useState(false); const zonesQuery = useQuery({ queryKey: zoneQueryKey, queryFn: () => ZoneService.list(), }); const zones = useMemo(() => { const keyword = search.trim().toLowerCase(); const list = zonesQuery.data ?? []; if (!keyword) { return list; } return list.filter((zone) => zone.domain.toLowerCase().includes(keyword)); }, [search, zonesQuery.data]); return (

网站

Zone 列表 以可注册根域组织网站,并在详情中维护明确 FQDN、证书与路由关联。
setSearch(event.target.value)} className="h-8 pl-8 text-xs" />
{zonesQuery.isLoading ? ( ) : zonesQuery.isError ? (
void zonesQuery.refetch()} />
) : zones.length === 0 ? ( ) : (
{zones.map((zone) => (

{zone.domain}

{zone.domain_count ?? 0} 个域名 {zone.remark ? ` · ${zone.remark}` : ''}

))}
)}
); }