import debounce from "lodash/debounce"; import { observer } from "mobx-react"; import * as React from "react"; import { useTranslation } from "react-i18next"; import { toast } from "sonner"; 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 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"; type Props = { collection: Collection; }; function AddGroupsToCollection(props: Props) { const { collection } = props; const [newGroupModalOpen, handleNewGroupModalOpen, handleNewGroupModalClose] = useBoolean(false); const [query, setQuery] = React.useState(""); const team = useCurrentTeam(); const { collectionGroupMemberships, groups, policies } = useStores(); const { t } = useTranslation(); const { fetchPage: fetchGroups } = groups; const can = policies.abilities(team.id); const debouncedFetch = React.useMemo( () => debounce((query) => fetchGroups({ query }), 250), [fetchGroups] ); const handleFilter = React.useCallback( (ev: React.ChangeEvent) => { const updatedQuery = ev.target.value; setQuery(updatedQuery); void debouncedFetch(updatedQuery); }, [debouncedFetch] ); const handleAddGroup = async (group: Group) => { try { await collectionGroupMemberships.create({ collectionId: collection.id, groupId: group.id, }); toast.success( t("{{ groupName }} was added to the collection", { groupName: group.name, }) ); } catch (err) { toast.error(t("Could not add user")); } }; return ( {can.createGroup ? ( {t("Can’t find the group you’re looking for?")}{" "} {t("Create a group")} . ) : null} {t("No groups matching your search")} ) : ( {t("No groups left to add")} ) } items={groups.notInCollection(collection.id, query)} fetch={query ? undefined : fetchGroups} renderItem={(item: Group) => ( ( )} /> )} /> {can.createGroup ? ( ) : null} ); } const ButtonWrap = styled.div` margin-left: 6px; `; export default observer(AddGroupsToCollection);