vendor expo-ized emoji popup

This commit is contained in:
Samuel Newman
2025-04-26 23:59:58 +03:00
parent 544565e567
commit dc6029ac01
20 changed files with 293 additions and 24 deletions
@@ -0,0 +1,21 @@
import {type EmojiPickerViewProps} from './EmojiPickerModule.types'
import EmojiPickerNativeView from './EmojiPickerView'
const EmojiPicker = ({onEmojiSelected}: EmojiPickerViewProps) => {
return (
<EmojiPickerNativeView
onEmojiSelected={emoji => {
onEmojiSelected(emoji)
}}
style={styles}
/>
)
}
const styles = {
flex: 1,
width: '100%',
backgroundColor: 'white',
} as const
export default EmojiPicker
@@ -0,0 +1,15 @@
import {type EmojiPickerViewProps} from './EmojiPickerModule.types'
import EmojiPickerNativeView from './EmojiPickerView'
const EmojiPicker = ({children, onEmojiSelected}: EmojiPickerViewProps) => {
return (
<EmojiPickerNativeView
onEmojiSelected={emoji => {
onEmojiSelected(emoji)
}}>
{children}
</EmojiPickerNativeView>
)
}
export default EmojiPicker
@@ -0,0 +1,5 @@
import {NativeModule, requireNativeModule} from 'expo'
declare class EmojiPickerModule extends NativeModule {}
export default requireNativeModule<EmojiPickerModule>('EmojiPicker')
@@ -0,0 +1,20 @@
import {type ViewProps} from 'react-native'
export type EmojiSelectionListener = (event: {
nativeEvent: SelectionEvent
}) => void
export type SelectionEvent = {
emoji: string
}
export type EmojiPickerViewProps = ViewProps & {
/*
* Callback that will be called when an emoji is selected.
*/
onEmojiSelected: (emoji: string) => void
}
export type EmojiPickerNativeViewProps = ViewProps & {
onEmojiSelected: EmojiSelectionListener
}
@@ -0,0 +1,21 @@
import {requireNativeView} from 'expo'
import type * as React from 'react'
import {
type EmojiPickerNativeViewProps,
type EmojiPickerViewProps,
} from './EmojiPickerModule.types'
const NativeView: React.ComponentType<EmojiPickerNativeViewProps> =
requireNativeView('EmojiPicker')
export default function EmojiPicker(props: EmojiPickerViewProps) {
return (
<NativeView
{...props}
onEmojiSelected={({nativeEvent}) => {
props.onEmojiSelected(nativeEvent.emoji)
}}
/>
)
}