Skip to content

Commit badc68a

Browse files
committed
adds ability to disable mentions
1 parent 695f702 commit badc68a

File tree

9 files changed

+59
-19
lines changed

9 files changed

+59
-19
lines changed

src/components/AutoCompleteTextarea/Textarea.js

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,7 @@ class ReactTextareaAutocomplete extends React.Component {
431431
'closeOnClickOutside',
432432
'containerClassName',
433433
'containerStyle',
434+
'disableMentions',
434435
'dropdownClassName',
435436
'dropdownStyle',
436437
'grow',
@@ -623,6 +624,7 @@ class ReactTextareaAutocomplete extends React.Component {
623624
className,
624625
containerClassName,
625626
containerStyle,
627+
disableMentions,
626628
dropdownClassName,
627629
dropdownStyle,
628630
itemClassName,
@@ -638,17 +640,13 @@ class ReactTextareaAutocomplete extends React.Component {
638640
const suggestionData = this._getSuggestions();
639641
const textToReplace = this._getTextToReplace();
640642

641-
let { maxRows } = this.props;
642-
if (!this.props.grow) maxRows = 1;
643-
644-
return (
645-
<div
646-
className={`rta ${dataLoading === true ? 'rta--loading' : ''} ${
647-
containerClassName || ''
648-
}`}
649-
style={containerStyle}
650-
>
651-
{(dataLoading || suggestionData) && currentTrigger && (
643+
const SuggestionListDropDown = () => {
644+
if (
645+
(dataLoading || suggestionData) &&
646+
currentTrigger &&
647+
!(disableMentions && currentTrigger === '@')
648+
) {
649+
return (
652650
<div
653651
className={`rta__autocomplete ${dropdownClassName || ''}`}
654652
ref={(ref) => {
@@ -671,7 +669,22 @@ class ReactTextareaAutocomplete extends React.Component {
671669
/>
672670
)}
673671
</div>
674-
)}
672+
);
673+
}
674+
return null;
675+
};
676+
677+
let { maxRows } = this.props;
678+
if (!this.props.grow) maxRows = 1;
679+
680+
return (
681+
<div
682+
className={`rta ${dataLoading === true ? 'rta--loading' : ''} ${
683+
containerClassName || ''
684+
}`}
685+
style={containerStyle}
686+
>
687+
<SuggestionListDropDown />
675688
<Textarea
676689
{...this._cleanUpProps()}
677690
className={`rta__textarea ${className || ''}`}
@@ -700,6 +713,7 @@ ReactTextareaAutocomplete.propTypes = {
700713
closeOnClickOutside: PropTypes.bool,
701714
containerClassName: PropTypes.string,
702715
containerStyle: PropTypes.object,
716+
disableMentions: PropTypes.bool,
703717
dropdownClassName: PropTypes.string,
704718
dropdownStyle: PropTypes.object,
705719
itemClassName: PropTypes.string,

src/components/ChatAutoComplete/ChatAutoComplete.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@ const emojiReplace = (word) => {
2525

2626
/** @type {React.FC<import("types").ChatAutoCompleteProps>} */
2727
const ChatAutoComplete = (props) => {
28+
const { commands, onSelectItem, triggers } = props;
29+
2830
const { channel } = useContext(ChannelContext);
31+
2932
const members = channel?.state?.members;
3033
const watchers = channel?.state?.watchers;
3134

@@ -66,7 +69,6 @@ const ChatAutoComplete = (props) => {
6669
[channel?.queryMembers],
6770
);
6871

69-
const { commands, onSelectItem, triggers } = props;
7072
/**
7173
* dataProvider accepts `onReady` function, which will executed once the data is ready.
7274
* Another approach would have been to simply return the data from dataProvider and let the
@@ -187,9 +189,9 @@ const ChatAutoComplete = (props) => {
187189
},
188190
},
189191
[
190-
members,
191-
getMembersAndWatchers,
192192
commands,
193+
getMembersAndWatchers,
194+
members,
193195
onSelectItem,
194196
queryMembersdebounced,
195197
triggers,
@@ -227,6 +229,7 @@ const ChatAutoComplete = (props) => {
227229
value={props.value}
228230
grow={props.grow}
229231
disabled={props.disabled}
232+
disableMentions={props.disableMentions}
230233
SuggestionList={props.SuggestionList}
231234
additionalTextareaProps={props.additionalTextareaProps}
232235
/>
@@ -242,6 +245,8 @@ ChatAutoComplete.propTypes = {
242245
maxRows: PropTypes.number,
243246
/** Make the textarea disabled */
244247
disabled: PropTypes.bool,
248+
/** Disable mentions */
249+
disableMentions: PropTypes.bool,
245250
/** The value of the textarea */
246251
value: PropTypes.string,
247252
/** Function to run on pasting within the textarea */

src/components/ChatAutoComplete/__tests__/ChatAutocomplete.test.js

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -110,13 +110,13 @@ describe('ChatAutoComplete', () => {
110110
it('should let you select users when you type @<username>', async () => {
111111
const onSelectItem = jest.fn();
112112
const userAutocompleteText = `@${user.name}`;
113-
const { typeText, findByText } = await renderComponent({ onSelectItem });
113+
const { typeText, getAllByText } = await renderComponent({ onSelectItem });
114114
typeText(userAutocompleteText);
115-
const userText = await findByText(user.name);
115+
const userText = await getAllByText(user.name);
116116

117-
expect(userText).toBeInTheDocument();
117+
expect(userText).toHaveLength(2);
118118

119-
fireEvent.click(userText);
119+
fireEvent.click(userText[1]);
120120

121121
expect(onSelectItem).toHaveBeenCalledWith(
122122
expect.objectContaining({
@@ -165,6 +165,19 @@ describe('ChatAutoComplete', () => {
165165
expect(textarea.value).toContain('/giphy');
166166
});
167167

168+
it('should disable mention popup list', async () => {
169+
const onSelectItem = jest.fn();
170+
const userAutocompleteText = `@${user.name}`;
171+
const { typeText, queryAllByText } = await renderComponent({
172+
onSelectItem,
173+
disableMentions: true,
174+
});
175+
typeText(userAutocompleteText);
176+
const userText = await queryAllByText(user.name);
177+
178+
expect(userText).toHaveLength(0);
179+
});
180+
168181
it('should use the queryMembers API for mentions if a channel has many members', async () => {
169182
const users = Array(100).fill().map(generateUser);
170183
const members = users.map((u) => generateMember({ user: u }));

src/components/MessageInput/MessageInput.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ const MessageInput = (props) => {
99
MessageInput.defaultProps = {
1010
focus: false,
1111
disabled: false,
12+
disableMentions: false,
1213
publishTypingEvent: true,
1314
grow: true,
1415
maxRows: 10,

src/components/MessageInput/MessageInputFlat.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ const MessageInputFlat = (props) => {
6464
triggers={props.autocompleteTriggers}
6565
grow={props.grow}
6666
disabled={props.disabled}
67+
disableMentions={props.disableMentions}
6768
SuggestionList={props.SuggestionList}
6869
additionalTextareaProps={props.additionalTextareaProps}
6970
/>

src/components/MessageInput/MessageInputLarge.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ const MessageInputLarge = (props) => {
9191
triggers={props.autocompleteTriggers}
9292
grow={props.grow}
9393
disabled={props.disabled}
94+
disableMentions={props.disableMentions}
9495
SuggestionList={props.SuggestionList}
9596
additionalTextareaProps={props.additionalTextareaProps}
9697
/>

src/components/MessageInput/MessageInputSimple.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ const MessageInputSimple = (props) => {
4343
triggers={props.autocompleteTriggers}
4444
grow={props.grow}
4545
disabled={props.disabled}
46+
disableMentions={props.disableMentions}
4647
SuggestionList={props.SuggestionList}
4748
additionalTextareaProps={props.additionalTextareaProps}
4849
/>

src/components/MessageInput/MessageInputSmall.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ const MessageInputSmall = (props) => {
6565
triggers={props.autocompleteTriggers}
6666
grow={props.grow}
6767
disabled={props.disabled}
68+
disableMentions={props.disableMentions}
6869
SuggestionList={props.SuggestionList}
6970
additionalTextareaProps={props.additionalTextareaProps}
7071
/>

types/index.d.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,8 @@ export interface MessageInputProps {
655655
/** Disable input */
656656
disabled?: boolean;
657657
/** enable/disable firing the typing event */
658+
disableMentions?: boolean;
659+
/** enable/disable firing the typing event */
658660
publishTypingEvent?: boolean;
659661
/** Grow the textarea while you're typing */
660662
grow?: boolean;
@@ -1098,6 +1100,7 @@ export interface ChatAutoCompleteProps {
10981100
grow?: boolean;
10991101
maxRows?: number;
11001102
disabled?: boolean;
1103+
disableMentions?: boolean;
11011104
value?: string;
11021105
handleSubmit?(event: React.FormEvent): void;
11031106
onChange?(event: React.ChangeEventHandler): void;

0 commit comments

Comments
 (0)