From ade26139e6ebb445d31364c66f89135351f36ef0 Mon Sep 17 00:00:00 2001 From: Mihir Shah <48630359+MihirGH@users.noreply.github.com> Date: Tue, 1 Nov 2022 17:47:26 +0530 Subject: [PATCH] chore: convert AddPeopleToGroup component to functional component (#4204) (#4359) --- app/scenes/GroupMembers/AddPeopleToGroup.tsx | 191 +++++++++---------- 1 file changed, 94 insertions(+), 97 deletions(-) diff --git a/app/scenes/GroupMembers/AddPeopleToGroup.tsx b/app/scenes/GroupMembers/AddPeopleToGroup.tsx index dab7c4a74..cfe34b41e 100644 --- a/app/scenes/GroupMembers/AddPeopleToGroup.tsx +++ b/app/scenes/GroupMembers/AddPeopleToGroup.tsx @@ -1,9 +1,6 @@ import { debounce } from "lodash"; -import { observable } from "mobx"; -import { observer } from "mobx-react"; import * as React from "react"; -import { WithTranslation, withTranslation } from "react-i18next"; -import RootStore from "~/stores/RootStore"; +import { useTranslation } from "react-i18next"; import Group from "~/models/Group"; import User from "~/models/User"; import Invite from "~/scenes/Invite"; @@ -14,51 +11,54 @@ import Input from "~/components/Input"; import Modal from "~/components/Modal"; import PaginatedList from "~/components/PaginatedList"; import Text from "~/components/Text"; -import withStores from "~/components/withStores"; +import useBoolean from "~/hooks/useBoolean"; +import useStores from "~/hooks/useStores"; import GroupMemberListItem from "./components/GroupMemberListItem"; -type Props = WithTranslation & - RootStore & { - group: Group; - onSubmit: () => void; - }; +type Props = { + group: Group; + onSubmit: () => void; +}; -@observer -class AddPeopleToGroup extends React.Component { - @observable - inviteModalOpen = false; +function AddPeopleToGroup(props: Props) { + const { group } = props; - @observable - query = ""; + const { users, auth, groupMemberships, toasts } = useStores(); + const { t } = useTranslation(); - handleInviteModalOpen = () => { - this.inviteModalOpen = true; - }; + const [query, setQuery] = React.useState(""); + const [ + inviteModalOpen, + handleInviteModalOpen, + handleInviteModalClose, + ] = useBoolean(false); - handleInviteModalClose = () => { - this.inviteModalOpen = false; - }; + const { fetchPage: fetchUsers } = users; + const debouncedFetch = React.useMemo( + () => + debounce((query) => { + fetchUsers({ query }); + }, 250), + [fetchUsers] + ); - handleFilter = (ev: React.ChangeEvent) => { - this.query = ev.target.value; - this.debouncedFetch(); - }; - - debouncedFetch = debounce(() => { - this.props.users.fetchPage({ - query: this.query, - }); - }, 250); - - handleAddUser = async (user: User) => { - const { t } = this.props; + const handleFilter = React.useCallback( + (ev: React.ChangeEvent) => { + const updatedQuery = ev.target.value; + setQuery(updatedQuery); + debouncedFetch(updatedQuery); + }, + [debouncedFetch] + ); + const handleAddUser = async (user: User) => { try { - await this.props.groupMemberships.create({ - groupId: this.props.group.id, + await groupMemberships.create({ + groupId: group.id, userId: user.id, }); - this.props.toasts.showToast( + + toasts.showToast( t(`{{userName}} was added to the group`, { userName: user.name, }), @@ -67,70 +67,67 @@ class AddPeopleToGroup extends React.Component { } ); } catch (err) { - this.props.toasts.showToast(t("Could not add user"), { + toasts.showToast(t("Could not add user"), { type: "error", }); } }; - render() { - const { users, group, auth, t } = this.props; - const { user, team } = auth; - if (!user || !team) { - return null; - } - - return ( - - - {t( - "Add members below to give them access to the group. Need to add someone who’s not yet a member?" - )}{" "} - - {t("Invite them to {{teamName}}", { - teamName: team.name, - })} - - . - - - {t("No people matching your search")} - ) : ( - {t("No people left to add")} - ) - } - items={users.notInGroup(group.id, this.query)} - fetch={this.query ? undefined : users.fetchPage} - renderItem={(item: User) => ( - this.handleAddUser(item)} - /> - )} - /> - - - - - ); + const { user, team } = auth; + if (!user || !team) { + return null; } + + return ( + + + {t( + "Add members below to give them access to the group. Need to add someone who’s not yet a member?" + )}{" "} + + {t("Invite them to {{teamName}}", { + teamName: team.name, + })} + + . + + + {t("No people matching your search")} + ) : ( + {t("No people left to add")} + ) + } + items={users.notInGroup(group.id, query)} + fetch={query ? undefined : users.fetchPage} + renderItem={(item: User) => ( + handleAddUser(item)} + /> + )} + /> + + + + + ); } -export default withTranslation()(withStores(AddPeopleToGroup)); +export default AddPeopleToGroup;