Skip to content

Commit cc6ed5f

Browse files
authored
Merge pull request #8790 from orkunkarakus/fix/7497-LongLinesInCode
Long lines in code blocks should not wrap issue (#7497) is fixed
2 parents 919a384 + 9f2ce1a commit cc6ed5f

File tree

8 files changed

+125
-4
lines changed

8 files changed

+125
-4
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import React, {forwardRef} from 'react';
2+
import {ScrollView} from 'react-native-gesture-handler';
3+
import {View} from 'react-native';
4+
import _ from 'underscore';
5+
import htmlRendererPropTypes from '../htmlRendererPropTypes';
6+
import withLocalize from '../../../withLocalize';
7+
8+
const BasePreRenderer = forwardRef((props, ref) => {
9+
const TDefaultRenderer = props.TDefaultRenderer;
10+
const defaultRendererProps = _.omit(props, ['TDefaultRenderer']);
11+
12+
return (
13+
<ScrollView
14+
ref={ref}
15+
horizontal
16+
>
17+
<View onStartShouldSetResponder={() => true}>
18+
{/* eslint-disable-next-line react/jsx-props-no-spreading */}
19+
<TDefaultRenderer {...defaultRendererProps} />
20+
</View>
21+
</ScrollView>
22+
);
23+
});
24+
25+
BasePreRenderer.displayName = 'BasePreRenderer';
26+
BasePreRenderer.propTypes = htmlRendererPropTypes;
27+
28+
export default withLocalize(BasePreRenderer);
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import React from 'react';
2+
import withLocalize from '../../../withLocalize';
3+
import htmlRendererPropTypes from '../htmlRendererPropTypes';
4+
import BasePreRenderer from './BasePreRenderer';
5+
6+
class PreRenderer extends React.Component {
7+
constructor(props) {
8+
super(props);
9+
10+
this.scrollNode = this.scrollNode.bind(this);
11+
}
12+
13+
componentDidMount() {
14+
if (!this.ref) {
15+
return;
16+
}
17+
this.ref.getScrollableNode()
18+
.addEventListener('wheel', this.scrollNode);
19+
}
20+
21+
componentWillUnmount() {
22+
this.ref.getScrollableNode()
23+
.removeEventListener('wheel', this.scrollNode);
24+
}
25+
26+
/**
27+
* Manually scrolls the code block if code block horizontal scrollable, then prevents the event from being passed up to the parent.
28+
* @param {Object} event native event
29+
*/
30+
scrollNode(event) {
31+
const node = this.ref.getScrollableNode();
32+
const horizontalOverflow = node.scrollWidth > node.offsetWidth;
33+
34+
if ((event.currentTarget === node) && horizontalOverflow) {
35+
node.scrollLeft += event.deltaX;
36+
event.preventDefault();
37+
event.stopPropagation();
38+
}
39+
}
40+
41+
render() {
42+
return (
43+
<BasePreRenderer
44+
// eslint-disable-next-line react/jsx-props-no-spreading
45+
{...this.props}
46+
ref={el => this.ref = el}
47+
/>
48+
);
49+
}
50+
}
51+
52+
PreRenderer.propTypes = htmlRendererPropTypes;
53+
PreRenderer.displayName = 'PreRenderer';
54+
55+
export default withLocalize(PreRenderer);
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import React from 'react';
2+
import withLocalize from '../../../withLocalize';
3+
import htmlRendererPropTypes from '../htmlRendererPropTypes';
4+
import BasePreRenderer from './BasePreRenderer';
5+
6+
const PreRenderer = props => (
7+
// eslint-disable-next-line react/jsx-props-no-spreading
8+
<BasePreRenderer {...props} />
9+
);
10+
11+
PreRenderer.propTypes = htmlRendererPropTypes;
12+
PreRenderer.displayName = 'PreRenderer';
13+
14+
export default withLocalize(PreRenderer);

src/components/HTMLEngineProvider/HTMLRenderers/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import AnchorRenderer from './AnchorRenderer';
22
import CodeRenderer from './CodeRenderer';
33
import EditedRenderer from './EditedRenderer';
44
import ImageRenderer from './ImageRenderer';
5+
import PreRenderer from './PreRenderer';
56

67
/**
78
* This collection defines our custom renderers. It is a mapping from HTML tag type to the corresponding component.
@@ -14,4 +15,5 @@ export default {
1415

1516
// Custom tag renderers
1617
edited: EditedRenderer,
18+
pre: PreRenderer,
1719
};

src/components/PressableWithSecondaryInteraction/index.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {LongPressGestureHandler, State} from 'react-native-gesture-handler';
55
import SelectionScraper from '../../libs/SelectionScraper';
66
import * as pressableWithSecondaryInteractionPropTypes from './pressableWithSecondaryInteractionPropTypes';
77
import styles from '../../styles/styles';
8+
import hasHoverSupport from '../../libs/hasHoverSupport';
89

910
/**
1011
* This is a special Pressable that calls onSecondaryInteraction when LongPressed, or right-clicked.
@@ -31,7 +32,7 @@ class PressableWithSecondaryInteraction extends Component {
3132
* @param {Object} e
3233
*/
3334
callSecondaryInteractionWithMappedEvent(e) {
34-
if (e.nativeEvent.state !== State.ACTIVE) {
35+
if ((e.nativeEvent.state !== State.ACTIVE) || hasHoverSupport()) {
3536
return;
3637
}
3738

@@ -73,7 +74,7 @@ class PressableWithSecondaryInteraction extends Component {
7374
onPressOut={this.props.onPressOut}
7475
onPress={this.props.onPress}
7576
ref={el => this.pressableRef = el}
76-
// eslint-disable-next-line react/jsx-props-no-spreading
77+
// eslint-disable-next-line react/jsx-props-no-spreading
7778
{...defaultPressableProps}
7879
>
7980
{this.props.children}

src/libs/hasHoverSupport/index.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/**
2+
* Allows us to identify whether the platform is hoverable.
3+
*
4+
* @returns {Boolean}
5+
*/
6+
7+
import * as Browser from '../Browser';
8+
9+
const hasHoverSupport = () => !Browser.isMobile();
10+
11+
export default hasHoverSupport;
12+
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
/**
2+
* Allows us to identify whether the platform is hoverable.
3+
*
4+
* @returns {Boolean}
5+
*/
6+
7+
const hasHoverSupport = () => false;
8+
9+
export default hasHoverSupport;

src/styles/styles.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,8 @@ const webViewStyles = {
100100

101101
pre: {
102102
...baseCodeTagStyles,
103-
paddingTop: 4,
104-
paddingBottom: 5,
103+
paddingTop: 12,
104+
paddingBottom: 12,
105105
paddingRight: 8,
106106
paddingLeft: 8,
107107
fontFamily: fontFamily.MONOSPACE,

0 commit comments

Comments
 (0)