UNPKG

react-native-web

Version:
193 lines (188 loc) 7.45 kB
/** * Copyright (c) Nicolas Gallagher. * 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. * * */ 'use client'; import _objectSpread from "@babel/runtime/helpers/objectSpread2"; import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/objectWithoutPropertiesLoose"; var _excluded = ["hrefAttrs", "numberOfLines", "onClick", "onLayout", "onPress", "onMoveShouldSetResponder", "onMoveShouldSetResponderCapture", "onResponderEnd", "onResponderGrant", "onResponderMove", "onResponderReject", "onResponderRelease", "onResponderStart", "onResponderTerminate", "onResponderTerminationRequest", "onScrollShouldSetResponder", "onScrollShouldSetResponderCapture", "onSelectionChangeShouldSetResponder", "onSelectionChangeShouldSetResponderCapture", "onStartShouldSetResponder", "onStartShouldSetResponderCapture", "selectable"]; import * as React from 'react'; import createElement from '../createElement'; import * as forwardedProps from '../../modules/forwardedProps'; import pick from '../../modules/pick'; import useElementLayout from '../../modules/useElementLayout'; import useMergeRefs from '../../modules/useMergeRefs'; import usePlatformMethods from '../../modules/usePlatformMethods'; import useResponderEvents from '../../modules/useResponderEvents'; import StyleSheet from '../StyleSheet'; import TextAncestorContext from './TextAncestorContext'; import { useLocaleContext, getLocaleDirection } from '../../modules/useLocale'; //import { warnOnce } from '../../modules/warnOnce'; var forwardPropsList = Object.assign({}, forwardedProps.defaultProps, forwardedProps.accessibilityProps, forwardedProps.clickProps, forwardedProps.focusProps, forwardedProps.keyboardProps, forwardedProps.mouseProps, forwardedProps.touchProps, forwardedProps.styleProps, { href: true, lang: true, pointerEvents: true }); var pickProps = props => pick(props, forwardPropsList); var Text = /*#__PURE__*/React.forwardRef((props, forwardedRef) => { var hrefAttrs = props.hrefAttrs, numberOfLines = props.numberOfLines, onClick = props.onClick, onLayout = props.onLayout, onPress = props.onPress, onMoveShouldSetResponder = props.onMoveShouldSetResponder, onMoveShouldSetResponderCapture = props.onMoveShouldSetResponderCapture, onResponderEnd = props.onResponderEnd, onResponderGrant = props.onResponderGrant, onResponderMove = props.onResponderMove, onResponderReject = props.onResponderReject, onResponderRelease = props.onResponderRelease, onResponderStart = props.onResponderStart, onResponderTerminate = props.onResponderTerminate, onResponderTerminationRequest = props.onResponderTerminationRequest, onScrollShouldSetResponder = props.onScrollShouldSetResponder, onScrollShouldSetResponderCapture = props.onScrollShouldSetResponderCapture, onSelectionChangeShouldSetResponder = props.onSelectionChangeShouldSetResponder, onSelectionChangeShouldSetResponderCapture = props.onSelectionChangeShouldSetResponderCapture, onStartShouldSetResponder = props.onStartShouldSetResponder, onStartShouldSetResponderCapture = props.onStartShouldSetResponderCapture, selectable = props.selectable, rest = _objectWithoutPropertiesLoose(props, _excluded); /* if (selectable != null) { warnOnce( 'selectable', 'selectable prop is deprecated. Use styles.userSelect.' ); } */ var hasTextAncestor = React.useContext(TextAncestorContext); var hostRef = React.useRef(null); var _useLocaleContext = useLocaleContext(), contextDirection = _useLocaleContext.direction; useElementLayout(hostRef, onLayout); useResponderEvents(hostRef, { onMoveShouldSetResponder, onMoveShouldSetResponderCapture, onResponderEnd, onResponderGrant, onResponderMove, onResponderReject, onResponderRelease, onResponderStart, onResponderTerminate, onResponderTerminationRequest, onScrollShouldSetResponder, onScrollShouldSetResponderCapture, onSelectionChangeShouldSetResponder, onSelectionChangeShouldSetResponderCapture, onStartShouldSetResponder, onStartShouldSetResponderCapture }); var handleClick = React.useCallback(e => { if (onClick != null) { onClick(e); } else if (onPress != null) { e.stopPropagation(); onPress(e); } }, [onClick, onPress]); var component = hasTextAncestor ? 'span' : 'div'; var langDirection = props.lang != null ? getLocaleDirection(props.lang) : null; var componentDirection = props.dir || langDirection; var writingDirection = componentDirection || contextDirection; var supportedProps = pickProps(rest); supportedProps.dir = componentDirection; // 'auto' by default allows browsers to infer writing direction (root elements only) if (!hasTextAncestor) { supportedProps.dir = componentDirection != null ? componentDirection : 'auto'; } if (onClick || onPress) { supportedProps.onClick = handleClick; } supportedProps.style = [numberOfLines != null && numberOfLines > 1 && { WebkitLineClamp: numberOfLines }, hasTextAncestor === true ? styles.textHasAncestor$raw : styles.text$raw, numberOfLines === 1 && styles.textOneLine, numberOfLines != null && numberOfLines > 1 && styles.textMultiLine, props.style, selectable === true && styles.selectable, selectable === false && styles.notSelectable, onPress && styles.pressable]; if (props.href != null) { component = 'a'; if (hrefAttrs != null) { var download = hrefAttrs.download, rel = hrefAttrs.rel, target = hrefAttrs.target; if (download != null) { supportedProps.download = download; } if (rel != null) { supportedProps.rel = rel; } if (typeof target === 'string') { supportedProps.target = target.charAt(0) !== '_' ? '_' + target : target; } } } var platformMethodsRef = usePlatformMethods(supportedProps); var setRef = useMergeRefs(hostRef, platformMethodsRef, forwardedRef); supportedProps.ref = setRef; var element = createElement(component, supportedProps, { writingDirection }); return hasTextAncestor ? element : /*#__PURE__*/React.createElement(TextAncestorContext.Provider, { value: true }, element); }); Text.displayName = 'Text'; var textStyle = { backgroundColor: 'transparent', border: '0 solid black', boxSizing: 'border-box', color: 'black', display: 'inline', font: '14px System', listStyle: 'none', margin: 0, padding: 0, position: 'relative', textAlign: 'start', textDecoration: 'none', whiteSpace: 'pre-wrap', wordWrap: 'break-word' }; var styles = StyleSheet.create({ text$raw: textStyle, textHasAncestor$raw: _objectSpread(_objectSpread({}, textStyle), {}, { color: 'inherit', font: 'inherit', textAlign: 'inherit', whiteSpace: 'inherit' }), textOneLine: { maxWidth: '100%', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', wordWrap: 'normal' }, // See #13 textMultiLine: { display: '-webkit-box', maxWidth: '100%', overflow: 'clip', textOverflow: 'ellipsis', WebkitBoxOrient: 'vertical' }, notSelectable: { userSelect: 'none' }, selectable: { userSelect: 'text' }, pressable: { cursor: 'pointer' } }); export default Text;