"use client"; import { useState, useMemo } from "react"; import { useTranslations } from "next-intl"; import { Search, Check, X } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Avatar } from "@/components/ui/avatar"; import { cn } from "@/lib/utils"; import type { ContactCard } from "@/lib/jmap/types"; import { getContactDisplayName, getContactPrimaryEmail } from "@/stores/contact-store"; interface ContactGroupFormProps { group?: ContactCard | null; individuals: ContactCard[]; currentMemberIds?: string[]; onSave: (name: string, memberIds: string[]) => Promise; onCancel: () => void; } export function ContactGroupForm({ group, individuals, currentMemberIds = [], onSave, onCancel, }: ContactGroupFormProps) { const t = useTranslations("contacts"); const isEditing = !!group; const [name, setName] = useState( group ? getContactDisplayName(group) : "" ); const [selectedIds, setSelectedIds] = useState>( new Set(currentMemberIds) ); const [memberSearch, setMemberSearch] = useState(""); const [isSaving, setIsSaving] = useState(false); const [error, setError] = useState(null); const filteredIndividuals = useMemo(() => { if (!memberSearch) return individuals; const lower = memberSearch.toLowerCase(); return individuals.filter((c) => { const n = getContactDisplayName(c).toLowerCase(); const e = getContactPrimaryEmail(c).toLowerCase(); return n.includes(lower) || e.includes(lower); }); }, [individuals, memberSearch]); const toggleMember = (id: string) => { const next = new Set(selectedIds); if (next.has(id)) { next.delete(id); } else { next.add(id); } setSelectedIds(next); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(null); if (!name.trim()) { setError(t("groups.name_required")); return; } setIsSaving(true); try { await onSave(name.trim(), Array.from(selectedIds)); } catch (err) { setError(err instanceof Error ? err.message : t("groups.save_failed")); } finally { setIsSaving(false); } }; return (

{isEditing ? t("groups.edit") : t("groups.create")}

{error && (
{error}
)}
setName(e.target.value)} placeholder={t("groups.name_placeholder")} autoFocus />
setMemberSearch(e.target.value)} className="pl-9" />
{filteredIndividuals.length === 0 ? (
{t("empty_search")}
) : ( filteredIndividuals.map((contact) => { const cName = getContactDisplayName(contact); const cEmail = getContactPrimaryEmail(contact); const isSelected = selectedIds.has(contact.id); return ( ); }) )}
{selectedIds.size > 0 && (
{Array.from(selectedIds).map((id) => { const contact = individuals.find((c) => c.id === id); if (!contact) return null; return ( {getContactDisplayName(contact)} ); })}
)}
); }