ReactNative TextInput with enhanced capabilities for mentions
- Tag multiple items using different characters
- Live search across mentionable items
- Customizable textinput icons and style
- Search among words with spaces
- Detox-tested and works as a charm out of the box!
- Hook useMention available
yarn add react-native-mentionable-textinput
yarn add react-native-device-info
cd ios; pod install; cd ..
sample.mov
import { TextInputMention } from "react-native-mentionable-textinput";
// ...
<TextInputMention
mentionsTypes={[
{
type: 'users',
mentionChar: '@',
},
{
type: 'channels',
mentionChar: '#',
},
]}
onSend={onSubmit}
searchMentionableItems={searchItems}
mentionableItems={itemsFound}
submitIcon={<Image style={iconStyle} source={{ uri: send }} />}
mentionIcon={<Image style={iconStyle} source={{ uri: email }} />}
closeIcon={<Image style={iconStyle} source={{ uri: close }} />}
maxHeightMentionWindow={200}
/>
Name | Type | Mandatory | Additional info |
---|---|---|---|
mentionsTypes | Array | ✔️ | Type of objects that can be mentioned |
initialText | string | ❌ | Initial text of the text input |
placeholder | string | ❌ | Text input placeholder |
initialMentioned | Array | ❌ | Every mention is contained in this array. Fill it with inital mention elements |
isMentionsDisabled | boolean | ❌ | False if text input should not have mentions |
isSendButtonDisabled | boolean | ❌ | True if text input submit button is disable. |
isSmartSearchEnabled | boolean | ❌ | True if smart search should be enabled |
children | Array<JSX.Element> | ❌ | Optional view that will be attached above text input |
mentionableItems | Array | ✔️ | List of visible items that can be mentioned |
searchMentionableItems | (mentionType: string, searchText: string) => void | ✔️ | Search callback to filter mentionable items |
onChangeText | (text: string, mentioned: Array) => void | ❌ | Callback passed to text input |
onMentionClose | () => void | ❌ | Callback when the list of mentionable items is closed |
onSend | (text: string, mentioned: Array) | ✔️ | Called on submit |
onEndTyping | () => void | ❌ | Callback passed to text input |
textStyle | StyleProp | ❌ | Style of text, excluded mentions |
mentionStyle | StyleProp | ❌ | Style of mentions, included mention character |
mentionContainerStyle | StyleProp | ❌ | Style of mentions container view |
textInputContainerStyle | StyleProp | ❌ | Style of text input container |
separatorColor | string | ❌ | Color of the separator between text input and mention window |
submitIcon | JSX.Element | ✔️ | Icon for on submit action |
mentionIcon | JSX.Element | ✔️ | Icon for mention |
closeIcon | JSX.Element | ✔️ | Icon for close |
textInputProps | TextInputProps | ❌ | Props for native TextInput |
keyboardAvoidingViewProps | KeyboardAvoidingViewProps | ❌ | Props for native KeyboardAvoidingView |
maxHeightMentionWindow | number | ✔️ | Max height of mentions container view |
renderMentionType | (mentionType: string) => JSX.Element | ❌ | Custom render of mentionable items |
useMentions
is born as a plugin to add mentions to a component that has the properties of text input. The following are needed:
The hook can be attached as a plugin to any component that accepts these props.
You can create with
const hook = useMention({
searchMentionableItems: mySearchFunction,
mentionableItems: myResultsOfSearchMentionableItems
onSend: mySendFunction,
mentionsTypes: [
{
type: 'TYPE_1',
mentionChar: '+',
}
],
mentionableItems: [
{id: '1', label: 'First item label', type: 'TYPE_1'},
...
],
...
});
and the following properties are available:
Name | Type | Additional info |
---|---|---|
mentioned | Array | List of mentioned items added |
formattedText | string | Complete label to place into input text |
onChangeText | (text: string, mentioned: Array<Mention>) => void | Callback when text changes, passed to TextInput |
onSelectionChange | (event: { nativeEvent: { selection: CursorPosition } }) => void | Callback when text is selected, passed to TextInput |
cursorPosition | { start: number; end: number } | Position of the cursor |
addMention | (mention: {id: string; label: string; type: T}) => void | Add a new mentioned item |
chosenMentionType | string - type T | Type of the selected mention item |
showMentionItems | boolean | Check if mention items should be visible |
showMentionTypes | boolean | Check if mention types should be visible |
isMentionsDisabled | boolean | Check if mention feature is enabled |
onSendCallback | () => void | Calls onSend passed as props to the hook. Internally it uses onSend(inputText, mentioned) |
onPressMentionIcon | () => void | Callback when mention icon is pressed |
mentionableItems | Array<MentionListItem> | List of all mentionable items |
onPressMentionType | (mentionType: T, localCursorPosition?: CursorPosition) => void | Prepares the hook to give you the data to show the mentions type |
closeMention | () => void | Prepare the hook to close the mention popup |
mentionItemsVisible | boolean | Check if showMentionItems with items list should be visible |
isTextUpdated | boolean | Returns if text has changed wrt initial text |
mentionsTypes | Array<MentionItemType> | List of mention types |
isSmartSearchEnabled | boolean | True if smart search is active |
searchMentionPositions | Array<SearchCursorPosition> | List of positions of all mentions |
inputText | string | It's the text contained in the input field |
setInputText | (text): string => void | Sets text inside textinput |
This hook could be used to create you own custom component using some of this library logic. Let me know if you find it useful!
See the contributing guide to learn how to contribute to the repository and the development workflow.
MIT