This package provides React Component to achieve GitHub's like functionality in comments regarding the textarea autocomplete. It can be used for example for emoji autocomplete or for @mentions. The render function (for displaying text enhanced by this textarea) is beyond the scope of this package and it should be solved separately.
This module is distributed via npm and should be installed as one of your project's dependencies
:
yarn add @webscopeio/react-textarea-autocomplete
This package also depends on
react
andprop-types
. Please make sure you have those installed as well.
Note: Every other props than the mentioned below will be propagated to textarea itself
Props | Default | Type | Description |
---|---|---|---|
loadingComponent | required | React Component | Gets data props which is already fetched (and displayed) suggestion |
trigger | required | Object (Trigger type) | Define triggers and their corresponding behavior |
minChar | optional | Number (= 1) | Number of characters that user should type for trigger a suggestion |
style | optional | Style Object | Style's of textarea |
containerStyle | optional | Style Object | Style's of textarea's container |
{
[triggerChar: string]: {
?output: (item: Object | string, trigger?: string) => string,
dataProvider: (token: string) => Promise<Array<Object | string>> | Array<Object | string>,
component: ReactClass<*>,
},
}
-
dataProvider is called after each keystroke to get data what the suggestion list should display (array or promise resolving array)
-
component is the component for render the item in suggestion list. It has
selected
andentity
props provided by React Textarea Autocomplete -
output (Optional for string based item. If the item is an object this method is required) This function defines text which will be placed into textarea after the user makes a selection.
Default behavior for string based item is string:
<TRIGGER><ITEM><TRIGGER>
). This method should always return a unique string.
import React, { Component } from "react";
import ReactTextareaAutocomplete from "@webscopeio/react-textarea-autocomplete";
import emoji from "@jukben/emoji-search";
import logo from "./logo.svg";
import "./App.css";
import "@webscopeio/react-textarea-autocomplete/dist/default-style.css";
const Item = ({ entity: { name, char } }) => <div>{`${name}: ${char}`}</div>;
const Loading = ({ data }) => <div>Loading</div>;
class App extends Component {
render() {
return (
<div className="App">
<div className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<h2>Welcome to React</h2>
</div>
<ReactTextareaAutocomplete
className="my-textarea"
loadingComponent={Loading}
style={{
fontSize: "18px",
lineHeight: "20px",
padding: 5
}}
containerStyle={{
marginTop: 20,
width: 400,
height: 100,
margin: "20px auto"
}}
minChar={0}
trigger={{
":": {
dataProvider: token => {
return emoji(token)
.slice(0, 10)
.map(({ name, char }) => ({ name, char }));
},
component: Item,
output: (item, trigger) => item.char
}
}}
/>
</div>
);
}
}
export default App;
Run yarn
to fetch dependencies.
Run yarn dev
for bundling.
In the folder run yarn link
and then in your project folder yarn link react-textarea-autocomplete
to link together.
Your PR's are welcomed! β€οΈ
Thanks goes to these wonderful people (emoji key):
Jakub BeneΕ‘ π» π |
Andrey Taktaev π» |
---|
This project follows the all-contributors specification. Contributions of any kind welcome!
MIT