create-expo-cljs-app
Version:
Create a react native application with Expo and Shadow-CLJS!
127 lines (111 loc) • 3.74 kB
JavaScript
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
*/
;
import type { PressResponderConfig } from '../../modules/usePressEvents/PressResponder';
import type { ViewProps } from '../View';
import * as React from 'react';
import { useMemo, useRef } from 'react';
import pick from '../../modules/pick';
import useMergeRefs from '../../modules/useMergeRefs';
import usePressEvents from '../../modules/usePressEvents';
export type Props = $ReadOnly<{|
accessibilityLabel?: $PropertyType<ViewProps, 'accessibilityLabel'>,
accessibilityLiveRegion?: $PropertyType<ViewProps, 'accessibilityLiveRegion'>,
accessibilityRole?: $PropertyType<ViewProps, 'accessibilityRole'>,
accessibilityState?: $PropertyType<ViewProps, 'accessibilityState'>,
accessibilityValue?: $PropertyType<ViewProps, 'accessibilityValue'>,
children?: ?React.Node,
delayLongPress?: ?number,
delayPressIn?: ?number,
delayPressOut?: ?number,
disabled?: ?boolean,
focusable?: ?boolean,
nativeID?: $PropertyType<ViewProps, 'nativeID'>,
onBlur?: $PropertyType<ViewProps, 'onBlur'>,
onFocus?: $PropertyType<ViewProps, 'onFocus'>,
onLayout?: $PropertyType<ViewProps, 'onLayout'>,
onLongPress?: $PropertyType<PressResponderConfig, 'onLongPress'>,
onPress?: $PropertyType<PressResponderConfig, 'onPress'>,
onPressIn?: $PropertyType<PressResponderConfig, 'onPressStart'>,
onPressOut?: $PropertyType<PressResponderConfig, 'onPressEnd'>,
rejectResponderTermination?: ?boolean,
testID?: $PropertyType<ViewProps, 'testID'>
|}>;
const forwardPropsList = {
accessibilityDisabled: true,
accessibilityLabel: true,
accessibilityLiveRegion: true,
accessibilityRole: true,
accessibilityState: true,
accessibilityValue: true,
children: true,
disabled: true,
focusable: true,
nativeID: true,
onBlur: true,
onFocus: true,
onLayout: true,
testID: true
};
const pickProps = (props) => pick(props, forwardPropsList);
function TouchableWithoutFeedback(props: Props, forwardedRef): React.Node {
const {
delayPressIn,
delayPressOut,
delayLongPress,
disabled,
focusable,
onLongPress,
onPress,
onPressIn,
onPressOut,
rejectResponderTermination
} = props;
const hostRef = useRef(null);
const pressConfig = useMemo(
() => ({
cancelable: !rejectResponderTermination,
disabled,
delayLongPress,
delayPressStart: delayPressIn,
delayPressEnd: delayPressOut,
onLongPress,
onPress,
onPressStart: onPressIn,
onPressEnd: onPressOut
}),
[
disabled,
delayPressIn,
delayPressOut,
delayLongPress,
onLongPress,
onPress,
onPressIn,
onPressOut,
rejectResponderTermination
]
);
const pressEventHandlers = usePressEvents(hostRef, pressConfig);
const element = React.Children.only(props.children);
const children = [element.props.children];
const supportedProps = pickProps(props);
supportedProps.accessibilityDisabled = disabled;
supportedProps.focusable = !disabled && focusable !== false;
supportedProps.ref = useMergeRefs(forwardedRef, hostRef, element.ref);
const elementProps = Object.assign(supportedProps, pressEventHandlers);
return React.cloneElement(element, elementProps, ...children);
}
const MemoedTouchableWithoutFeedback = React.memo(React.forwardRef(TouchableWithoutFeedback));
MemoedTouchableWithoutFeedback.displayName = 'TouchableWithoutFeedback';
export default (MemoedTouchableWithoutFeedback: React.AbstractComponent<
Props,
React.ElementRef<any>
>);