import { observer } from "mobx-react"; import * as React from "react"; import { useTranslation } from "react-i18next"; import { toast } from "sonner"; import Collection from "~/models/Collection"; import User from "~/models/User"; import Invite from "~/scenes/Invite"; import Avatar from "~/components/Avatar"; import { AvatarSize } from "~/components/Avatar/Avatar"; import ButtonLink from "~/components/ButtonLink"; import Empty from "~/components/Empty"; import Flex from "~/components/Flex"; import Input from "~/components/Input"; import Modal from "~/components/Modal"; import PaginatedList from "~/components/PaginatedList"; import Text from "~/components/Text"; import useBoolean from "~/hooks/useBoolean"; import useCurrentTeam from "~/hooks/useCurrentTeam"; import useStores from "~/hooks/useStores"; import useThrottledCallback from "~/hooks/useThrottledCallback"; import MemberListItem from "./components/MemberListItem"; type Props = { collection: Collection; }; function AddPeopleToCollection({ collection }: Props) { const { memberships, users } = useStores(); const team = useCurrentTeam(); const { t } = useTranslation(); const [inviteModalOpen, setInviteModalOpen, setInviteModalClosed] = useBoolean(); const [query, setQuery] = React.useState(""); const debouncedFetch = useThrottledCallback( (query) => users.fetchPage({ query, }), 250 ); const handleFilter = (ev: React.ChangeEvent) => { setQuery(ev.target.value); void debouncedFetch(ev.target.value); }; const handleAddUser = async (user: User) => { try { await memberships.create({ collectionId: collection.id, userId: user.id, }); toast.success( t("{{ userName }} was added to the collection", { userName: user.name, }), { icon: , } ); } catch (err) { toast.error(t("Could not add user")); } }; return ( {t("Need to add someone who’s not on the team yet?")}{" "} {t("Invite people to {{ teamName }}", { teamName: team.name, })} . {t("No people matching your search")} ) : ( {t("No people left to add")} ) } items={users.notInCollection(collection.id, query)} fetch={query ? undefined : users.fetchPage} renderItem={(item: User) => ( handleAddUser(item)} canEdit /> )} /> ); } export default observer(AddPeopleToCollection);