From 35ef37998eee2b9d827514a0739e3ef553b49cb6 Mon Sep 17 00:00:00 2001 From: kuzkokov Date: Mon, 28 Oct 2019 20:46:50 +0300 Subject: [PATCH 1/3] Implement opportunity to set the wrapper component --- index.d.ts | 2 +- src/Hyperlink.js | 36 ++++++++++++++++++++---------------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/index.d.ts b/index.d.ts index 135e70b..8a719bd 100644 --- a/index.d.ts +++ b/index.d.ts @@ -7,7 +7,7 @@ interface Props { linkStyle?: StyleProp; linkText?: string | ((text: string) => string); onPress?: (url: string, text: string) => void; - onLongPress?: (url: string, text: string) => void; + wrapperComponent?: Component; } declare class HyperLink extends Component {} diff --git a/src/Hyperlink.js b/src/Hyperlink.js index c391bb0..fc3658d 100644 --- a/src/Hyperlink.js +++ b/src/Hyperlink.js @@ -4,10 +4,10 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' -import { - View, - Text, - Linking, +import { + View, + Text, + Linking, Platform } from 'react-native' import mdurl from 'mdurl'; @@ -28,26 +28,29 @@ class Hyperlink extends Component { } render() { - const { ...viewProps } = this.props - delete viewProps.onPress - delete viewProps.linkDefault - delete viewProps.onLongPress - delete viewProps.linkStyle - + const { ...wrapperProps } = this.props + delete wrapperProps.onPress + delete wrapperProps.linkDefault + delete wrapperProps.onLongPress + delete wrapperProps.linkStyle + delete wrapperProps.wrapperComponent + + const Wrapper = this.props.wrapperComponent || View; + return ( - + { !this.props.onPress && !this.props.onLongPress && !this.props.linkStyle ? this.props.children : this.parse(this).props.children } - + ) } isTextNested(component) { - if (!React.isValidElement(component)) + if (!React.isValidElement(component)) throw new Error('Invalid component') let { type: { displayName } = {} } = component - if (displayName !== 'Text') + if (displayName !== 'Text') throw new Error('Not a Text component') return typeof component.props.children !== 'string' } @@ -80,7 +83,7 @@ class Hyperlink extends Component { const clickHandlerProps = {} if (OS !== 'web') { - clickHandlerProps.onLongPress = this.props.onLongPress + clickHandlerProps.onLongPress = this.props.onLongPress ? () => this.props.onLongPress(url, text) : undefined } @@ -141,6 +144,7 @@ Hyperlink.propTypes = { ]), onPress: PropTypes.func, onLongPress: PropTypes.func, + wrapperComponent: PropTypes.elementType, } export default class extends Component { @@ -160,7 +164,7 @@ export default class extends Component { render () { const onPress = this.handleLink || this.props.onPress - if (this.props.linkDefault) + if (this.props.linkDefault) return return } From 037c708512af1479b02475142d8d821dc8dd244c Mon Sep 17 00:00:00 2001 From: kuzkokov Date: Fri, 10 Jan 2020 16:01:48 +0300 Subject: [PATCH 2/3] Returned onLongPress in typings (not sure why I did delete it) --- index.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/index.d.ts b/index.d.ts index 8a719bd..e5cc563 100644 --- a/index.d.ts +++ b/index.d.ts @@ -7,6 +7,7 @@ interface Props { linkStyle?: StyleProp; linkText?: string | ((text: string) => string); onPress?: (url: string, text: string) => void; + onLongPress?: (url: string, text: string) => void; wrapperComponent?: Component; } From d88d1b2f19f60e551f9bba20a610a47c6a824677 Mon Sep 17 00:00:00 2001 From: kuzkokov Date: Fri, 10 Jan 2020 16:11:23 +0300 Subject: [PATCH 3/3] Add dist --- dist/index.js | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/dist/index.js b/dist/index.js index 37adff6..ec15c62 100644 --- a/dist/index.js +++ b/dist/index.js @@ -142,13 +142,15 @@ function (_Component) { _createClass(Hyperlink, [{ key: "render", value: function render() { - var viewProps = _extends({}, this.props); - - delete viewProps.onPress; - delete viewProps.linkDefault; - delete viewProps.onLongPress; - delete viewProps.linkStyle; - return _react["default"].createElement(_reactNative.View, _extends({}, viewProps, { + var wrapperProps = _extends({}, this.props); + + delete wrapperProps.onPress; + delete wrapperProps.linkDefault; + delete wrapperProps.onLongPress; + delete wrapperProps.linkStyle; + delete wrapperProps.wrapperComponent; + var Wrapper = this.props.wrapperComponent || _reactNative.View; + return _react["default"].createElement(Wrapper, _extends({}, wrapperProps, { style: this.props.style }), !this.props.onPress && !this.props.onLongPress && !this.props.linkStyle ? this.props.children : this.parse(this).props.children); } @@ -174,7 +176,8 @@ Hyperlink.propTypes = { linkText: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].func]), onPress: _propTypes["default"].func, onLongPress: _propTypes["default"].func, - injectViewProps: _propTypes["default"].func + injectViewProps: _propTypes["default"].func, + wrapperComponent: _propTypes["default"].elementType }; Hyperlink.defaultProps = { linkify: linkify,