"use client"; import React, { useEffect, useMemo, useRef, useState } from "react"; import style from "./ClientPicker.module.css"; import CloseIcon from "@mui/icons-material/Close"; import SearchIcon from "@mui/icons-material/Search"; import CheckIcon from "@mui/icons-material/Check"; import PersonOffOutlined from "@mui/icons-material/PersonOffOutlined"; import { OrganizationClientView } from "@models/Clients.model"; export interface ClientPickerProps { open: boolean; clients: OrganizationClientView[]; selectedId: string | null; onSelect: (id: string) => void; onClose: () => void; loading?: boolean; } function formatPhone(c: OrganizationClientView): string { const parts = [c.phoneCountryCode, c.phoneAreaCode, c.phoneNumber] .filter(p => p != null && String(p).trim() !== ""); if (parts.length === 0) return ""; const joined = parts.map(p => String(p).trim()).join(" "); return joined.startsWith("+") ? joined : `+${joined}`; } function getInitials(c: OrganizationClientView): string { const f = (c.firstName?.[0] || "").toUpperCase(); const l = (c.lastName?.[0] || "").toUpperCase(); return `${f}${l}` || "?"; } export default function ClientPicker({ open, clients, selectedId, onSelect, onClose, loading, }: ClientPickerProps) { const [query, setQuery] = useState(""); const inputRef = useRef(null); useEffect(() => { if (!open) return; const onKey = (e: KeyboardEvent) => { if (e.key === "Escape") onClose(); }; window.addEventListener("keydown", onKey); setQuery(""); const t = setTimeout(() => { inputRef.current?.focus(); inputRef.current?.select(); }, 80); return () => { window.removeEventListener("keydown", onKey); clearTimeout(t); }; }, [open, onClose]); const filtered = useMemo(() => { const q = query.trim().toLowerCase(); if (!q) return clients; return clients.filter(c => (c.firstName || "").toLowerCase().includes(q) || (c.lastName || "").toLowerCase().includes(q) || (c.fullName || "").toLowerCase().includes(q) ); }, [clients, query]); if (!open) return null; const hasClients = clients.length > 0; const noResults = hasClients && filtered.length === 0 && query.trim() !== ""; const searching = query.trim() !== ""; return (
e.stopPropagation()} >

Selecciona un cliente

setQuery(e.target.value)} aria-label="Buscar cliente" autoComplete="off" spellCheck={false} /> {searching && ( )}
{loading ? (

Cargando clientes…

) : !hasClients ? (

Sin clientes todavía

No hay clientes para esta organización todavía. Cuando alguien reserve un turno, aparecerá acá.

) : noResults ? (

No encontramos clientes con ese nombre.

) : ( filtered.map(c => { const isSelected = c.id === selectedId; const sub = (c.email && c.email.trim() !== "") ? c.email : formatPhone(c); const avatar = c.avatar && c.avatar.trim() !== ""; return ( ); }) )}
); }