2021-07-19 17:26:41 +00:00
# 🚀 rn-emoji-keyboard
A lightweight emoji picker, fully customizable, written as React Native component (without native elements). Designated to be user and developer friendly! 💖
2021-07-03 17:51:30 +00:00
2021-07-10 14:07:16 +00:00
![Preview ](/example/assets/preview-small.gif )
2021-07-03 17:51:30 +00:00
2021-07-19 17:26:41 +00:00
## 🪄 Installation
```sh
yarn add rn-emoji-keyboard
```
or
```sh
npm install rn-emoji-keyboard
```
## ⚡️ Usage
2021-07-03 17:51:30 +00:00
```js
2021-07-19 17:26:41 +00:00
import EmojiPicker from 'rn-emoji-keyboard';
2021-07-08 13:10:57 +00:00
export default function App() {
const [isOpen, setIsOpen] = React.useState< boolean > (false);
2021-07-03 17:51:30 +00:00
2021-07-08 13:10:57 +00:00
const handlePick = (emojiObject: EmojiType) => {
console.log(emojiObject);
2021-07-16 12:20:44 +00:00
/* example emojiObject = {
2021-07-08 13:10:57 +00:00
"emoji": "❤️",
"name": "red heart",
"slug": "red_heart",
2021-07-16 12:20:44 +00:00
}
2021-07-08 13:10:57 +00:00
*/
};
2021-07-03 17:51:30 +00:00
2021-07-08 13:10:57 +00:00
return (
< EmojiPicker
onEmojiSelected={handleSelect}
open={isOpen}
onClose={() => setIsOpen(false)} />
)
}
2021-07-03 17:51:30 +00:00
```
2021-07-19 17:26:41 +00:00
## ⚙️ Accepted props (current implemented)
2021-07-08 13:10:57 +00:00
| Name | Type | Default Value | Required | Description |
|---|---|---|---|---|
| onEmojiSelected | function | undefined | yes | Callback on emoji selected |
| open | boolean | false | yes | Opens modal picker |
| onClose | function | undefined | yes | Request close modal *runs when onEmojiSelected or backdrop pressed* |
| emojiSize | number | 28 | no | Custom emoji size |
| headerStyles | TextStyle | {} | no | Override category name styles |
| knobStyles | ViewStyle | {} | no | Override knob styles |
| containerStyles | ViewStyle | {} | no | Override container styles |
| hideHeader | boolean | false | no | Hide category names |
| expandable | boolean | true | no | Show knob and enable expand on swipe up |
2021-07-10 10:39:52 +00:00
| defaultHeight | number \| string | "40%" | no | Specify collapsed container height (number is points, string is a percentage of the screen height) |
| expandedHeight | number \| string | "80%" | no | Specify expanded container height (number is points, string is a percentage of the screen height) _works only if expandable is true_ |
2021-07-08 13:10:57 +00:00
| backdropColor | string | "#00000055" | no | Change backdrop color and alpha |
2021-07-10 10:05:18 +00:00
| categoryColor | string | "#000000" | no | Change category item color |
| activeCategoryColor | string | "#005b96" | no | Change active category item color |
| categoryContainerColor | string | "#e3dbcd" | no | Change category container color |
2021-07-10 13:42:55 +00:00
| onCategoryChangeFailed | function | warn(info) | no | Callback on category change failed (info: {index, highestMeasuredFrameIndex, averageItemLength}) |
2021-07-12 09:17:39 +00:00
| translation | CategoryTranslation | en | no | Translation object *see translation section* |
2021-07-12 11:57:10 +00:00
| disabledCategory | CategoryTypes[] | [] | no | Hide categories by passing their slugs |
2021-07-19 17:26:41 +00:00
## 🇺🇸 Internationalization
2021-07-12 09:17:39 +00:00
### Pre-defined
Due to the limited translation possibilities, we only provide a few pre-defined translations into the following languages:
2021-07-19 17:26:41 +00:00
* `en` - English 🇺🇸
* `pl` - Polish 🇵🇱
2021-07-12 09:17:39 +00:00
First import lang and use it as `translation` prop.
```ts
2021-07-19 17:26:41 +00:00
import { pl } from 'rn-emoji-keyboard';
2021-07-12 09:17:39 +00:00
// ...
translation={pl}
```
2021-07-19 17:26:41 +00:00
### 🏁 Own
2021-07-12 09:17:39 +00:00
There is possibility to pass own translation to library with the prop called `translation` like this
```ts
translation={{
smileys_emotion: 'Smileys & Emotion',
people_body: 'People & Body',
animals_nature: 'Animals & Nature',
food_drink: 'Food & Drink',
travel_places: 'Travel & Places',
activities: 'Activities',
objects: 'Objects',
symbols: 'Symbols',
flags: 'Flags',
}}
```
*If you have written a translation into your language, we strongly encourage you to create a Pull Request and add your language to the package, following the example of other langs.*
2021-07-19 17:26:41 +00:00
## 📚 Full Example
2021-07-16 12:20:44 +00:00
```ts
import * as React from 'react';
import { Text, SafeAreaView, TouchableOpacity } from 'react-native';
2021-07-19 17:26:41 +00:00
import EmojiPicker from 'rn-emoji-keyboard';
import { EmojiType } from 'rn-emoji-keyboard/lib/typescript/types';
2021-07-16 12:20:44 +00:00
export default function App() {
2021-07-19 17:26:41 +00:00
const [result, setResult] = React.useState< string > ();
const [isModalOpen, setIsModalOpen] = React.useState< boolean > (false);
2021-07-16 12:20:44 +00:00
2021-07-19 17:26:41 +00:00
const handlePick = (emojiObject: EmojiType) => {
setResult(emojiObject.emoji);
setIsModalOpen(false);
2021-07-16 12:20:44 +00:00
};
return (
< SafeAreaView >
< Text > Selected emoji: {result}< / Text >
< TouchableOpacity onPress = {() = > setIsModalOpen(true)}>
< Text > Open< / Text >
< / TouchableOpacity >
< EmojiPicker
onEmojiSelected={handlePick}
open={isModalOpen}
onClose={() => setIsModalOpen(false)}
/>
< / SafeAreaView >
);
}
```
2021-07-19 17:26:41 +00:00
## 📈 Future plans
* Skin tone palette selector.
* Search bar.
* Hide forbidden emojis.
## ⚖️ License
2021-07-12 11:57:10 +00:00
** [MIT ](/LICENSE )**