import React, { useMemo, useState } from "react"; import { Button, ListItem, View, YGroup } from "tamagui"; import MenuButton from "@/components/ui/menu-button"; import Icons from "@/components/ui/icons"; import SearchInput from "@/components/ui/search-input"; import { useTeamId } from "@/stores/auth"; import { changeRoleModal } from "./change-role-form"; import { useRemoveMemberMutation } from "../hooks/query"; import { showDialog } from "@/hooks/useDialog"; import Avatar from "@/components/ui/avatar"; type Props = { members?: any[]; allowWrite?: boolean; }; const MemberList = ({ members, allowWrite }: Props) => { const teamId = useTeamId(); const [search, setSearch] = useState(""); const remove = useRemoveMemberMutation(teamId); const onRemove = (member: any) => { showDialog({ title: "Remove Member", description: "Are you sure you want to remove this member?", onConfirm: () => remove.mutate(member.userId), }); }; const memberList = useMemo(() => { let items = members || []; if (search) { items = items.filter((item: any) => { const q = search.toLowerCase(); return ( item.user?.name.toLowerCase().includes(q) || item.user?.username.toLowerCase().includes(q) || item.user?.email.toLowerCase().includes(q) ); }); } return items; }, [members, search]); return ( <View mt="$4"> <SearchInput placeholder="Search member.." value={search} onChangeText={setSearch} /> <YGroup bordered mt="$4"> {memberList?.map((member: any) => ( <YGroup.Item key={member.userId}> <ListItem hoverTheme title={member.user?.name} subTitle={member.role} pr="$2" icon={<Avatar src={member.user?.image} size="$4" />} iconAfter={ allowWrite ? ( <MemberActionButton member={member} onRemove={() => onRemove(member)} /> ) : undefined } /> </YGroup.Item> ))} </YGroup> </View> ); }; type MemberActionButtonProps = { member: any; onRemove: () => void; }; const MemberActionButton = ({ member, onRemove }: MemberActionButtonProps) => ( <MenuButton size="$1" placement="bottom-end" trigger={ <Button icon={<Icons name="dots-vertical" size={20} />} circular bg="$colorTransparent" /> } > <MenuButton.Item icon={<Icons name="account-key" size={16} />} onPress={() => changeRoleModal.onOpen({ teamId: member.teamId, userId: member.userId, role: member.role, }) } > Change Role </MenuButton.Item> <MenuButton.Item color="$red10" icon={<Icons name="trash-can" size={16} />} onPress={onRemove} > Remove Member </MenuButton.Item> </MenuButton> ); export default MemberList;