import { useRouter } from "next/router"; import { t } from "@lingui/core/macro"; import { HiMiniPlus } from "react-icons/hi2"; import Avatar from "~/components/Avatar"; import CheckboxDropdown from "~/components/CheckboxDropdown"; import { useModal } from "~/providers/modal"; import { usePopup } from "~/providers/popup"; import { api } from "~/utils/api"; interface MemberSelectorProps { cardPublicId: string; members: { key: string; value: string; selected: boolean; leftIcon: React.ReactNode; imageUrl: string | undefined; }[]; isLoading: boolean; } export default function MemberSelector({ cardPublicId, members, isLoading, }: MemberSelectorProps) { const router = useRouter(); const utils = api.useUtils(); const { openModal } = useModal(); const { showPopup } = usePopup(); const addOrRemoveMember = api.card.addOrRemoveMember.useMutation({ onMutate: async (update) => { await utils.card.byId.cancel(); const previousCard = utils.card.byId.getData({ cardPublicId }); utils.card.byId.setData({ cardPublicId }, (oldCard) => { if (!oldCard) return oldCard; const hasMember = oldCard.members.some( (member) => member.publicId === update.workspaceMemberPublicId, ); const memberToAdd = oldCard.members.find( (member) => member.publicId === update.workspaceMemberPublicId, ); const updatedMembers = hasMember ? oldCard.members.filter( (member) => member.publicId !== update.workspaceMemberPublicId, ) : [ ...oldCard.members, { publicId: update.workspaceMemberPublicId, email: memberToAdd?.email ?? "", deletedAt: null, user: { id: memberToAdd?.user?.id ?? "", name: memberToAdd?.user?.name ?? "", }, }, ]; return { ...oldCard, members: updatedMembers, }; }); return { previousCard }; }, onError: (_error, _newList, context) => { utils.card.byId.setData({ cardPublicId }, context?.previousCard); showPopup({ header: t`Unable to update members`, message: t`Please try again later, or contact customer support.`, icon: "error", }); }, onSettled: async () => { await utils.card.byId.invalidate({ cardPublicId }); }, }); const selectedMembers = members.filter((member) => member.selected); const handleInviteMember = async () => { await router.push(`/members`); openModal("INVITE_MEMBER"); }; return ( <> {isLoading ? (
) : ( { addOrRemoveMember.mutate({ cardPublicId, workspaceMemberPublicId: member.key, }); }} handleCreate={handleInviteMember} createNewItemLabel={t`Invite member`} asChild >
{selectedMembers.length ? (
{selectedMembers.map(({ value, imageUrl }) => ( ))}
) : ( <> {t`Add member`} )}
)} ); }