"use client"; import { useState, useRef, useEffect, useCallback } from "react"; import { Group } from "@/lib/api"; import { useTranslation } from "@/lib/i18n"; interface GroupSelectorProps { groups: Group[]; selected: string | null; onSelect: (id: string | null) => void; } export default function GroupSelector({ groups, selected, onSelect, }: GroupSelectorProps) { const { t } = useTranslation(); const [open, setOpen] = useState(false); const dropdownRef = useRef(null); const selectedGroup = selected ? groups.find((g) => g.id === selected) : null; const handleSelect = useCallback((id: string | null) => { onSelect(id); setOpen(false); }, [onSelect]); // Close on outside click useEffect(() => { if (!open) return; function handleClick(e: MouseEvent) { if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) { setOpen(false); } } document.addEventListener("mousedown", handleClick); return () => document.removeEventListener("mousedown", handleClick); }, [open]); // Close on escape useEffect(() => { if (!open) return; function handleKey(e: KeyboardEvent) { if (e.key === "Escape") setOpen(false); } document.addEventListener("keydown", handleKey); return () => document.removeEventListener("keydown", handleKey); }, [open]); return (
{/* Dropdown trigger */} {/* Dropdown menu */} {open && (
{groups.map((g) => ( ))}
)}
); }