// @flow import { debounce } from "lodash"; import { observer } from "mobx-react"; import * as React from "react"; import { useTranslation } from "react-i18next"; import styled from "styled-components"; import Collection from "models/Collection"; import Group from "models/Group"; import GroupNew from "scenes/GroupNew"; import Button from "components/Button"; import ButtonLink from "components/ButtonLink"; import Empty from "components/Empty"; import Flex from "components/Flex"; import GroupListItem from "components/GroupListItem"; import HelpText from "components/HelpText"; import Input from "components/Input"; import Modal from "components/Modal"; import PaginatedList from "components/PaginatedList"; import useCurrentTeam from "hooks/useCurrentTeam"; import useStores from "hooks/useStores"; import useToasts from "hooks/useToasts"; type Props = { collection: Collection, onSubmit: () => void, }; const AddGroupsToCollection = ({ collection, onSubmit }: Props) => { const [newGroupModalOpen, setNewGroupModalOpen] = React.useState(false); const [query, setQuery] = React.useState(""); const { groups, collectionGroupMemberships, policies } = useStores(); const { t } = useTranslation(); const { showToast } = useToasts(); const team = useCurrentTeam(); const can = policies.abilities(team.id); const groupsExist = !!groups.orderedData.length; const debouncedFetch = React.useMemo( () => debounce(async (query) => { await groups.fetchPage({ query, }); }, 250), [groups] ); const handleFilter = React.useCallback( (ev: SyntheticInputEvent<>) => { setQuery(ev.target.value); debouncedFetch(ev.target.value); }, [debouncedFetch] ); const handleAddGroup = async (group: Group) => { try { await collectionGroupMemberships.create({ collectionId: collection.id, groupId: group.id, permission: "read_write", }); showToast( t("{{ groupName }} was added to the collection", { groupName: group.name, }), { type: "success" } ); } catch (err) { showToast(t("Could not add group"), { type: "error" }); console.error(err); } }; return ( {can.createGroup && ( {t("Can’t find the group you’re looking for?")}{" "} setNewGroupModalOpen(true)}> {t("Create a group")} )} {groupsExist && ( )} {t("No groups matching your search")} ) : groupsExist ? ( {t("No groups left to add")} ) : ( {t("No groups found to add")} ) } items={groups.notInCollection(collection.id, query)} fetch={query ? undefined : groups.fetchPage} renderItem={(item) => ( ( )} /> )} /> setNewGroupModalOpen(false)} isOpen={newGroupModalOpen} > setNewGroupModalOpen(false)} /> ); }; const ButtonWrap = styled.div` margin-left: 6px; `; export default observer(AddGroupsToCollection);