// @flow import { debounce } from "lodash"; import { observable } from "mobx"; import { inject, observer } from "mobx-react"; import * as React from "react"; import { withTranslation, type TFunction } from "react-i18next"; import styled from "styled-components"; import AuthStore from "stores/AuthStore"; import CollectionGroupMembershipsStore from "stores/CollectionGroupMembershipsStore"; import GroupsStore from "stores/GroupsStore"; import ToastsStore from "stores/ToastsStore"; 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"; type Props = { toasts: ToastsStore, auth: AuthStore, collection: Collection, collectionGroupMemberships: CollectionGroupMembershipsStore, groups: GroupsStore, onSubmit: () => void, t: TFunction, }; @observer class AddGroupsToCollection extends React.Component { @observable newGroupModalOpen: boolean = false; @observable query: string = ""; handleNewGroupModalOpen = () => { this.newGroupModalOpen = true; }; handleNewGroupModalClose = () => { this.newGroupModalOpen = false; }; handleFilter = (ev: SyntheticInputEvent<>) => { this.query = ev.target.value; this.debouncedFetch(); }; debouncedFetch = debounce(() => { this.props.groups.fetchPage({ query: this.query, }); }, 250); handleAddGroup = (group: Group) => { const { t } = this.props; try { this.props.collectionGroupMemberships.create({ collectionId: this.props.collection.id, groupId: group.id, permission: "read_write", }); this.props.toasts.showToast( t("{{ groupName }} was added to the collection", { groupName: group.name, }), { type: "success" } ); } catch (err) { this.props.toasts.showToast(t("Could not add user"), { type: "error" }); console.error(err); } }; render() { const { groups, collection, auth, t } = this.props; const { user, team } = auth; if (!user || !team) return null; return ( {t("Can’t find the group you’re looking for?")}{" "} {t("Create a group")} . {t("No groups matching your search")} ) : ( {t("No groups left to add")} ) } items={groups.notInCollection(collection.id, this.query)} fetch={this.query ? undefined : groups.fetchPage} renderItem={(item) => ( ( )} /> )} /> ); } } const ButtonWrap = styled.div` margin-left: 6px; `; export default withTranslation()( inject( "auth", "groups", "collectionGroupMemberships", "toasts" )(AddGroupsToCollection) );