UNPKG

@janiscommerce/ui-native

Version:
30 lines (29 loc) 1.37 kB
import React from 'react'; import { Pressable as RNPressable, StyleSheet } from 'react-native'; import { Pressable as GHPressable } from 'react-native-gesture-handler'; import { moderateScale, scaledForDevice } from '../../../scale'; // Opt-in via `isGestureHandler` for cases where RN core Pressable loses `onPress` inside Modalize/Swipeable/native-stack on Android with new architecture (RN 0.74+). // Cast to RN Pressable's type so the public API of BaseButton/Button stays compatible — consumers keep typing `onPress` with GestureResponderEvent. const GestureHandlerPressable = GHPressable; const BaseButton = ({ borderRadius = 0, children = null, style, pressedStyle, isGestureHandler = false, ...props }) => { if (!children) { return null; } const validateBorderRadius = scaledForDevice(borderRadius, moderateScale); const styles = StyleSheet.create({ container: { alignItems: 'center', justifyContent: 'center', borderRadius: validateBorderRadius, }, }); const Pressable = isGestureHandler ? GestureHandlerPressable : RNPressable; return (<Pressable style={({ pressed }) => [ styles.container, style, pressed && /* istanbul ignore next */ pressedStyle, ]} {...props}> {children} </Pressable>); }; export default BaseButton;