From 77c591c988c0d9d6de10f896ee4892726f27bc0c Mon Sep 17 00:00:00 2001 From: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com> Date: Thu, 27 Nov 2025 22:48:30 +0530 Subject: [PATCH 01/12] added mention-all and mention-here permission --- app/containers/MessageComposer/hooks/useAutocomplete.ts | 8 ++++++-- app/lib/methods/getPermissions.ts | 4 +++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app/containers/MessageComposer/hooks/useAutocomplete.ts b/app/containers/MessageComposer/hooks/useAutocomplete.ts index 94ab23f63cc..308e58c4ae0 100644 --- a/app/containers/MessageComposer/hooks/useAutocomplete.ts +++ b/app/containers/MessageComposer/hooks/useAutocomplete.ts @@ -16,6 +16,7 @@ import { getCommandPreview, getListCannedResponse } from '../../../lib/services/ import log from '../../../lib/methods/helpers/log'; import I18n from '../../../i18n'; import { NO_CANNED_RESPONSES } from '../constants'; +import { usePermissions } from '../../../lib/hooks/usePermissions'; const MENTIONS_COUNT_TO_DISPLAY = 4; @@ -52,6 +53,9 @@ export const useAutocomplete = ({ updateAutocompleteVisible?: (updatedAutocompleteVisible: boolean) => void; }): TAutocompleteItem[] => { const [items, setItems] = useState([]); + const [mentionAll] = usePermissions(['mention-all']); + const [mentionHere] = usePermissions(['mention-here']); + useEffect(() => { const getAutocomplete = async () => { try { @@ -87,7 +91,7 @@ export const useAutocomplete = ({ type })) as IAutocompleteUserRoom[]; if (type === '@') { - if ('all'.includes(text.toLocaleLowerCase())) { + if (mentionAll && 'all'.includes(text.toLocaleLowerCase())) { parsedRes.push({ id: 'all', title: 'all', @@ -96,7 +100,7 @@ export const useAutocomplete = ({ t: 'd' }); } - if ('here'.includes(text.toLocaleLowerCase())) { + if (mentionHere && 'here'.includes(text.toLocaleLowerCase())) { parsedRes.push({ id: 'here', title: 'here', diff --git a/app/lib/methods/getPermissions.ts b/app/lib/methods/getPermissions.ts index 8bf2fd21db0..bdda913a107 100644 --- a/app/lib/methods/getPermissions.ts +++ b/app/lib/methods/getPermissions.ts @@ -66,7 +66,9 @@ export const SUPPORTED_PERMISSIONS = [ 'create-team-channel', 'create-team-group', 'delete-team-channel', - 'delete-team-group' + 'delete-team-group', + 'mention-all', + 'mention-here' ] as const; export async function setPermissions(): Promise { From c1c0d1b38574ac2a74a01d5d1c798a4ab2d0b45f Mon Sep 17 00:00:00 2001 From: Rohit3523 Date: Thu, 27 Nov 2025 17:20:56 +0000 Subject: [PATCH 02/12] chore: format code and fix lint issues [skip ci] --- app/containers/MessageComposer/hooks/useAutocomplete.ts | 4 ++-- app/lib/methods/getPermissions.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/containers/MessageComposer/hooks/useAutocomplete.ts b/app/containers/MessageComposer/hooks/useAutocomplete.ts index 308e58c4ae0..405b5ad4f83 100644 --- a/app/containers/MessageComposer/hooks/useAutocomplete.ts +++ b/app/containers/MessageComposer/hooks/useAutocomplete.ts @@ -53,8 +53,8 @@ export const useAutocomplete = ({ updateAutocompleteVisible?: (updatedAutocompleteVisible: boolean) => void; }): TAutocompleteItem[] => { const [items, setItems] = useState([]); - const [mentionAll] = usePermissions(['mention-all']); - const [mentionHere] = usePermissions(['mention-here']); + const [mentionAll] = usePermissions(['mention-all']); + const [mentionHere] = usePermissions(['mention-here']); useEffect(() => { const getAutocomplete = async () => { diff --git a/app/lib/methods/getPermissions.ts b/app/lib/methods/getPermissions.ts index bdda913a107..02082089ad1 100644 --- a/app/lib/methods/getPermissions.ts +++ b/app/lib/methods/getPermissions.ts @@ -67,8 +67,8 @@ export const SUPPORTED_PERMISSIONS = [ 'create-team-group', 'delete-team-channel', 'delete-team-group', - 'mention-all', - 'mention-here' + 'mention-all', + 'mention-here' ] as const; export async function setPermissions(): Promise { From 7700d8fc1161acecee1089527c196eb298296704 Mon Sep 17 00:00:00 2001 From: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com> Date: Thu, 27 Nov 2025 23:00:57 +0530 Subject: [PATCH 03/12] rerun ci --- app/lib/methods/getPermissions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/lib/methods/getPermissions.ts b/app/lib/methods/getPermissions.ts index 02082089ad1..9135b67bc46 100644 --- a/app/lib/methods/getPermissions.ts +++ b/app/lib/methods/getPermissions.ts @@ -68,7 +68,7 @@ export const SUPPORTED_PERMISSIONS = [ 'delete-team-channel', 'delete-team-group', 'mention-all', - 'mention-here' + 'mention-here ] as const; export async function setPermissions(): Promise { From 5d33a7d46276a351c90ee4f155e4f2853f973013 Mon Sep 17 00:00:00 2001 From: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com> Date: Thu, 27 Nov 2025 23:01:02 +0530 Subject: [PATCH 04/12] revert --- app/lib/methods/getPermissions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/lib/methods/getPermissions.ts b/app/lib/methods/getPermissions.ts index 9135b67bc46..02082089ad1 100644 --- a/app/lib/methods/getPermissions.ts +++ b/app/lib/methods/getPermissions.ts @@ -68,7 +68,7 @@ export const SUPPORTED_PERMISSIONS = [ 'delete-team-channel', 'delete-team-group', 'mention-all', - 'mention-here + 'mention-here' ] as const; export async function setPermissions(): Promise { From cf05d78ac4f2e1a8794135de1f00b62fa96c56a1 Mon Sep 17 00:00:00 2001 From: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com> Date: Thu, 27 Nov 2025 23:13:01 +0530 Subject: [PATCH 05/12] use single permission hook --- app/containers/MessageComposer/hooks/useAutocomplete.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/containers/MessageComposer/hooks/useAutocomplete.ts b/app/containers/MessageComposer/hooks/useAutocomplete.ts index 405b5ad4f83..906fe8d631e 100644 --- a/app/containers/MessageComposer/hooks/useAutocomplete.ts +++ b/app/containers/MessageComposer/hooks/useAutocomplete.ts @@ -53,8 +53,7 @@ export const useAutocomplete = ({ updateAutocompleteVisible?: (updatedAutocompleteVisible: boolean) => void; }): TAutocompleteItem[] => { const [items, setItems] = useState([]); - const [mentionAll] = usePermissions(['mention-all']); - const [mentionHere] = usePermissions(['mention-here']); + const [mentionAll, mentionHere] = usePermissions(['mention-all', 'mention-here']); useEffect(() => { const getAutocomplete = async () => { From 8b22117ec2e23c04585cb8a796543bdc18dabfef Mon Sep 17 00:00:00 2001 From: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com> Date: Thu, 27 Nov 2025 23:14:05 +0530 Subject: [PATCH 06/12] snapshot update --- .../MessageComposer.test.tsx.snap | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/app/containers/MessageComposer/__snapshots__/MessageComposer.test.tsx.snap b/app/containers/MessageComposer/__snapshots__/MessageComposer.test.tsx.snap index 8dd0f6b4152..a9aa56d1d32 100644 --- a/app/containers/MessageComposer/__snapshots__/MessageComposer.test.tsx.snap +++ b/app/containers/MessageComposer/__snapshots__/MessageComposer.test.tsx.snap @@ -82,7 +82,7 @@ exports[`MessageComposer Audio tap record 1`] = ` borderless={true} collapsable={false} delayLongPress={600} - handlerTag={259} + handlerTag={253} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -177,7 +177,7 @@ exports[`MessageComposer Audio tap record 1`] = ` borderless={true} collapsable={false} delayLongPress={600} - handlerTag={260} + handlerTag={254} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -299,7 +299,7 @@ exports[`MessageComposer Quote Add quote \`abc\` 1`] = ` borderless={true} collapsable={false} delayLongPress={600} - handlerTag={246} + handlerTag={240} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -415,7 +415,7 @@ exports[`MessageComposer Quote Add quote \`abc\` 1`] = ` borderless={true} collapsable={false} delayLongPress={600} - handlerTag={247} + handlerTag={241} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -587,7 +587,7 @@ exports[`MessageComposer Quote Add quote \`abc\` 1`] = ` borderless={true} collapsable={false} delayLongPress={600} - handlerTag={248} + handlerTag={242} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -744,7 +744,7 @@ exports[`MessageComposer Quote Add quote \`def\` 1`] = ` borderless={true} collapsable={false} delayLongPress={600} - handlerTag={249} + handlerTag={243} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -860,7 +860,7 @@ exports[`MessageComposer Quote Add quote \`def\` 1`] = ` borderless={true} collapsable={false} delayLongPress={600} - handlerTag={250} + handlerTag={244} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -1033,7 +1033,7 @@ exports[`MessageComposer Quote Add quote \`def\` 1`] = ` borderless={true} collapsable={false} delayLongPress={600} - handlerTag={251} + handlerTag={245} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -1214,7 +1214,7 @@ exports[`MessageComposer Quote Add quote \`def\` 1`] = ` borderless={true} collapsable={false} delayLongPress={600} - handlerTag={252} + handlerTag={246} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -1371,7 +1371,7 @@ exports[`MessageComposer Quote Remove a quote 1`] = ` borderless={true} collapsable={false} delayLongPress={600} - handlerTag={253} + handlerTag={247} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -1487,7 +1487,7 @@ exports[`MessageComposer Quote Remove a quote 1`] = ` borderless={true} collapsable={false} delayLongPress={600} - handlerTag={254} + handlerTag={248} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -1660,7 +1660,7 @@ exports[`MessageComposer Quote Remove a quote 1`] = ` borderless={true} collapsable={false} delayLongPress={600} - handlerTag={255} + handlerTag={249} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -1841,7 +1841,7 @@ exports[`MessageComposer Quote Remove a quote 1`] = ` borderless={true} collapsable={false} delayLongPress={600} - handlerTag={256} + handlerTag={250} handlerType="NativeViewGestureHandler" hitSlop={ { From 2edf6739304edf575816c87551517a52f7aea6c0 Mon Sep 17 00:00:00 2001 From: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com> Date: Fri, 28 Nov 2025 01:13:23 +0530 Subject: [PATCH 07/12] snapshot update --- .../MessageComposer.test.tsx.snap | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/app/containers/MessageComposer/__snapshots__/MessageComposer.test.tsx.snap b/app/containers/MessageComposer/__snapshots__/MessageComposer.test.tsx.snap index a9aa56d1d32..ca392c9b2f3 100644 --- a/app/containers/MessageComposer/__snapshots__/MessageComposer.test.tsx.snap +++ b/app/containers/MessageComposer/__snapshots__/MessageComposer.test.tsx.snap @@ -82,7 +82,7 @@ exports[`MessageComposer Audio tap record 1`] = ` borderless={true} collapsable={false} delayLongPress={600} - handlerTag={253} + handlerTag={289} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -177,7 +177,7 @@ exports[`MessageComposer Audio tap record 1`] = ` borderless={true} collapsable={false} delayLongPress={600} - handlerTag={254} + handlerTag={290} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -299,7 +299,7 @@ exports[`MessageComposer Quote Add quote \`abc\` 1`] = ` borderless={true} collapsable={false} delayLongPress={600} - handlerTag={240} + handlerTag={276} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -415,7 +415,7 @@ exports[`MessageComposer Quote Add quote \`abc\` 1`] = ` borderless={true} collapsable={false} delayLongPress={600} - handlerTag={241} + handlerTag={277} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -587,7 +587,7 @@ exports[`MessageComposer Quote Add quote \`abc\` 1`] = ` borderless={true} collapsable={false} delayLongPress={600} - handlerTag={242} + handlerTag={278} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -744,7 +744,7 @@ exports[`MessageComposer Quote Add quote \`def\` 1`] = ` borderless={true} collapsable={false} delayLongPress={600} - handlerTag={243} + handlerTag={279} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -860,7 +860,7 @@ exports[`MessageComposer Quote Add quote \`def\` 1`] = ` borderless={true} collapsable={false} delayLongPress={600} - handlerTag={244} + handlerTag={280} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -1033,7 +1033,7 @@ exports[`MessageComposer Quote Add quote \`def\` 1`] = ` borderless={true} collapsable={false} delayLongPress={600} - handlerTag={245} + handlerTag={281} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -1214,7 +1214,7 @@ exports[`MessageComposer Quote Add quote \`def\` 1`] = ` borderless={true} collapsable={false} delayLongPress={600} - handlerTag={246} + handlerTag={282} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -1371,7 +1371,7 @@ exports[`MessageComposer Quote Remove a quote 1`] = ` borderless={true} collapsable={false} delayLongPress={600} - handlerTag={247} + handlerTag={283} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -1487,7 +1487,7 @@ exports[`MessageComposer Quote Remove a quote 1`] = ` borderless={true} collapsable={false} delayLongPress={600} - handlerTag={248} + handlerTag={284} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -1660,7 +1660,7 @@ exports[`MessageComposer Quote Remove a quote 1`] = ` borderless={true} collapsable={false} delayLongPress={600} - handlerTag={249} + handlerTag={285} handlerType="NativeViewGestureHandler" hitSlop={ { @@ -1841,7 +1841,7 @@ exports[`MessageComposer Quote Remove a quote 1`] = ` borderless={true} collapsable={false} delayLongPress={600} - handlerTag={250} + handlerTag={286} handlerType="NativeViewGestureHandler" hitSlop={ { From 89ff2c0a87fef4281d79d83257a4281415926aa2 Mon Sep 17 00:00:00 2001 From: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com> Date: Fri, 28 Nov 2025 01:13:36 +0530 Subject: [PATCH 08/12] Added unit test for mention in autocomplete --- .../MessageComposer/MessageComposer.test.tsx | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/app/containers/MessageComposer/MessageComposer.test.tsx b/app/containers/MessageComposer/MessageComposer.test.tsx index 644decabae8..6a7a701a022 100644 --- a/app/containers/MessageComposer/MessageComposer.test.tsx +++ b/app/containers/MessageComposer/MessageComposer.test.tsx @@ -439,6 +439,70 @@ describe('MessageComposer', () => { expect(onSendMessage).toHaveBeenCalledWith('@john', undefined); }); + test('does not show @all or @here in autocomplete when user does not have permissions', async () => { + mockedStore.dispatch(setPermissions({ 'mention-all': [], 'mention-here': [] })); + const onSendMessage = jest.fn(); + render(); + + await fireEvent(screen.getByTestId('message-composer-input'), 'focus'); + await fireEvent.changeText(screen.getByTestId('message-composer-input'), '@'); + await fireEvent(screen.getByTestId('message-composer-input'), 'selectionChange', { + nativeEvent: { selection: { start: 1, end: 1 } } + }); + jest.advanceTimersByTime(500); + + await waitFor(() => expect(screen.queryByTestId('autocomplete-item-all')).not.toBeOnTheScreen()); + await waitFor(() => expect(screen.queryByTestId('autocomplete-item-here')).not.toBeOnTheScreen()); + }); + + test('shows only @all when user has mention-all permission', async () => { + mockedStore.dispatch(setPermissions({ 'mention-all': ['user'], 'mention-here': [] })); + const onSendMessage = jest.fn(); + render(); + + await fireEvent(screen.getByTestId('message-composer-input'), 'focus'); + await fireEvent.changeText(screen.getByTestId('message-composer-input'), '@'); + await fireEvent(screen.getByTestId('message-composer-input'), 'selectionChange', { + nativeEvent: { selection: { start: 1, end: 1 } } + }); + jest.advanceTimersByTime(500); + + await waitFor(() => expect(screen.queryByTestId('autocomplete-item-all')).toBeOnTheScreen()); + await waitFor(() => expect(screen.queryByTestId('autocomplete-item-here')).not.toBeOnTheScreen()); + }); + + test('shows only @here when user has mention-here permission', async () => { + mockedStore.dispatch(setPermissions({ 'mention-here': ['user'], 'mention-all': [''] })); + const onSendMessage = jest.fn(); + render(); + + await fireEvent(screen.getByTestId('message-composer-input'), 'focus'); + await fireEvent.changeText(screen.getByTestId('message-composer-input'), '@'); + await fireEvent(screen.getByTestId('message-composer-input'), 'selectionChange', { + nativeEvent: { selection: { start: 1, end: 1 } } + }); + jest.advanceTimersByTime(500); + + await waitFor(() => expect(screen.queryByTestId('autocomplete-item-here')).toBeOnTheScreen()); + await waitFor(() => expect(screen.queryByTestId('autocomplete-item-all')).not.toBeOnTheScreen()); + }); + + test('shows both @all and @here when user has both permissions', async () => { + mockedStore.dispatch(setPermissions({ 'mention-all': ['user'], 'mention-here': ['user'] })); + const onSendMessage = jest.fn(); + render(); + + await fireEvent(screen.getByTestId('message-composer-input'), 'focus'); + await fireEvent.changeText(screen.getByTestId('message-composer-input'), '@'); + await fireEvent(screen.getByTestId('message-composer-input'), 'selectionChange', { + nativeEvent: { selection: { start: 1, end: 1 } } + }); + jest.advanceTimersByTime(500); + + await waitFor(() => expect(screen.queryByTestId('autocomplete-item-all')).toBeOnTheScreen()); + await waitFor(() => expect(screen.queryByTestId('autocomplete-item-here')).toBeOnTheScreen()); + }); + test('select # room inserts channel and sends, autocomplete hides', async () => { const onSendMessage = jest.fn(); (search as unknown as jest.Mock).mockImplementationOnce(() => [{ rid: 'r1', name: 'general', t: 'c' }]); From 1f032df1726605df9f061c4484745b2aa2cf7f4c Mon Sep 17 00:00:00 2001 From: Rohit3523 Date: Thu, 27 Nov 2025 19:45:16 +0000 Subject: [PATCH 09/12] chore: format code and fix lint issues [skip ci] --- .../MessageComposer/MessageComposer.test.tsx | 126 +++++++++--------- 1 file changed, 63 insertions(+), 63 deletions(-) diff --git a/app/containers/MessageComposer/MessageComposer.test.tsx b/app/containers/MessageComposer/MessageComposer.test.tsx index 6a7a701a022..ada78fd2232 100644 --- a/app/containers/MessageComposer/MessageComposer.test.tsx +++ b/app/containers/MessageComposer/MessageComposer.test.tsx @@ -439,69 +439,69 @@ describe('MessageComposer', () => { expect(onSendMessage).toHaveBeenCalledWith('@john', undefined); }); - test('does not show @all or @here in autocomplete when user does not have permissions', async () => { - mockedStore.dispatch(setPermissions({ 'mention-all': [], 'mention-here': [] })); - const onSendMessage = jest.fn(); - render(); - - await fireEvent(screen.getByTestId('message-composer-input'), 'focus'); - await fireEvent.changeText(screen.getByTestId('message-composer-input'), '@'); - await fireEvent(screen.getByTestId('message-composer-input'), 'selectionChange', { - nativeEvent: { selection: { start: 1, end: 1 } } - }); - jest.advanceTimersByTime(500); - - await waitFor(() => expect(screen.queryByTestId('autocomplete-item-all')).not.toBeOnTheScreen()); - await waitFor(() => expect(screen.queryByTestId('autocomplete-item-here')).not.toBeOnTheScreen()); - }); - - test('shows only @all when user has mention-all permission', async () => { - mockedStore.dispatch(setPermissions({ 'mention-all': ['user'], 'mention-here': [] })); - const onSendMessage = jest.fn(); - render(); - - await fireEvent(screen.getByTestId('message-composer-input'), 'focus'); - await fireEvent.changeText(screen.getByTestId('message-composer-input'), '@'); - await fireEvent(screen.getByTestId('message-composer-input'), 'selectionChange', { - nativeEvent: { selection: { start: 1, end: 1 } } - }); - jest.advanceTimersByTime(500); - - await waitFor(() => expect(screen.queryByTestId('autocomplete-item-all')).toBeOnTheScreen()); - await waitFor(() => expect(screen.queryByTestId('autocomplete-item-here')).not.toBeOnTheScreen()); - }); - - test('shows only @here when user has mention-here permission', async () => { - mockedStore.dispatch(setPermissions({ 'mention-here': ['user'], 'mention-all': [''] })); - const onSendMessage = jest.fn(); - render(); - - await fireEvent(screen.getByTestId('message-composer-input'), 'focus'); - await fireEvent.changeText(screen.getByTestId('message-composer-input'), '@'); - await fireEvent(screen.getByTestId('message-composer-input'), 'selectionChange', { - nativeEvent: { selection: { start: 1, end: 1 } } - }); - jest.advanceTimersByTime(500); - - await waitFor(() => expect(screen.queryByTestId('autocomplete-item-here')).toBeOnTheScreen()); - await waitFor(() => expect(screen.queryByTestId('autocomplete-item-all')).not.toBeOnTheScreen()); - }); - - test('shows both @all and @here when user has both permissions', async () => { - mockedStore.dispatch(setPermissions({ 'mention-all': ['user'], 'mention-here': ['user'] })); - const onSendMessage = jest.fn(); - render(); - - await fireEvent(screen.getByTestId('message-composer-input'), 'focus'); - await fireEvent.changeText(screen.getByTestId('message-composer-input'), '@'); - await fireEvent(screen.getByTestId('message-composer-input'), 'selectionChange', { - nativeEvent: { selection: { start: 1, end: 1 } } - }); - jest.advanceTimersByTime(500); - - await waitFor(() => expect(screen.queryByTestId('autocomplete-item-all')).toBeOnTheScreen()); - await waitFor(() => expect(screen.queryByTestId('autocomplete-item-here')).toBeOnTheScreen()); - }); + test('does not show @all or @here in autocomplete when user does not have permissions', async () => { + mockedStore.dispatch(setPermissions({ 'mention-all': [], 'mention-here': [] })); + const onSendMessage = jest.fn(); + render(); + + await fireEvent(screen.getByTestId('message-composer-input'), 'focus'); + await fireEvent.changeText(screen.getByTestId('message-composer-input'), '@'); + await fireEvent(screen.getByTestId('message-composer-input'), 'selectionChange', { + nativeEvent: { selection: { start: 1, end: 1 } } + }); + jest.advanceTimersByTime(500); + + await waitFor(() => expect(screen.queryByTestId('autocomplete-item-all')).not.toBeOnTheScreen()); + await waitFor(() => expect(screen.queryByTestId('autocomplete-item-here')).not.toBeOnTheScreen()); + }); + + test('shows only @all when user has mention-all permission', async () => { + mockedStore.dispatch(setPermissions({ 'mention-all': ['user'], 'mention-here': [] })); + const onSendMessage = jest.fn(); + render(); + + await fireEvent(screen.getByTestId('message-composer-input'), 'focus'); + await fireEvent.changeText(screen.getByTestId('message-composer-input'), '@'); + await fireEvent(screen.getByTestId('message-composer-input'), 'selectionChange', { + nativeEvent: { selection: { start: 1, end: 1 } } + }); + jest.advanceTimersByTime(500); + + await waitFor(() => expect(screen.queryByTestId('autocomplete-item-all')).toBeOnTheScreen()); + await waitFor(() => expect(screen.queryByTestId('autocomplete-item-here')).not.toBeOnTheScreen()); + }); + + test('shows only @here when user has mention-here permission', async () => { + mockedStore.dispatch(setPermissions({ 'mention-here': ['user'], 'mention-all': [''] })); + const onSendMessage = jest.fn(); + render(); + + await fireEvent(screen.getByTestId('message-composer-input'), 'focus'); + await fireEvent.changeText(screen.getByTestId('message-composer-input'), '@'); + await fireEvent(screen.getByTestId('message-composer-input'), 'selectionChange', { + nativeEvent: { selection: { start: 1, end: 1 } } + }); + jest.advanceTimersByTime(500); + + await waitFor(() => expect(screen.queryByTestId('autocomplete-item-here')).toBeOnTheScreen()); + await waitFor(() => expect(screen.queryByTestId('autocomplete-item-all')).not.toBeOnTheScreen()); + }); + + test('shows both @all and @here when user has both permissions', async () => { + mockedStore.dispatch(setPermissions({ 'mention-all': ['user'], 'mention-here': ['user'] })); + const onSendMessage = jest.fn(); + render(); + + await fireEvent(screen.getByTestId('message-composer-input'), 'focus'); + await fireEvent.changeText(screen.getByTestId('message-composer-input'), '@'); + await fireEvent(screen.getByTestId('message-composer-input'), 'selectionChange', { + nativeEvent: { selection: { start: 1, end: 1 } } + }); + jest.advanceTimersByTime(500); + + await waitFor(() => expect(screen.queryByTestId('autocomplete-item-all')).toBeOnTheScreen()); + await waitFor(() => expect(screen.queryByTestId('autocomplete-item-here')).toBeOnTheScreen()); + }); test('select # room inserts channel and sends, autocomplete hides', async () => { const onSendMessage = jest.fn(); From 10f0c4d07d68f06ed6c4711e8069b421a58db818 Mon Sep 17 00:00:00 2001 From: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com> Date: Fri, 28 Nov 2025 01:16:00 +0530 Subject: [PATCH 10/12] rerun ci --- app/containers/MessageComposer/MessageComposer.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/containers/MessageComposer/MessageComposer.test.tsx b/app/containers/MessageComposer/MessageComposer.test.tsx index ada78fd2232..906ba57aa7c 100644 --- a/app/containers/MessageComposer/MessageComposer.test.tsx +++ b/app/containers/MessageComposer/MessageComposer.test.tsx @@ -439,7 +439,7 @@ describe('MessageComposer', () => { expect(onSendMessage).toHaveBeenCalledWith('@john', undefined); }); - test('does not show @all or @here in autocomplete when user does not have permissions', async () => { + test('does not show @all or @here in autocomplete when user does not have permissions ', async () => { mockedStore.dispatch(setPermissions({ 'mention-all': [], 'mention-here': [] })); const onSendMessage = jest.fn(); render(); From e554a492216ece881f5e48403a88e3f83b7a6511 Mon Sep 17 00:00:00 2001 From: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com> Date: Fri, 28 Nov 2025 01:16:05 +0530 Subject: [PATCH 11/12] revert --- app/containers/MessageComposer/MessageComposer.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/containers/MessageComposer/MessageComposer.test.tsx b/app/containers/MessageComposer/MessageComposer.test.tsx index 906ba57aa7c..ada78fd2232 100644 --- a/app/containers/MessageComposer/MessageComposer.test.tsx +++ b/app/containers/MessageComposer/MessageComposer.test.tsx @@ -439,7 +439,7 @@ describe('MessageComposer', () => { expect(onSendMessage).toHaveBeenCalledWith('@john', undefined); }); - test('does not show @all or @here in autocomplete when user does not have permissions ', async () => { + test('does not show @all or @here in autocomplete when user does not have permissions', async () => { mockedStore.dispatch(setPermissions({ 'mention-all': [], 'mention-here': [] })); const onSendMessage = jest.fn(); render(); From b1f9867beec879fa7bcc3aa42ee24a353407ac31 Mon Sep 17 00:00:00 2001 From: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com> Date: Fri, 28 Nov 2025 01:35:59 +0530 Subject: [PATCH 12/12] pass empty array --- app/containers/MessageComposer/MessageComposer.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/containers/MessageComposer/MessageComposer.test.tsx b/app/containers/MessageComposer/MessageComposer.test.tsx index ada78fd2232..cd63fddf52d 100644 --- a/app/containers/MessageComposer/MessageComposer.test.tsx +++ b/app/containers/MessageComposer/MessageComposer.test.tsx @@ -472,7 +472,7 @@ describe('MessageComposer', () => { }); test('shows only @here when user has mention-here permission', async () => { - mockedStore.dispatch(setPermissions({ 'mention-here': ['user'], 'mention-all': [''] })); + mockedStore.dispatch(setPermissions({ 'mention-here': ['user'], 'mention-all': [] })); const onSendMessage = jest.fn(); render();