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, Box, Button, Stack, Tab, Tabs, TextField, Typography } from "@mui/material"; import { TeamMembersTable } from "./_components/team-members-table"; import { AddTeamMemberDialog } from "./_components/add-team-member-dialog"; import { TeamMemberDetailDrawer } from "./_components/team-member-detail-drawer"; type StatusTab = "active" | "inactive"; const STATUS_LABELS: Record = { active: "Active", inactive: "Inactive", }; 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)} /> ); }