mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
7858a2147f
Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/36345 `exactOptionalPropertyTypes` is a TypeScript 4.4+ option set by users which changes behavior of optional properties, to disable accepting explicit `undefined`. This is not enabled when using `--strict`, and is stricter than Flow, leading to most of the typings having an `| undefined` unique to TypeScript (added with https://github.com/DefinitelyTyped/DefinitelyTyped/commit/694c663a9486dbe7794d5eb894a691ee9ded318a). We have not always followed this (I have myself previously assumed the two are equivalent). We can enforce that the convention is followed with a plugin `eslint-plugin-redundant-undefined`. This forces us to declare that every optional property accepts an explicit undefined (which Flow would allow). Alternatively, if we do not want to support this, we can enable the existing dtslint rule `no-redundant-undefined`. Changelog: [General][Fixed] - Enforce compatibility with `exactOptionalPropertyTypes` Reviewed By: lunaleaps Differential Revision: D43700862 fbshipit-source-id: 996094762b28918177521a9471d868ba87f0f263
168 lines
4.5 KiB
TypeScript
168 lines
4.5 KiB
TypeScript
/**
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @format
|
|
*/
|
|
|
|
import type * as React from 'react';
|
|
import {Insets} from '../../../types/public/Insets';
|
|
import {ColorValue, StyleProp} from '../../StyleSheet/StyleSheet';
|
|
import {ViewStyle} from '../../StyleSheet/StyleSheetTypes';
|
|
import {
|
|
GestureResponderEvent,
|
|
MouseEvent,
|
|
NativeSyntheticEvent,
|
|
TargetedEvent,
|
|
} from '../../Types/CoreEventTypes';
|
|
import {View} from '../View/View';
|
|
import {AccessibilityProps} from '../View/ViewAccessibility';
|
|
import {ViewProps} from '../View/ViewPropTypes';
|
|
|
|
export interface PressableStateCallbackType {
|
|
readonly pressed: boolean;
|
|
}
|
|
|
|
export interface PressableAndroidRippleConfig {
|
|
color?: null | ColorValue | undefined;
|
|
borderless?: null | boolean | undefined;
|
|
radius?: null | number | undefined;
|
|
foreground?: null | boolean | undefined;
|
|
}
|
|
|
|
export interface PressableProps
|
|
extends AccessibilityProps,
|
|
Omit<ViewProps, 'children' | 'style' | 'hitSlop'> {
|
|
/**
|
|
* Called when the hover is activated to provide visual feedback.
|
|
*/
|
|
onHoverIn?: null | ((event: MouseEvent) => void) | undefined;
|
|
|
|
/**
|
|
* Called when the hover is deactivated to undo visual feedback.
|
|
*/
|
|
onHoverOut?: null | ((event: MouseEvent) => void) | undefined;
|
|
|
|
/**
|
|
* Called when a single tap gesture is detected.
|
|
*/
|
|
onPress?: null | ((event: GestureResponderEvent) => void) | undefined;
|
|
|
|
/**
|
|
* Called when a touch is engaged before `onPress`.
|
|
*/
|
|
onPressIn?: null | ((event: GestureResponderEvent) => void) | undefined;
|
|
|
|
/**
|
|
* Called when a touch is released before `onPress`.
|
|
*/
|
|
onPressOut?: null | ((event: GestureResponderEvent) => void) | undefined;
|
|
|
|
/**
|
|
* Called when a long-tap gesture is detected.
|
|
*/
|
|
onLongPress?: null | ((event: GestureResponderEvent) => void) | undefined;
|
|
|
|
/**
|
|
* Called after the element loses focus.
|
|
* @platform macos windows
|
|
*/
|
|
onBlur?:
|
|
| null
|
|
| ((event: NativeSyntheticEvent<TargetedEvent>) => void)
|
|
| undefined;
|
|
|
|
/**
|
|
* Called after the element is focused.
|
|
* @platform macos windows
|
|
*/
|
|
onFocus?:
|
|
| null
|
|
| ((event: NativeSyntheticEvent<TargetedEvent>) => void)
|
|
| undefined;
|
|
|
|
/**
|
|
* Either children or a render prop that receives a boolean reflecting whether
|
|
* the component is currently pressed.
|
|
*/
|
|
children?:
|
|
| React.ReactNode
|
|
| ((state: PressableStateCallbackType) => React.ReactNode)
|
|
| undefined;
|
|
|
|
/**
|
|
* Whether a press gesture can be interrupted by a parent gesture such as a
|
|
* scroll event. Defaults to true.
|
|
*/
|
|
cancelable?: null | boolean | undefined;
|
|
|
|
/**
|
|
* Duration to wait after hover in before calling `onHoverIn`.
|
|
* @platform macos windows
|
|
*/
|
|
delayHoverIn?: number | null | undefined;
|
|
|
|
/**
|
|
* Duration to wait after hover out before calling `onHoverOut`.
|
|
* @platform macos windows
|
|
*/
|
|
delayHoverOut?: number | null | undefined;
|
|
|
|
/**
|
|
* Duration (in milliseconds) from `onPressIn` before `onLongPress` is called.
|
|
*/
|
|
delayLongPress?: null | number | undefined;
|
|
|
|
/**
|
|
* Whether the press behavior is disabled.
|
|
*/
|
|
disabled?: null | boolean | undefined;
|
|
|
|
/**
|
|
* Additional distance outside of this view in which a press is detected.
|
|
*/
|
|
hitSlop?: null | Insets | number | undefined;
|
|
|
|
/**
|
|
* Additional distance outside of this view in which a touch is considered a
|
|
* press before `onPressOut` is triggered.
|
|
*/
|
|
pressRetentionOffset?: null | Insets | number | undefined;
|
|
|
|
/**
|
|
* If true, doesn't play system sound on touch.
|
|
*/
|
|
android_disableSound?: null | boolean | undefined;
|
|
|
|
/**
|
|
* Enables the Android ripple effect and configures its color.
|
|
*/
|
|
android_ripple?: null | PressableAndroidRippleConfig | undefined;
|
|
|
|
/**
|
|
* Used only for documentation or testing (e.g. snapshot testing).
|
|
*/
|
|
testOnly_pressed?: null | boolean | undefined;
|
|
|
|
/**
|
|
* Either view styles or a function that receives a boolean reflecting whether
|
|
* the component is currently pressed and returns view styles.
|
|
*/
|
|
style?:
|
|
| StyleProp<ViewStyle>
|
|
| ((state: PressableStateCallbackType) => StyleProp<ViewStyle>)
|
|
| undefined;
|
|
|
|
/**
|
|
* Duration (in milliseconds) to wait after press down before calling onPressIn.
|
|
*/
|
|
unstable_pressDelay?: number | undefined;
|
|
}
|
|
|
|
// TODO use React.AbstractComponent when available
|
|
export const Pressable: React.ForwardRefExoticComponent<
|
|
PressableProps & React.RefAttributes<View>
|
|
>;
|