import type { Site } from '@/types/index.ts';
import { useSitesStore } from '@/store/sites.ts';
import { useToastStore } from '@/components/ui/Toast.tsx';
import Button from '@/components/ui/Button.tsx';
import BatchEdit from './BatchEdit.tsx';
interface SiteListProps {
onEditSite: (site: Site) => void;
onAddSite: () => void;
}
export default function SiteList({ onEditSite, onAddSite }: SiteListProps) {
const sites = useSitesStore((s) => s.sites);
const deleteSite = useSitesStore((s) => s.deleteSite);
const selectSite = useSitesStore((s) => s.selectSite);
const selectedSiteId = useSitesStore((s) => s.selectedSiteId);
const isPlacingMode = useSitesStore((s) => s.isPlacingMode);
const togglePlacingMode = useSitesStore((s) => s.togglePlacingMode);
const selectedSiteIds = useSitesStore((s) => s.selectedSiteIds);
const toggleSiteSelection = useSitesStore((s) => s.toggleSiteSelection);
const selectAllSites = useSitesStore((s) => s.selectAllSites);
const clearSelection = useSitesStore((s) => s.clearSelection);
const addToast = useToastStore((s) => s.addToast);
const handleDelete = async (id: string, name: string) => {
await deleteSite(id);
addToast(`"${name}" deleted`, 'info');
};
const allSelected = sites.length > 0 && selectedSiteIds.length === sites.length;
return (
{/* Header */}
Sites ({sites.length})
{/* Select All row (only when sites exist) */}
{sites.length > 0 && (
{selectedSiteIds.length > 0 && (
{selectedSiteIds.length} selected
)}
)}
{/* Batch edit panel (appears when sites are selected) */}
{selectedSiteIds.length > 0 && (
)}
{/* Sites list */}
{sites.length === 0 ? (
No sites yet. Click on the map or use "+ Manual" to add one.
) : (
{sites.map((site) => {
const isBatchSelected = selectedSiteIds.includes(site.id);
return (
selectSite(site.id)}
>
{/* Batch checkbox */}
toggleSiteSelection(site.id)}
onClick={(e) => e.stopPropagation()}
className="w-3.5 h-3.5 rounded border-gray-300 dark:border-dark-border accent-blue-600 flex-shrink-0"
/>
{/* Color indicator */}
{/* Info */}
{site.name}
{site.frequency} MHz · {site.power} dBm ·{' '}
{site.antennaType === 'omni'
? 'Omni'
: `Sector ${site.azimuth ?? 0}°`}
{' '}· {site.height}m
{/* Actions */}
);
})}
)}
);
}