'use client'; import {useEffect, useMemo, useState} from 'react'; import {Check, Search} from 'lucide-react'; import {Button} from '@/components/ui/button'; import {Input} from '@/components/ui/input'; import {Sheet, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle,} from '@/components/ui/sheet'; import {cn} from '@/lib/utils'; import type {ProxyRouteItem, WAFRuleGroup} from '@/lib/services/openflare'; interface SiteBindingSheetProps { group: WAFRuleGroup | null; routes: ProxyRouteItem[]; open: boolean; pending: boolean; onOpenChange: (open: boolean) => void; onSave: (ids: number[]) => void; } export function SiteBindingSheet({ group, routes, open, pending, onOpenChange, onSave, }: SiteBindingSheetProps) { const [keyword, setKeyword] = useState(''); const [selectedIDs, setSelectedIDs] = useState([]); useEffect(() => { setSelectedIDs(group?.applied_site_ids ?? []); setKeyword(''); }, [group, open]); const filteredRoutes = useMemo(() => { const normalized = keyword.trim().toLowerCase(); if (!normalized) return routes; return routes.filter((route) => [route.site_name, route.primary_domain, ...route.domains] .join(' ') .toLowerCase() .includes(normalized), ); }, [keyword, routes]); const selectedSet = useMemo(() => new Set(selectedIDs), [selectedIDs]); const toggleID = (id: number) => { setSelectedIDs((current) => current.includes(id) ? current.filter((item) => item !== id) : [...current, id].sort((left, right) => left - right), ); }; const selectFiltered = () => { const next = new Set(selectedIDs); filteredRoutes.forEach((route) => next.add(route.id)); setSelectedIDs([...next].sort((left, right) => left - right)); }; return ( {group ? `绑定 ${group.name}` : '绑定规则组'} 选择这个自定义规则组要叠加到哪些网站。
setKeyword(event.target.value)} />
{filteredRoutes.map((route) => ( ))}
); }