Skip to content

Commit

Permalink
feat: add userSelect style equivalent to selectable (#34575)
Browse files Browse the repository at this point in the history
Summary:
This adds support for the `userSelect` style attribute, mapping the already existing selectable attribute as requested on #34425. This PR also updates the TextExample.android and TestExample.ios on the RNTester in order to facilitate the manual QA of this.

## Changelog
[General] [Added] - Add support for `userSelect` style

Pull Request resolved: #34575

Test Plan:
-  open the RNTester app and navigate to the Text page
 - Check the `Selectable Text` through the Selectable text section
<Image src="https://user-images.githubusercontent.com/22423684/188112863-65acd145-76b0-47ba-8bc6-f72298077096.png" height="600" width="300" />

Reviewed By: yungsters

Differential Revision: D39252798

Pulled By: jacdebug

fbshipit-source-id: f7fabf20ee68778d75461f511c56f94d0d756d9c
  • Loading branch information
Daksh Bhardwaj authored and facebook-github-bot committed Sep 8, 2022
1 parent 62f83a9 commit fc42d5b
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 1 deletion.
1 change: 1 addition & 0 deletions Libraries/Components/View/ReactNativeStyleAttributes.js
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ const ReactNativeStyleAttributes: {[string]: AnyAttributeType, ...} = {
textShadowOffset: true,
textShadowRadius: true,
textTransform: true,
userSelect: true,
writingDirection: true,

/**
Expand Down
1 change: 1 addition & 0 deletions Libraries/StyleSheet/StyleSheetTypes.js
Original file line number Diff line number Diff line change
Expand Up @@ -632,6 +632,7 @@ export type ____TextStyle_InternalCore = $ReadOnly<{
textDecorationStyle?: 'solid' | 'double' | 'dotted' | 'dashed',
textDecorationColor?: ____ColorValue_Internal,
textTransform?: 'none' | 'capitalize' | 'uppercase' | 'lowercase',
userSelect?: 'auto' | 'text' | 'none' | 'contain' | 'all',
writingDirection?: 'auto' | 'ltr' | 'rtl',
}>;

Expand Down
19 changes: 18 additions & 1 deletion Libraries/Text/Text.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import {NativeText, NativeVirtualText} from './TextNativeComponent';
import {type TextProps} from './TextProps';
import * as React from 'react';
import {useContext, useMemo, useState} from 'react';
import flattenStyle from '../StyleSheet/flattenStyle';

/**
* Text is the fundamental component for displaying text.
Expand Down Expand Up @@ -152,7 +153,13 @@ const Text: React.AbstractComponent<
? null
: processColor(restProps.selectionColor);

let style = restProps.style;
let style = flattenStyle(restProps.style);

let _selectable = restProps.selectable;
if (style?.userSelect != null) {
_selectable = userSelectToSelectableMap[style.userSelect];
}

if (__DEV__) {
if (PressabilityDebug.isEnabled() && onPress != null) {
style = StyleSheet.compose(restProps.style, {
Expand Down Expand Up @@ -182,6 +189,7 @@ const Text: React.AbstractComponent<
{...eventHandlersForText}
isHighlighted={isHighlighted}
isPressable={isPressable}
selectable={_selectable}
numberOfLines={numberOfLines}
selectionColor={selectionColor}
style={style}
Expand All @@ -193,6 +201,7 @@ const Text: React.AbstractComponent<
{...restProps}
{...eventHandlersForText}
disabled={_disabled}
selectable={_selectable}
accessible={_accessible}
accessibilityState={_accessibilityState}
allowFontScaling={allowFontScaling !== false}
Expand Down Expand Up @@ -222,4 +231,12 @@ function useLazyInitialization(newValue: boolean): boolean {
return oldValue;
}

const userSelectToSelectableMap = {
auto: true,
text: true,
none: false,
contain: true,
all: true,
};

module.exports = Text;
10 changes: 10 additions & 0 deletions packages/rn-tester/js/examples/Text/TextExample.android.js
Original file line number Diff line number Diff line change
Expand Up @@ -982,4 +982,14 @@ exports.examples = [
return <TextBaseLineLayoutExample />;
},
},
{
title: 'Selectable Text',
render: function (): React.Node {
return (
<View>
<Text style={{userSelect: 'auto'}}>Text element is selectable</Text>
</View>
);
},
},
];
10 changes: 10 additions & 0 deletions packages/rn-tester/js/examples/Text/TextExample.ios.js
Original file line number Diff line number Diff line change
Expand Up @@ -1227,4 +1227,14 @@ exports.examples = [
);
},
},
{
title: 'Selectable Text',
render: function (): React.Node {
return (
<View>
<Text style={{userSelect: 'auto'}}>Text element is selectable</Text>
</View>
);
},
},
];

0 comments on commit fc42d5b

Please sign in to comment.