'use client'; import { useQuery } from '@tanstack/react-query'; import { AlertTriangle, Cloud, FolderCog, Settings } from 'lucide-react'; import Link from 'next/link'; import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from '@/components/ui/card'; import { ErrorInline } from '@/components/layout/error'; import { LoadingStateWithBorder } from '@/components/layout/loading'; import { CloudflareService, cloudflareQueryKey, } from '@/lib/services/openflare'; import { getErrorMessage } from '../websites/components/website-utils'; export default function CloudflarePage() { const overviewQuery = useQuery({ queryKey: [...cloudflareQueryKey, 'overview'], queryFn: () => CloudflareService.getOverview(), }); const overview = overviewQuery.data; return (

Cloudflare

{overviewQuery.isLoading ? ( ) : overviewQuery.isError ? ( void overviewQuery.refetch()} /> ) : !overview?.connection.ready ? ( Cloudflare 连接尚未就绪 请先导入现有 Cloudflare DNS 账号,或录入独立 API Token 并完成连接测试。 ) : (
{[ ['指向分组', overview.group_count], ['域名成员', overview.member_count], ['同步正常', overview.ok_count], ['等待同步', overview.pending_count], ['同步错误', overview.error_count], ].map(([label, value]) => ( {label} {value} ))}
)} 同步边界 OpenFlare 数据库是本模块的期望状态来源。

同步会覆盖本模块接管的同名 A 记录;如果 Cloudflare 中存在多条同名 A,需先手动清理。

成员移出或分组删除时,默认同时删除本模块管理的远端 A 记录。

一期限制 一期不提供自动故障切换,备用节点仅保存配置。
); }