Skip to content

terraware/react-native-emoji-picker

ย 
ย 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

11 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

React Native Emoji Picker

npm version license downloads

React Native Emoji Picker

A powerful, flexible emoji picker for React Native with modal and inline modes, extensive customization, and cross-platform support.

Important note: This component was โ€œvibe coded,โ€ so it may have issues. Please use it with caution.

โœจ Features

  • ๐ŸŽฏ Flexible Integration - Modal, inline, or headless with hooks
  • ๐Ÿ› ๏ธ High Customization - Allows for almost total freedom
  • ๐Ÿ” Smart Search - Fast emoji search with debouncing
  • ๐Ÿ“‚ Category Navigation - Intuitive tab-based browsing
  • ๐Ÿ• Recent Emojis - Automatically tracks frequently used emojis
  • ๐ŸŽจ Full Theming - Built-in dark mode + custom themes
  • โšก High Performance - Optimized FlatList rendering
  • ๐Ÿ“ฑ Cross-Platform - iOS, Android, and Web ready

๐ŸŽ‰ Expo Go Compatible

This library works seamlessly with Expo Go - no custom native code required! All dependencies are supported in Expo managed workflow. Just install and start using it in your Expo projects.

๐ŸŽฎ Live Demo

Try out the interactive demo with customization options: react-native-emoji-picker.netlify.app

๐Ÿ“ฆ Installation

npm install @hiraku-ai/react-native-emoji-picker

Peer Dependencies

npm install @react-native-async-storage/async-storage react-native-svg

๐Ÿš€ Quick Start

Modal Version

import React, { useState } from 'react';
import EmojiPickerModal, { emojiData } from '@hiraku-ai/react-native-emoji-picker';

function App() {
  const [visible, setVisible] = useState(false);

  return (
    <>
      <Button title="Pick Emoji" onPress={() => setVisible(true)} />
      <EmojiPickerModal
        visible={visible}
        onClose={() => setVisible(false)}
        onEmojiSelect={(emoji) => console.log(emoji)}
        emojis={emojiData}
      />
    </>
  );
}

Inline Version

import { EmojiPicker, emojiData } from '@hiraku-ai/react-native-emoji-picker';

<View style={{ height: 400 }}>
  <EmojiPicker
    emojis={emojiData}
    onEmojiSelect={(emoji) => console.log(emoji)}
    onClose={() => {}}
  />
</View>

Bottom Sheet / Gesture Handler

Pass BottomSheetFlatList for both props to fix scroll conflicts on Android when using @gorhom/bottom-sheet.

import { BottomSheetFlatList } from '@gorhom/bottom-sheet';
import { EmojiPicker, emojiData } from '@hiraku-ai/react-native-emoji-picker';

<EmojiPicker
  emojis={emojiData}
  onEmojiSelect={(emoji) => console.log(emoji)}
  FlatListComponent={BottomSheetFlatList}
  TabFlatListComponent={BottomSheetFlatList}
/>

Headless Mode

import { useEmojiPicker, useEmojiPickerRenderer, EmojiPickerThemeProvider, emojiData } from '@hiraku-ai/react-native-emoji-picker';

function CustomPickerContent() {
  const { flatListData, emojiSections, selectedSkinTone, searchQuery, getModifiedEmoji, updateRecentEmojis } = useEmojiPicker({
    emojis: emojiData
  });

  const { renderItem, renderEmptyComponent } = useEmojiPickerRenderer({
    onEmojiSelect: (emoji) => console.log(emoji),
    getModifiedEmoji,
    updateRecentEmojis,
    selectedSkinTone,
    emojiSections,
    searchQuery,
  });

  // Bring your own scroll component
  return (
    <YourFlatList
      data={flatListData}
      renderItem={renderItem}
      ListEmptyComponent={renderEmptyComponent}
      keyExtractor={(item) => item.id}
    />
  );
}

function CustomPicker() {
  return (
    <EmojiPickerThemeProvider>
      <CustomPickerContent />
    </EmojiPickerThemeProvider>
  );
}

๐Ÿ“š What's Included

๐ŸŽฏ Ready-to-Use Components

Drop these in and you're done:

  • EmojiPickerModal - Full-featured modal with everything built-in
  • EmojiPicker - Embeddable inline version

๐Ÿ”ง Building Blocks for Custom UIs

Mix and match these standalone components:

  • EmojiSearch - Search bar with debouncing
  • EmojiTabs - Category navigation tabs
  • SkinToneSelector - Skin tone picker button
  • All category icons - Use our icon set in your custom UI

๐ŸŽจ Headless Mode for Total Control

Build completely custom interfaces:

  • useEmojiPicker - All logic: search, filtering, recent emojis, skin tones, category ordering
  • useEmojiPickerRenderer - Ready-made renderItem and renderEmptyComponent for your own scroll component
  • Complete control over layout โ€” works with BottomSheetFlatList, FlashList, or anything FlatList-compatible

๐ŸŽญ Theme System

  • EmojiPickerThemeProvider - Wrap your app for consistent theming
  • useEmojiPickerTheme - Access theme values anywhere
  • lightTheme / darkTheme - Pre-built themes
  • PartialTheme - Override specific colors

๐Ÿ“ฆ Data & Utilities

  • emojiData - Complete emoji dataset (3600+ emojis)
  • SKIN_TONES - All skin tone modifiers
  • Category - Category constants
  • Full TypeScript types included

๐Ÿ“– Documentation

๐Ÿ“„ License

Apache License 2.0

๐Ÿ‘จโ€๐Ÿ’ป Author

Stef Buzas (https://stefbuzas.com) at Hiraku (https://hiraku.ai)

๐Ÿ”— Links

About

Simple React Native Emoji Picker

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • TypeScript 100.0%