diff --git a/app/components/WebsocketProvider.tsx b/app/components/WebsocketProvider.tsx index 32446cb40..3a1b39632 100644 --- a/app/components/WebsocketProvider.tsx +++ b/app/components/WebsocketProvider.tsx @@ -377,15 +377,29 @@ class WebsocketProvider extends React.Component { // or otherwise just remove any membership state we have for that user. this.socket.on( "collections.remove_user", - action((event: WebsocketCollectionUserEvent) => { + async (event: WebsocketCollectionUserEvent) => { if (auth.user && event.userId === auth.user.id) { - collections.remove(event.collectionId); - memberships.removeCollectionMemberships(event.collectionId); + // check if we still have access to the collection + try { + await collections.fetch(event.collectionId, { + force: true, + }); + } catch (err) { + if ( + err instanceof AuthorizationError || + err instanceof NotFoundError + ) { + collections.remove(event.collectionId); + memberships.remove(`${event.userId}-${event.collectionId}`); + return; + } + } + documents.removeCollectionDocuments(event.collectionId); } else { memberships.remove(`${event.userId}-${event.collectionId}`); } - }) + } ); this.socket.on( diff --git a/app/menus/MemberMenu.tsx b/app/menus/MemberMenu.tsx index 038149b82..de2223478 100644 --- a/app/menus/MemberMenu.tsx +++ b/app/menus/MemberMenu.tsx @@ -1,19 +1,24 @@ import * as React from "react"; import { useTranslation } from "react-i18next"; import { useMenuState } from "reakit/Menu"; +import User from "~/models/User"; import ContextMenu from "~/components/ContextMenu"; import OverflowMenuButton from "~/components/ContextMenu/OverflowMenuButton"; import Template from "~/components/ContextMenu/Template"; +import useCurrentUser from "~/hooks/useCurrentUser"; type Props = { + user: User; onRemove: () => void; }; -function MemberMenu({ onRemove }: Props) { +function MemberMenu({ user, onRemove }: Props) { const { t } = useTranslation(); + const currentUser = useCurrentUser(); const menu = useMenuState({ modal: true, }); + return ( <> @@ -23,7 +28,7 @@ function MemberMenu({ onRemove }: Props) { items={[ { type: "button", - title: t("Remove"), + title: currentUser.id === user.id ? t("Leave") : t("Remove"), dangerous: true, onClick: onRemove, }, diff --git a/app/scenes/CollectionPermissions/AddPeopleToCollection.tsx b/app/scenes/CollectionPermissions/AddPeopleToCollection.tsx index 3c4375a2a..480731722 100644 --- a/app/scenes/CollectionPermissions/AddPeopleToCollection.tsx +++ b/app/scenes/CollectionPermissions/AddPeopleToCollection.tsx @@ -13,7 +13,6 @@ import PaginatedList from "~/components/PaginatedList"; import Text from "~/components/Text"; import useBoolean from "~/hooks/useBoolean"; import useCurrentTeam from "~/hooks/useCurrentTeam"; -import useCurrentUser from "~/hooks/useCurrentUser"; import useDebouncedCallback from "~/hooks/useDebouncedCallback"; import useStores from "~/hooks/useStores"; import useToasts from "~/hooks/useToasts"; @@ -26,7 +25,6 @@ type Props = { function AddPeopleToCollection({ collection }: Props) { const { memberships, users } = useStores(); const { showToast } = useToasts(); - const user = useCurrentUser(); const team = useCurrentTeam(); const { t } = useTranslation(); const [ @@ -99,9 +97,7 @@ function AddPeopleToCollection({ collection }: Props) { {t("No people left to add")} ) } - items={users - .notInCollection(collection.id, query) - .filter((member) => member.id !== user.id)} + items={users.notInCollection(collection.id, query)} fetch={query ? undefined : users.fetchPage} renderItem={(item: User) => ( - {onRemove && } + {onRemove && } {onAdd && (