diff --git a/src/elements/content-sidebar/activity-feed-v2/ActivityFeedV2.tsx b/src/elements/content-sidebar/activity-feed-v2/ActivityFeedV2.tsx index 0d022ade17..84ee811a76 100644 --- a/src/elements/content-sidebar/activity-feed-v2/ActivityFeedV2.tsx +++ b/src/elements/content-sidebar/activity-feed-v2/ActivityFeedV2.tsx @@ -176,6 +176,8 @@ const ActivityFeedV2 = ({ onClose: noop, onSubmit: noop, }, + // Mentions are restricted to file collaborators; the invite popover is intentionally never shown. + fetchCollaboratorState: async () => true, }), [], ); diff --git a/src/elements/content-sidebar/activity-feed-v2/__tests__/ActivityFeedV2.test.tsx b/src/elements/content-sidebar/activity-feed-v2/__tests__/ActivityFeedV2.test.tsx index 396df59662..9d5c83086e 100644 --- a/src/elements/content-sidebar/activity-feed-v2/__tests__/ActivityFeedV2.test.tsx +++ b/src/elements/content-sidebar/activity-feed-v2/__tests__/ActivityFeedV2.test.tsx @@ -27,10 +27,12 @@ const mockScrollTo = jest.fn(() => true); type FilterMenuProps = { children?: React.ReactNode; hasActiveFilters?: boolean }; type FilterOptionProps = { checked?: boolean; onCheckedChange?: (checked: boolean) => void }; +type RootProps = React.ComponentProps; let lastFilterMenuProps: FilterMenuProps = {}; let lastShowResolvedOptionProps: FilterOptionProps = {}; let lastMentionMeOptionProps: FilterOptionProps = {}; let lastEditorProps: Partial = {}; +let lastRootProps: Partial = {}; let lastTaskModalProps: Partial = {}; jest.mock('../task-modal-v2', () => ({ @@ -43,9 +45,10 @@ jest.mock('../task-modal-v2', () => ({ jest.mock('@box/activity-feed', () => { const actual = jest.requireActual('@box/activity-feed'); - const ActivityFeedRoot = ({ children }: { children: React.ReactNode }) => ( -
{children}
- ); + const ActivityFeedRoot = (props: Partial) => { + lastRootProps = props; + return
{props.children}
; + }; const ActivityFeedList = ({ children }: { children: React.ReactNode }) => (
{children}
); @@ -181,6 +184,7 @@ describe('elements/content-sidebar/activity-feed-v2/ActivityFeedV2', () => { lastShowResolvedOptionProps = {}; lastMentionMeOptionProps = {}; lastEditorProps = {}; + lastRootProps = {}; lastTaskModalProps = {}; mockSerializeMentionMarkup.mockImplementation((doc: unknown) => ({ hasMention: false, @@ -401,6 +405,15 @@ describe('elements/content-sidebar/activity-feed-v2/ActivityFeedV2', () => { expect(lastEditorProps.userSelectorProps?.allowEmptyQuery).toBe(true); }); + test('should report every mentioned user as a collaborator so the invite popover never opens', async () => { + render(); + + const { fetchCollaboratorState } = lastRootProps.mentionContext ?? {}; + await expect(fetchCollaboratorState?.({ email: 'a@box.com', id: 1, name: 'A', value: '1' })).resolves.toBe( + true, + ); + }); + test('should skip the API call when fetchUsers is invoked with an empty query', async () => { const getMentionAsync = jest.fn().mockResolvedValue([{ id: '1', name: 'foo' }]); render(