import { useEffect, useMemo, useState } from 'react'; import { Check, Search } from 'lucide-react'; import { Drawer } from '@/components/ui/drawer'; import type { ProxyRouteItem } from '@/features/proxy-routes/types'; import { PrimaryButton, SecondaryButton } from '@/features/shared/components/resource-primitives'; import type { WAFRuleGroup } from '@/features/waf/types'; import { cn } from '@/lib/utils/cn'; export function SiteApplyDrawer({ group, routes, open, onOpenChange, onSave, pending, }: { group: WAFRuleGroup | null; routes: ProxyRouteItem[]; open: boolean; onOpenChange: (open: boolean) => void; onSave: (ids: number[]) => void; pending: boolean; }) { 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 ( onOpenChange(false)}> 取消 onSave(selectedIDs)} > {pending ? '保存中...' : '保存应用范围'} } >
setKeyword(event.target.value)} placeholder="搜索网站或域名" className="min-w-0 flex-1 bg-transparent text-sm text-[var(--foreground-primary)] outline-none placeholder:text-[var(--foreground-muted)]" />
{filteredRoutes.map((route) => ( ))}
); }