import { useState } from "react"; import { useDebounce } from "@/hooks/use-debounce"; import { useTeamMembersList } from "@/domain/team-members/use-cases/use-team-members-list"; import type { TeamMemberListItem } from "@/domain/team-members/types/team-member"; import { Alert, Avatar, Box, Button, Chip, Drawer, IconButton, Stack, Tab, Tabs, TextField, Typography, } from "@mui/material"; import CloseIcon from "@mui/icons-material/Close"; import { TeamMembersTable } from "./_components/team-members-table"; import { AddTeamMemberDialog } from "./_components/add-team-member-dialog"; type StatusTab = "active" | "inactive"; const STATUS_LABELS: Record = { active: "Active", inactive: "Inactive", }; function MemberStatus({ status }: { status: TeamMemberListItem["status"] }) { return ; } function TeamMemberDrawer({ member, onClose, }: { member: TeamMemberListItem | null; onClose: () => void; }) { return ( Team Member {member !== null && ( {member.name.slice(0, 1).toUpperCase() || "?"} {member.name || "—"} {member.role || "—"} Service Area: {member.serviceArea || "—"} Phone: {member.phone || "—"} Email: {member.email || "—"} )} ); } export default function TeamMembersListPage() { const [search, setSearch] = useState(""); const [tab, setTab] = useState("active"); const [selectedMember, setSelectedMember] = useState(null); const [addMemberOpen, setAddMemberOpen] = useState(false); const debouncedSearch = useDebounce(search, 300).trim().toLowerCase(); const { data, isLoading, error } = useTeamMembersList(); const allMembers = data?.items ?? []; const activeCount = allMembers.filter((member) => member.status === "Active").length; const inactiveCount = allMembers.length - activeCount; const rows = allMembers .filter((member) => member.status === STATUS_LABELS[tab]) .filter((member) => !debouncedSearch || member.name.toLowerCase().includes(debouncedSearch)); return ( Team Members {allMembers.length} team member{allMembers.length === 1 ? "" : "s"} · {activeCount}{" "} active setSearch(event.target.value)} placeholder="Search team member…" aria-label="Search team member" sx={{ width: 224 }} /> setTab(value)} aria-label="Team member status" > {Boolean(error) && ( {error instanceof Error ? error.message : "Failed to load team members"} )} {rows.length} {tab} team member{rows.length === 1 ? "" : "s"} {debouncedSearch ? " · filtered" : ""} {activeCount} active · {inactiveCount} inactive setSelectedMember(null)} /> setAddMemberOpen(false)} /> ); }