expo-native-sheet-emojis 1.6.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -306,6 +306,7 @@ A declarative React component that renders the emoji picker inline.
306
306
  | Prop | Type | Default | Description |
307
307
  |-|-|-|-|
308
308
  | onEmojiSelected | `(emoji: string) => void` | required | Called when an emoji is tapped |
309
+ | onDismiss | `() => void` | -- | Called when the picker is dismissed (View API only, not Embedded view) |
309
310
  | theme | `EmojiSheetTheme \| 'dark' \| 'light' \| 'system'` | `'light'` | Theme configuration |
310
311
  | translations | `EmojiSheetTranslations` | -- | Localized strings |
311
312
  | categoryBarPosition | `'top' \| 'bottom'` | `'top'` | Position of the category tab bar |
@@ -44,7 +44,7 @@ android {
44
44
  dependencies {
45
45
  implementation "androidx.recyclerview:recyclerview:1.3.2"
46
46
  implementation "androidx.appcompat:appcompat:1.6.1"
47
- implementation "com.google.android.material:material:1.11.0"
47
+ implementation "com.google.android.material:material:1.12.0"
48
48
  implementation "androidx.emoji2:emoji2:1.6.0"
49
49
  implementation "androidx.emoji2:emoji2-views-helper:1.6.0"
50
50
  }
@@ -53,7 +53,7 @@ class EmojiSearchBar(
53
53
  layoutParams = lp
54
54
 
55
55
  searchIcon = ImageView(context).apply {
56
- setImageResource(android.R.drawable.ic_menu_search)
56
+ setImageResource(R.drawable.ic_search)
57
57
  scaleType = ImageView.ScaleType.CENTER_INSIDE
58
58
  val iconLp = LayoutParams(iconWidth, LayoutParams.MATCH_PARENT)
59
59
  layoutParams = iconLp
@@ -13,6 +13,7 @@ class EmojiSheetContentView(
13
13
  ) : ExpoView(context, appContext) {
14
14
 
15
15
  private val onEmojiSelected by EventDispatcher()
16
+ private val onDismiss by EventDispatcher()
16
17
  private val pickerView = EmojiSheetUIView(context)
17
18
 
18
19
  init {
@@ -112,7 +112,7 @@ class EmojiSheetModule : Module() {
112
112
  Prop("excludeEmojis") { view: EmojiSheetContentView, ids: List<String>? ->
113
113
  view.updateExcludeEmojis(ids ?: emptyList())
114
114
  }
115
- Events("onEmojiSelected")
115
+ Events("onEmojiSelected", "onDismiss")
116
116
  }
117
117
  }
118
118
 
@@ -97,6 +97,7 @@ class EmojiSheetUIView(context: Context) : LinearLayout(context) {
97
97
  private val recyclerView: RecyclerView
98
98
  private val gridAdapter: EmojiGridAdapter
99
99
  private val gridLayoutManager: GridLayoutManager
100
+ private val stickyHeaderDecoration: StickyHeaderDecoration
100
101
  private val emptyStateLabel: TextView
101
102
  private val contentFrame: FrameLayout
102
103
 
@@ -156,6 +157,8 @@ class EmojiSheetUIView(context: Context) : LinearLayout(context) {
156
157
  recyclerView = RecyclerView(context).apply {
157
158
  layoutManager = gridLayoutManager
158
159
  adapter = gridAdapter
160
+ stickyHeaderDecoration = StickyHeaderDecoration(gridAdapter, currentTheme.backgroundColor)
161
+ addItemDecoration(stickyHeaderDecoration)
159
162
  setHasFixedSize(false)
160
163
  overScrollMode = View.OVER_SCROLL_NEVER
161
164
  isNestedScrollingEnabled = true
@@ -411,6 +414,7 @@ class EmojiSheetUIView(context: Context) : LinearLayout(context) {
411
414
  categoryStrip.applyTheme(theme)
412
415
  gridAdapter.updateTheme(theme)
413
416
  recyclerView.setBackgroundColor(theme.backgroundColor)
417
+ stickyHeaderDecoration.backgroundColor = theme.backgroundColor
414
418
  emptyStateLabel.setTextColor(theme.textSecondaryColor)
415
419
  }
416
420
 
@@ -0,0 +1,89 @@
1
+ package expo.community.modules.emojisheet
2
+
3
+ import android.graphics.Canvas
4
+ import android.view.View
5
+ import android.view.ViewGroup
6
+ import androidx.recyclerview.widget.RecyclerView
7
+
8
+ class StickyHeaderDecoration(
9
+ private val adapter: EmojiGridAdapter,
10
+ var backgroundColor: Int = 0
11
+ ) : RecyclerView.ItemDecoration() {
12
+
13
+ private var cachedHeaderPosition: Int = RecyclerView.NO_POSITION
14
+ private var cachedHeaderView: View? = null
15
+ private var cachedParentWidth: Int = 0
16
+
17
+ override fun onDrawOver(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
18
+ val topChild = parent.getChildAt(0) ?: return
19
+ val topPosition = parent.getChildAdapterPosition(topChild)
20
+ if (topPosition == RecyclerView.NO_POSITION) return
21
+
22
+ val headerPosition = findHeaderPositionBefore(topPosition)
23
+ if (headerPosition == RecyclerView.NO_POSITION) return
24
+
25
+ val headerView = getHeaderView(parent, headerPosition)
26
+
27
+ val nextHeaderPosition = findNextHeaderPosition(topPosition)
28
+ if (nextHeaderPosition != RecyclerView.NO_POSITION) {
29
+ val nextHeaderView = parent.findViewHolderForAdapterPosition(nextHeaderPosition)?.itemView
30
+ if (nextHeaderView != null && nextHeaderView.top < headerView.height) {
31
+ val offset = maxOf(0f, (nextHeaderView.top - headerView.height).toFloat())
32
+ c.save()
33
+ c.translate(0f, offset)
34
+ headerView.draw(c)
35
+ c.restore()
36
+ return
37
+ }
38
+ }
39
+
40
+ c.save()
41
+ c.translate(0f, 0f)
42
+ headerView.draw(c)
43
+ c.restore()
44
+ }
45
+
46
+ private fun getHeaderView(parent: RecyclerView, position: Int): View {
47
+ if (position == cachedHeaderPosition && cachedHeaderView != null && cachedParentWidth == parent.width) {
48
+ return cachedHeaderView!!
49
+ }
50
+ val holder = adapter.createViewHolder(parent, EmojiGridAdapter.VIEW_TYPE_HEADER)
51
+ adapter.bindViewHolder(holder, position)
52
+ val view = holder.itemView
53
+ if (backgroundColor != 0) {
54
+ view.setBackgroundColor(backgroundColor)
55
+ }
56
+ fixLayoutSize(parent, view)
57
+ cachedHeaderPosition = position
58
+ cachedHeaderView = view
59
+ cachedParentWidth = parent.width
60
+ return view
61
+ }
62
+
63
+ fun invalidateCache() {
64
+ cachedHeaderPosition = RecyclerView.NO_POSITION
65
+ cachedHeaderView = null
66
+ }
67
+
68
+ private fun findHeaderPositionBefore(pos: Int): Int {
69
+ for (i in pos downTo 0) {
70
+ if (adapter.getItemViewType(i) == EmojiGridAdapter.VIEW_TYPE_HEADER) return i
71
+ }
72
+ return RecyclerView.NO_POSITION
73
+ }
74
+
75
+ private fun findNextHeaderPosition(pos: Int): Int {
76
+ val count = adapter.itemCount
77
+ for (i in (pos + 1) until count) {
78
+ if (adapter.getItemViewType(i) == EmojiGridAdapter.VIEW_TYPE_HEADER) return i
79
+ }
80
+ return RecyclerView.NO_POSITION
81
+ }
82
+
83
+ private fun fixLayoutSize(parent: ViewGroup, view: View) {
84
+ val widthSpec = View.MeasureSpec.makeMeasureSpec(parent.width, View.MeasureSpec.EXACTLY)
85
+ val heightSpec = View.MeasureSpec.makeMeasureSpec(parent.height, View.MeasureSpec.UNSPECIFIED)
86
+ view.measure(widthSpec, heightSpec)
87
+ view.layout(0, 0, view.measuredWidth, view.measuredHeight)
88
+ }
89
+ }
@@ -0,0 +1,9 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="24dp"
3
+ android:height="24dp"
4
+ android:viewportWidth="24"
5
+ android:viewportHeight="24">
6
+ <path
7
+ android:fillColor="#000000"
8
+ android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z"/>
9
+ </vector>
@@ -21,6 +21,7 @@ struct EmojiSection {
21
21
 
22
22
  class EmojiSheetContentView: ExpoView, EmojiSheetUIViewDelegate {
23
23
  let onEmojiSelected = EventDispatcher()
24
+ let onDismiss = EventDispatcher()
24
25
  private let pickerView = EmojiSheetUIView()
25
26
 
26
27
  required init(appContext: AppContext? = nil) {
@@ -1,6 +1,6 @@
1
1
  Pod::Spec.new do |s|
2
2
  s.name = 'EmojiSheetModule'
3
- s.version = '1.6.0'
3
+ s.version = '1.7.0'
4
4
  s.summary = 'Native emoji picker bottom sheet for React Native'
5
5
  s.description = 'A fully native iOS/Android emoji picker presented in a bottom sheet with search, skin tones, and theming support.'
6
6
  s.author = ''
@@ -84,7 +84,7 @@ public class EmojiSheetModule: Module {
84
84
  Prop("excludeEmojis") { (view, ids: [String]?) in
85
85
  view.updateExcludeEmojis(ids ?? [])
86
86
  }
87
- Events("onEmojiSelected")
87
+ Events("onEmojiSelected", "onDismiss")
88
88
  }
89
89
  }
90
90
 
@@ -9,6 +9,7 @@ var _jsxRuntime = require("react/jsx-runtime");
9
9
  const NativeView = (0, _expo.requireNativeView)('EmojiSheet');
10
10
  function EmojiSheetView({
11
11
  onEmojiSelected,
12
+ onDismiss,
12
13
  theme,
13
14
  translations,
14
15
  categoryBarPosition,
@@ -49,7 +50,8 @@ function EmojiSheetView({
49
50
  nativeEvent
50
51
  }) => {
51
52
  onEmojiSelected(nativeEvent.emoji);
52
- }
53
+ },
54
+ onDismiss: onDismiss ? () => onDismiss() : undefined
53
55
  });
54
56
  }
55
57
  //# sourceMappingURL=EmojiSheetView.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_expo","require","_jsxRuntime","NativeView","requireNativeView","EmojiSheetView","onEmojiSelected","theme","translations","categoryBarPosition","columns","emojiSize","recentLimit","showSearch","showRecents","enableSkinTones","enableHaptics","enableAnimations","excludeEmojis","rest","resolvedTheme","jsx","searchPlaceholder","noResultsText","categoryNames","nativeEvent","emoji"],"sourceRoot":"../../src","sources":["EmojiSheetView.tsx"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAAyC,IAAAC,WAAA,GAAAD,OAAA;AAOzC,MAAME,UAA0D,GAC9D,IAAAC,uBAAiB,EAAC,YAAY,CAAC;AAElB,SAASC,cAAcA,CAAC;EACrCC,eAAe;EACfC,KAAK;EACLC,YAAY;EACZC,mBAAmB;EACnBC,OAAO;EACPC,SAAS;EACTC,WAAW;EACXC,UAAU;EACVC,WAAW;EACXC,eAAe;EACfC,aAAa;EACbC,gBAAgB;EAChBC,aAAa;EACb,GAAGC;AACgB,CAAC,EAAE;EACtB,MAAMC,aAAa,GAAG,OAAOb,KAAK,KAAK,QAAQ,GAAG,QAAQ,GAAGA,KAAK;;EAElE;EACA;EACA;;EAEA,oBACE,IAAAL,WAAA,CAAAmB,GAAA,EAAClB,UAAU;IAAA,GACLgB,IAAI;IACRZ,KAAK,EAAEa,aAAc;IACrBX,mBAAmB,EAAEA,mBAAoB;IACzCC,OAAO,EAAEA,OAAQ;IACjBC,SAAS,EAAEA,SAAU;IACrBC,WAAW,EAAEA,WAAY;IACzBC,UAAU,EAAEA,UAAW;IACvBC,WAAW,EAAEA,WAAY;IACzBC,eAAe,EAAEA,eAAgB;IACjCC,aAAa,EAAEA,aAAc;IAC7BC,gBAAgB,EAAEA,gBAAiB;IACnCC,aAAa,EAAEA,aAAc;IAC7BI,iBAAiB,EAAEd,YAAY,EAAEc,iBAAkB;IACnDC,aAAa,EAAEf,YAAY,EAAEe,aAAc;IAC3CC,aAAa,EAAEhB,YAAY,EAAEgB,aAAc;IAC3ClB,eAAe,EAAEA,CAAC;MAAEmB;IAAY,CAAC,KAAK;MACpCnB,eAAe,CAACmB,WAAW,CAACC,KAAK,CAAC;IACpC;EAAE,CACH,CAAC;AAEN","ignoreList":[]}
1
+ {"version":3,"names":["_expo","require","_jsxRuntime","NativeView","requireNativeView","EmojiSheetView","onEmojiSelected","onDismiss","theme","translations","categoryBarPosition","columns","emojiSize","recentLimit","showSearch","showRecents","enableSkinTones","enableHaptics","enableAnimations","excludeEmojis","rest","resolvedTheme","jsx","searchPlaceholder","noResultsText","categoryNames","nativeEvent","emoji","undefined"],"sourceRoot":"../../src","sources":["EmojiSheetView.tsx"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAAyC,IAAAC,WAAA,GAAAD,OAAA;AAOzC,MAAME,UAA0D,GAC9D,IAAAC,uBAAiB,EAAC,YAAY,CAAC;AAElB,SAASC,cAAcA,CAAC;EACrCC,eAAe;EACfC,SAAS;EACTC,KAAK;EACLC,YAAY;EACZC,mBAAmB;EACnBC,OAAO;EACPC,SAAS;EACTC,WAAW;EACXC,UAAU;EACVC,WAAW;EACXC,eAAe;EACfC,aAAa;EACbC,gBAAgB;EAChBC,aAAa;EACb,GAAGC;AACgB,CAAC,EAAE;EACtB,MAAMC,aAAa,GAAG,OAAOb,KAAK,KAAK,QAAQ,GAAG,QAAQ,GAAGA,KAAK;;EAElE;EACA;EACA;;EAEA,oBACE,IAAAN,WAAA,CAAAoB,GAAA,EAACnB,UAAU;IAAA,GACLiB,IAAI;IACRZ,KAAK,EAAEa,aAAc;IACrBX,mBAAmB,EAAEA,mBAAoB;IACzCC,OAAO,EAAEA,OAAQ;IACjBC,SAAS,EAAEA,SAAU;IACrBC,WAAW,EAAEA,WAAY;IACzBC,UAAU,EAAEA,UAAW;IACvBC,WAAW,EAAEA,WAAY;IACzBC,eAAe,EAAEA,eAAgB;IACjCC,aAAa,EAAEA,aAAc;IAC7BC,gBAAgB,EAAEA,gBAAiB;IACnCC,aAAa,EAAEA,aAAc;IAC7BI,iBAAiB,EAAEd,YAAY,EAAEc,iBAAkB;IACnDC,aAAa,EAAEf,YAAY,EAAEe,aAAc;IAC3CC,aAAa,EAAEhB,YAAY,EAAEgB,aAAc;IAC3CnB,eAAe,EAAEA,CAAC;MAAEoB;IAAY,CAAC,KAAK;MACpCpB,eAAe,CAACoB,WAAW,CAACC,KAAK,CAAC;IACpC,CAAE;IACFpB,SAAS,EAAEA,SAAS,GAAG,MAAMA,SAAS,CAAC,CAAC,GAAGqB;EAAU,CACtD,CAAC;AAEN","ignoreList":[]}
@@ -5,6 +5,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
5
5
  const NativeView = requireNativeView('EmojiSheet');
6
6
  export default function EmojiSheetView({
7
7
  onEmojiSelected,
8
+ onDismiss,
8
9
  theme,
9
10
  translations,
10
11
  categoryBarPosition,
@@ -45,7 +46,8 @@ export default function EmojiSheetView({
45
46
  nativeEvent
46
47
  }) => {
47
48
  onEmojiSelected(nativeEvent.emoji);
48
- }
49
+ },
50
+ onDismiss: onDismiss ? () => onDismiss() : undefined
49
51
  });
50
52
  }
51
53
  //# sourceMappingURL=EmojiSheetView.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["requireNativeView","jsx","_jsx","NativeView","EmojiSheetView","onEmojiSelected","theme","translations","categoryBarPosition","columns","emojiSize","recentLimit","showSearch","showRecents","enableSkinTones","enableHaptics","enableAnimations","excludeEmojis","rest","resolvedTheme","searchPlaceholder","noResultsText","categoryNames","nativeEvent","emoji"],"sourceRoot":"../../src","sources":["EmojiSheetView.tsx"],"mappings":";;AAAA,SAASA,iBAAiB,QAAQ,MAAM;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAOzC,MAAMC,UAA0D,GAC9DH,iBAAiB,CAAC,YAAY,CAAC;AAEjC,eAAe,SAASI,cAAcA,CAAC;EACrCC,eAAe;EACfC,KAAK;EACLC,YAAY;EACZC,mBAAmB;EACnBC,OAAO;EACPC,SAAS;EACTC,WAAW;EACXC,UAAU;EACVC,WAAW;EACXC,eAAe;EACfC,aAAa;EACbC,gBAAgB;EAChBC,aAAa;EACb,GAAGC;AACgB,CAAC,EAAE;EACtB,MAAMC,aAAa,GAAG,OAAOb,KAAK,KAAK,QAAQ,GAAG,QAAQ,GAAGA,KAAK;;EAElE;EACA;EACA;;EAEA,oBACEJ,IAAA,CAACC,UAAU;IAAA,GACLe,IAAI;IACRZ,KAAK,EAAEa,aAAc;IACrBX,mBAAmB,EAAEA,mBAAoB;IACzCC,OAAO,EAAEA,OAAQ;IACjBC,SAAS,EAAEA,SAAU;IACrBC,WAAW,EAAEA,WAAY;IACzBC,UAAU,EAAEA,UAAW;IACvBC,WAAW,EAAEA,WAAY;IACzBC,eAAe,EAAEA,eAAgB;IACjCC,aAAa,EAAEA,aAAc;IAC7BC,gBAAgB,EAAEA,gBAAiB;IACnCC,aAAa,EAAEA,aAAc;IAC7BG,iBAAiB,EAAEb,YAAY,EAAEa,iBAAkB;IACnDC,aAAa,EAAEd,YAAY,EAAEc,aAAc;IAC3CC,aAAa,EAAEf,YAAY,EAAEe,aAAc;IAC3CjB,eAAe,EAAEA,CAAC;MAAEkB;IAAY,CAAC,KAAK;MACpClB,eAAe,CAACkB,WAAW,CAACC,KAAK,CAAC;IACpC;EAAE,CACH,CAAC;AAEN","ignoreList":[]}
1
+ {"version":3,"names":["requireNativeView","jsx","_jsx","NativeView","EmojiSheetView","onEmojiSelected","onDismiss","theme","translations","categoryBarPosition","columns","emojiSize","recentLimit","showSearch","showRecents","enableSkinTones","enableHaptics","enableAnimations","excludeEmojis","rest","resolvedTheme","searchPlaceholder","noResultsText","categoryNames","nativeEvent","emoji","undefined"],"sourceRoot":"../../src","sources":["EmojiSheetView.tsx"],"mappings":";;AAAA,SAASA,iBAAiB,QAAQ,MAAM;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAOzC,MAAMC,UAA0D,GAC9DH,iBAAiB,CAAC,YAAY,CAAC;AAEjC,eAAe,SAASI,cAAcA,CAAC;EACrCC,eAAe;EACfC,SAAS;EACTC,KAAK;EACLC,YAAY;EACZC,mBAAmB;EACnBC,OAAO;EACPC,SAAS;EACTC,WAAW;EACXC,UAAU;EACVC,WAAW;EACXC,eAAe;EACfC,aAAa;EACbC,gBAAgB;EAChBC,aAAa;EACb,GAAGC;AACgB,CAAC,EAAE;EACtB,MAAMC,aAAa,GAAG,OAAOb,KAAK,KAAK,QAAQ,GAAG,QAAQ,GAAGA,KAAK;;EAElE;EACA;EACA;;EAEA,oBACEL,IAAA,CAACC,UAAU;IAAA,GACLgB,IAAI;IACRZ,KAAK,EAAEa,aAAc;IACrBX,mBAAmB,EAAEA,mBAAoB;IACzCC,OAAO,EAAEA,OAAQ;IACjBC,SAAS,EAAEA,SAAU;IACrBC,WAAW,EAAEA,WAAY;IACzBC,UAAU,EAAEA,UAAW;IACvBC,WAAW,EAAEA,WAAY;IACzBC,eAAe,EAAEA,eAAgB;IACjCC,aAAa,EAAEA,aAAc;IAC7BC,gBAAgB,EAAEA,gBAAiB;IACnCC,aAAa,EAAEA,aAAc;IAC7BG,iBAAiB,EAAEb,YAAY,EAAEa,iBAAkB;IACnDC,aAAa,EAAEd,YAAY,EAAEc,aAAc;IAC3CC,aAAa,EAAEf,YAAY,EAAEe,aAAc;IAC3ClB,eAAe,EAAEA,CAAC;MAAEmB;IAAY,CAAC,KAAK;MACpCnB,eAAe,CAACmB,WAAW,CAACC,KAAK,CAAC;IACpC,CAAE;IACFnB,SAAS,EAAEA,SAAS,GAAG,MAAMA,SAAS,CAAC,CAAC,GAAGoB;EAAU,CACtD,CAAC;AAEN","ignoreList":[]}
@@ -52,6 +52,7 @@ export type EmojiSelectionListener = (event: {
52
52
  }) => void;
53
53
  export type EmojiSheetViewProps = ViewProps & {
54
54
  onEmojiSelected: (emoji: string) => void;
55
+ onDismiss?: () => void;
55
56
  theme?: EmojiSheetTheme | 'dark' | 'light' | 'system';
56
57
  translations?: EmojiSheetTranslations;
57
58
  categoryBarPosition?: 'top' | 'bottom';
@@ -67,6 +68,9 @@ export type EmojiSheetViewProps = ViewProps & {
67
68
  };
68
69
  export type EmojiSheetNativeViewProps = ViewProps & {
69
70
  onEmojiSelected: EmojiSelectionListener;
71
+ onDismiss?: (event: {
72
+ nativeEvent: {};
73
+ }) => void;
70
74
  theme?: string;
71
75
  categoryBarPosition?: string;
72
76
  columns?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"EmojiSheetModule.types.d.ts","sourceRoot":"","sources":["../../src/EmojiSheetModule.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EmojiSheetModule.types.d.ts","sourceRoot":"","sources":["../../src/EmojiSheetModule.types.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  import type { EmojiSheetViewProps } from './EmojiSheetModule.types';
2
- export default function EmojiSheetView({ onEmojiSelected, theme, translations, categoryBarPosition, columns, emojiSize, recentLimit, showSearch, showRecents, enableSkinTones, enableHaptics, enableAnimations, excludeEmojis, ...rest }: EmojiSheetViewProps): import("react/jsx-runtime").JSX.Element;
2
+ export default function EmojiSheetView({ onEmojiSelected, onDismiss, theme, translations, categoryBarPosition, columns, emojiSize, recentLimit, showSearch, showRecents, enableSkinTones, enableHaptics, enableAnimations, excludeEmojis, ...rest }: EmojiSheetViewProps): import("react/jsx-runtime").JSX.Element;
3
3
  //# sourceMappingURL=EmojiSheetView.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EmojiSheetView.d.ts","sourceRoot":"","sources":["../../src/EmojiSheetView.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,mBAAmB,EACpB,MAAM,0BAA0B,CAAC;AAKlC,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EACrC,eAAe,EACf,KAAK,EACL,YAAY,EACZ,mBAAmB,EACnB,OAAO,EACP,SAAS,EACT,WAAW,EACX,UAAU,EACV,WAAW,EACX,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,GAAG,IAAI,EACR,EAAE,mBAAmB,2CA6BrB"}
1
+ {"version":3,"file":"EmojiSheetView.d.ts","sourceRoot":"","sources":["../../src/EmojiSheetView.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,mBAAmB,EACpB,MAAM,0BAA0B,CAAC;AAKlC,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EACrC,eAAe,EACf,SAAS,EACT,KAAK,EACL,YAAY,EACZ,mBAAmB,EACnB,OAAO,EACP,SAAS,EACT,WAAW,EACX,UAAU,EACV,WAAW,EACX,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,GAAG,IAAI,EACR,EAAE,mBAAmB,2CA8BrB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-native-sheet-emojis",
3
- "version": "1.6.0",
3
+ "version": "1.7.0",
4
4
  "description": "A fully native emoji picker bottom sheet for React Native. Built with Swift and Kotlin for maximum performance. Features search with multilingual keywords, skin tones, frequently used tracking, theming, and configurable layout.",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
@@ -61,6 +61,7 @@ export type EmojiSelectionListener = (event: { nativeEvent: { emoji: string } })
61
61
 
62
62
  export type EmojiSheetViewProps = ViewProps & {
63
63
  onEmojiSelected: (emoji: string) => void;
64
+ onDismiss?: () => void;
64
65
  theme?: EmojiSheetTheme | 'dark' | 'light' | 'system';
65
66
  translations?: EmojiSheetTranslations;
66
67
  categoryBarPosition?: 'top' | 'bottom';
@@ -77,6 +78,7 @@ export type EmojiSheetViewProps = ViewProps & {
77
78
 
78
79
  export type EmojiSheetNativeViewProps = ViewProps & {
79
80
  onEmojiSelected: EmojiSelectionListener;
81
+ onDismiss?: (event: { nativeEvent: {} }) => void;
80
82
  theme?: string;
81
83
  categoryBarPosition?: string;
82
84
  columns?: number;
@@ -10,6 +10,7 @@ const NativeView: React.ComponentType<EmojiSheetNativeViewProps> =
10
10
 
11
11
  export default function EmojiSheetView({
12
12
  onEmojiSelected,
13
+ onDismiss,
13
14
  theme,
14
15
  translations,
15
16
  categoryBarPosition,
@@ -50,6 +51,7 @@ export default function EmojiSheetView({
50
51
  onEmojiSelected={({ nativeEvent }) => {
51
52
  onEmojiSelected(nativeEvent.emoji);
52
53
  }}
54
+ onDismiss={onDismiss ? () => onDismiss() : undefined}
53
55
  />
54
56
  );
55
57
  }