1/**
2 * Copyright (c) Meta Platforms, Inc. and affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 *
7 * @format
8 */
9
10import type * as React from 'react';
11import {Constructor} from '../../../types/private/Utilities';
12import {ColorValue} from '../../StyleSheet/StyleSheet';
13import {TouchableMixin} from './Touchable';
14
15import type {TVProps} from './TouchableOpacity';
16import {TouchableWithoutFeedbackProps} from './TouchableWithoutFeedback';
17
18interface BaseBackgroundPropType {
19  type: string;
20  rippleRadius?: number | null | undefined;
21}
22
23interface RippleBackgroundPropType extends BaseBackgroundPropType {
24  type: 'RippleAndroid';
25  borderless: boolean;
26  color?: number | null | undefined;
27}
28
29interface ThemeAttributeBackgroundPropType extends BaseBackgroundPropType {
30  type: 'ThemeAttrAndroid';
31  attribute: string;
32}
33
34type BackgroundPropType =
35  | RippleBackgroundPropType
36  | ThemeAttributeBackgroundPropType;
37
38/**
39 * @see https://reactnative.dev/docs/touchablenativefeedback#props
40 */
41export interface TouchableNativeFeedbackProps
42  extends TouchableWithoutFeedbackProps,
43    TVProps {
44  /**
45   * Determines the type of background drawable that's going to be used to display feedback.
46   * It takes an object with type property and extra data depending on the type.
47   * It's recommended to use one of the following static methods to generate that dictionary:
48   *      1) TouchableNativeFeedback.SelectableBackground() - will create object that represents android theme's
49   *         default background for selectable elements (?android:attr/selectableItemBackground)
50   *      2) TouchableNativeFeedback.SelectableBackgroundBorderless() - will create object that represent android
51   *         theme's default background for borderless selectable elements
52   *         (?android:attr/selectableItemBackgroundBorderless). Available on android API level 21+
53   *      3) TouchableNativeFeedback.Ripple(color, borderless) - will create object that represents ripple drawable
54   *         with specified color (as a string). If property borderless evaluates to true the ripple will render
55   *         outside of the view bounds (see native actionbar buttons as an example of that behavior). This background
56   *         type is available on Android API level 21+
57   */
58  background?: BackgroundPropType | undefined;
59  useForeground?: boolean | undefined;
60}
61
62/**
63 * A wrapper for making views respond properly to touches (Android only).
64 * On Android this component uses native state drawable to display touch feedback.
65 * At the moment it only supports having a single View instance as a child node,
66 * as it's implemented by replacing that View with another instance of RCTView node with some additional properties set.
67 *
68 * Background drawable of native feedback touchable can be customized with background property.
69 *
70 * @see https://reactnative.dev/docs/touchablenativefeedback#content
71 */
72declare class TouchableNativeFeedbackComponent extends React.Component<TouchableNativeFeedbackProps> {}
73declare const TouchableNativeFeedbackBase: Constructor<TouchableMixin> &
74  typeof TouchableNativeFeedbackComponent;
75export class TouchableNativeFeedback extends TouchableNativeFeedbackBase {
76  /**
77   * Creates an object that represents android theme's default background for
78   * selectable elements (?android:attr/selectableItemBackground).
79   *
80   * @param rippleRadius The radius of ripple effect
81   */
82  static SelectableBackground(
83    rippleRadius?: number | null,
84  ): ThemeAttributeBackgroundPropType;
85
86  /**
87   * Creates an object that represent android theme's default background for borderless
88   * selectable elements (?android:attr/selectableItemBackgroundBorderless).
89   * Available on android API level 21+.
90   *
91   * @param rippleRadius The radius of ripple effect
92   */
93  static SelectableBackgroundBorderless(
94    rippleRadius?: number | null,
95  ): ThemeAttributeBackgroundPropType;
96
97  /**
98   * Creates an object that represents ripple drawable with specified color (as a
99   * string). If property `borderless` evaluates to true the ripple will
100   * render outside of the view bounds (see native actionbar buttons as an
101   * example of that behavior). This background type is available on Android
102   * API level 21+.
103   *
104   * @param color The ripple color
105   * @param borderless If the ripple can render outside it's bounds
106   * @param rippleRadius The radius of ripple effect
107   */
108  static Ripple(
109    color: ColorValue,
110    borderless: boolean,
111    rippleRadius?: number | null,
112  ): RippleBackgroundPropType;
113  static canUseNativeForeground(): boolean;
114}
115