UNPKG

@tamagui/react-native-web-lite

Version:
81 lines (80 loc) 2.84 kB
import * as React from "react"; import { useCallback, useMemo, useRef, useState } from "react"; import { StyleSheet, useMergeRefs, usePressEvents } from "@tamagui/react-native-web-internals"; import { View } from "./View"; import { jsx } from "react/jsx-runtime"; function TouchableOpacityImpl(props, forwardedRef) { const { activeOpacity, delayPressIn, delayPressOut, delayLongPress, disabled, focusable, onLongPress, onPress, onPressIn, onPressOut, rejectResponderTermination, style, ...rest } = props, hostRef = useRef(null), setRef = useMergeRefs(forwardedRef, hostRef), [duration, setDuration] = useState("0s"), [opacityOverride, setOpacityOverride] = useState(null), setOpacityTo = useCallback((value, duration2) => { setOpacityOverride(value), setDuration(duration2 ? `${duration2 / 1e3}s` : "0s"); }, [setOpacityOverride, setDuration]), setOpacityActive = useCallback(duration2 => { setOpacityTo(activeOpacity ?? 0.2, duration2); }, [activeOpacity, setOpacityTo]), setOpacityInactive = useCallback(duration2 => { setOpacityTo(null, duration2); }, [setOpacityTo]), pressConfig = useMemo(() => ({ cancelable: !rejectResponderTermination, disabled, delayLongPress, delayPressStart: delayPressIn, delayPressEnd: delayPressOut, onLongPress, onPress, onPressStart(event) { const isGrant = event.dispatchConfig != null ? event.dispatchConfig.registrationName === "onResponderGrant" : event.type === "keydown"; setOpacityActive(isGrant ? 0 : 150), onPressIn?.(event); }, onPressEnd(event) { setOpacityInactive(250), onPressOut?.(event); } }), [delayLongPress, delayPressIn, delayPressOut, disabled, onLongPress, onPress, onPressIn, onPressOut, rejectResponderTermination, setOpacityActive, setOpacityInactive]), pressEventHandlers = usePressEvents(hostRef, pressConfig); return /* @__PURE__ */jsx(View, { ...rest, ...pressEventHandlers, accessibilityDisabled: disabled, focusable: !disabled && focusable !== !1, ref: setRef, style: [styles.root, !disabled && styles.actionable, style, opacityOverride != null && { opacity: opacityOverride }, { transitionDuration: duration }] }); } const styles = StyleSheet.create({ root: { transitionProperty: "opacity", transitionDuration: "0.15s", userSelect: "none" }, actionable: { cursor: "pointer", touchAction: "manipulation" } }), TouchableOpacity = React.memo(React.forwardRef(TouchableOpacityImpl)); TouchableOpacity.displayName = "TouchableOpacity"; TouchableOpacity.Mixin = {}; export { TouchableOpacity }; //# sourceMappingURL=TouchableOpacity.mjs.map