// @flow import { debounce } from "lodash"; import { observer } from "mobx-react"; import * as React from "react"; import { useTranslation } from "react-i18next"; import Collection from "models/Collection"; import User from "models/User"; import Invite from "scenes/Invite"; import ButtonLink from "components/ButtonLink"; import Empty from "components/Empty"; import Flex from "components/Flex"; import HelpText from "components/HelpText"; import Input from "components/Input"; import Modal from "components/Modal"; import PaginatedList from "components/PaginatedList"; import MemberListItem from "./components/MemberListItem"; import useCurrentTeam from "hooks/useCurrentTeam"; import useStores from "hooks/useStores"; import useToasts from "hooks/useToasts"; type Props = { collection: Collection, onSubmit: () => void, }; const AddPeopleToCollection = ({ collection, onSubmit }: Props) => { const [inviteModalOpen, setInviteModalOpen] = React.useState(false); const [query, setQuery] = React.useState(""); const team = useCurrentTeam(); const { users, memberships, policies } = useStores(); const { t } = useTranslation(); const { showToast } = useToasts(); const can = policies.abilities(team.id); const debouncedFetch = React.useMemo( () => debounce(async (query) => { await users.fetchPage({ query, }); }, 250), [users] ); const handleFilter = React.useCallback( (ev: SyntheticInputEvent<>) => { setQuery(ev.target.value); debouncedFetch(ev.target.value); }, [debouncedFetch] ); const handleAddUser = (user: User) => { try { memberships.create({ collectionId: collection.id, userId: user.id, permission: "read_write", }); showToast( t("{{ userName }} was added to the collection", { userName: user.name, }), { type: "success" } ); } catch (err) { showToast(t("Could not add user"), { type: "error" }); } }; return ( {can.inviteUser && ( {t("Need to add someone who’s not yet on the team yet?")}{" "} setInviteModalOpen(true)}> {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) => ( handleAddUser(item)} canEdit /> )} /> setInviteModalOpen(false)} isOpen={inviteModalOpen} > setInviteModalOpen(false)} /> ); }; export default observer(AddPeopleToCollection);