react-native-animateable-text
Version:
A fork of React Native's `<Text/> component that supports Reanimated Shared Values as text!
154 lines (151 loc) • 7.53 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.AnimateableText = void 0;
var _react = _interopRequireWildcard(require("react"));
var _reactNative = require("react-native");
var _ReactNativeViewAttributes = _interopRequireDefault(require("react-native/Libraries/Components/View/ReactNativeViewAttributes"));
var _Touchable = _interopRequireDefault(require("react-native/Libraries/Components/Touchable/Touchable"));
var _createReactNativeComponentClass = _interopRequireDefault(require("react-native/Libraries/Renderer/shims/createReactNativeComponentClass"));
var _nullthrows5 = _interopRequireDefault(require("nullthrows"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
// @ts-ignore
// @ts-ignore
const PRESS_RECT_OFFSET = {
top: 20,
left: 20,
right: 20,
bottom: 30
};
const viewConfig = {
validAttributes: {
..._ReactNativeViewAttributes.default.UIView,
isHighlighted: true,
isPressable: true,
numberOfLines: true,
ellipsizeMode: true,
allowFontScaling: true,
dynamicTypeRamp: true,
maxFontSizeMultiplier: true,
disabled: true,
selectable: true,
selectionColor: true,
adjustsFontSizeToFit: true,
minimumFontScale: true,
textBreakStrategy: true,
onTextLayout: true,
onInlineViewLayout: true,
dataDetectorType: true,
android_hyphenationFrequency: true,
lineBreakStrategyIOS: true,
text: true
},
directEventTypes: {
topTextLayout: {
registrationName: "onTextLayout"
},
topInlineViewLayout: {
registrationName: "onInlineViewLayout"
}
},
uiViewClassName: "JBAnimatedText"
};
const isTouchable = props => props.onPress != null || props.onLongPress != null || props.onStartShouldSetResponder != null;
const RCTText = (0, _createReactNativeComponentClass.default)(viewConfig.uiViewClassName, () => viewConfig);
const TouchableText = /*#__PURE__*/(0, _react.forwardRef)((props, forwardedRef) => {
const [isHighlighted, setHighlighted] = (0, _react.useState)(false);
const touchableRef = (0, _react.useRef)({});
const hasAttachedTouchHandlers = (0, _react.useRef)(false);
const TouchableWithMixin = _Touchable.default;
const attachTouchHandlers = (0, _react.useCallback)(() => {
if (hasAttachedTouchHandlers.current) return;
hasAttachedTouchHandlers.current = true;
for (const key in TouchableWithMixin.Mixin) {
if (typeof TouchableWithMixin.Mixin[key] === "function") {
touchableRef.current[key] = TouchableWithMixin.Mixin[key].bind(touchableRef.current);
}
}
touchableRef.current.touchableHandleActivePressIn = () => {
if (!props.suppressHighlighting && isTouchable(props)) {
setHighlighted(true);
}
};
touchableRef.current.touchableHandleActivePressOut = () => {
if (!props.suppressHighlighting && isTouchable(props)) {
setHighlighted(false);
}
};
touchableRef.current.touchableHandlePress = event => {
var _props$onPress;
(_props$onPress = props.onPress) === null || _props$onPress === void 0 || _props$onPress.call(props, event);
};
touchableRef.current.touchableHandleLongPress = event => {
var _props$onLongPress;
(_props$onLongPress = props.onLongPress) === null || _props$onLongPress === void 0 || _props$onLongPress.call(props, event);
};
touchableRef.current.touchableGetPressRectOffset = () => props.pressRetentionOffset ?? PRESS_RECT_OFFSET;
}, [hasAttachedTouchHandlers, props, setHighlighted, touchableRef]);
const responseHandlers = (0, _react.useMemo)(() => {
if (!isTouchable(props)) return undefined;
return {
onStartShouldSetResponder: () => {
var _props$onStartShouldS;
const shouldSet = (((_props$onStartShouldS = props.onStartShouldSetResponder) === null || _props$onStartShouldS === void 0 ? void 0 : _props$onStartShouldS.call(props)) ?? false) || isTouchable(props);
if (shouldSet) {
attachTouchHandlers();
}
return shouldSet;
},
onResponderGrant: event => {
var _nullthrows, _props$onResponderGra;
(_nullthrows = (0, _nullthrows5.default)(touchableRef.current.touchableHandleResponderGrant)) === null || _nullthrows === void 0 || _nullthrows(event);
(_props$onResponderGra = props.onResponderGrant) === null || _props$onResponderGra === void 0 || _props$onResponderGra.call(props, event);
},
onResponderMove: event => {
var _nullthrows2, _props$onResponderMov;
(_nullthrows2 = (0, _nullthrows5.default)(touchableRef.current.touchableHandleResponderMove)) === null || _nullthrows2 === void 0 || _nullthrows2(event);
(_props$onResponderMov = props.onResponderMove) === null || _props$onResponderMov === void 0 || _props$onResponderMov.call(props, event);
},
onResponderRelease: event => {
var _nullthrows3, _props$onResponderRel;
(_nullthrows3 = (0, _nullthrows5.default)(touchableRef.current.touchableHandleResponderRelease)) === null || _nullthrows3 === void 0 || _nullthrows3(event);
(_props$onResponderRel = props.onResponderRelease) === null || _props$onResponderRel === void 0 || _props$onResponderRel.call(props, event);
},
onResponderTerminate: event => {
var _nullthrows4, _props$onResponderTer;
(_nullthrows4 = (0, _nullthrows5.default)(touchableRef.current.touchableHandleResponderTerminate)) === null || _nullthrows4 === void 0 || _nullthrows4(event);
(_props$onResponderTer = props.onResponderTerminate) === null || _props$onResponderTer === void 0 || _props$onResponderTer.call(props, event);
},
onResponderTerminationRequest: () => {
var _props$onResponderTer2;
const defaultRequest = (0, _nullthrows5.default)(touchableRef.current.touchableHandleResponderTerminationRequest)();
return ((_props$onResponderTer2 = props.onResponderTerminationRequest) === null || _props$onResponderTer2 === void 0 ? void 0 : _props$onResponderTer2.call(props)) ?? defaultRequest;
}
};
}, [props, attachTouchHandlers]);
let selectionColor;
if (props.selectionColor != null) {
selectionColor = (0, _reactNative.processColor)(props.selectionColor);
}
const renderedProps = {
...props,
...(responseHandlers ?? {}),
ref: forwardedRef,
isHighlighted,
selectionColor
};
if (isTouchable(props)) {
renderedProps.isHighlighted = isHighlighted;
}
if (__DEV__ && TouchableWithMixin.TOUCH_TARGET_DEBUG && props.onPress != null) {
renderedProps.style = [props.style, {
color: "magenta"
}];
}
return /*#__PURE__*/_react.default.createElement(RCTText, renderedProps);
});
TouchableText.displayName = "TouchableText";
const AnimateableText = exports.AnimateableText = TouchableText;
//# sourceMappingURL=AnimateableText.js.mapleText.js.map