Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[RNMobile] Remove third-party dependency on react-native-hsv-color-picker #53329

Merged
merged 25 commits into from
Aug 28, 2023
Merged
Show file tree
Hide file tree
Changes from 24 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
6cedb03
Add hsv color picker components
derekblank Aug 1, 2023
b6ba899
Update Saturation Picker from source
derekblank Aug 1, 2023
b770fbe
Update Hue Picker from source
derekblank Aug 1, 2023
6e6e8d5
Update hsv-color-picker imports
derekblank Aug 4, 2023
97c12e3
Remove third-party dependency package react-native-hsv-color-picker
derekblank Aug 4, 2023
3080385
Update hsv-color-picker styles
derekblank Aug 4, 2023
6df8f1b
Merge remote-tracking branch 'origin' into rnmobile/remove-react-nati…
derekblank Aug 4, 2023
7fa9386
Update CHANGELOG
derekblank Aug 4, 2023
962c97f
Add tinycolor2 package
derekblank Aug 7, 2023
d9d8346
Remove dependency on tinycolor2 from hsv-color-picker
derekblank Aug 9, 2023
033a44e
Remove tinycolor package reference
derekblank Aug 9, 2023
b8be63f
Revert empty change on initial editor html
derekblank Aug 9, 2023
4333a9c
Merge trunk
derekblank Aug 9, 2023
72432f7
Update hsv-color-picker container style
derekblank Aug 11, 2023
20ae378
Add color-picker integration test
derekblank Aug 11, 2023
d5370dc
Merge trunk
derekblank Aug 14, 2023
ceca901
Update packages/components/src/color-picker/style.native.scss
derekblank Aug 14, 2023
cbe44be
Update packages/react-native-editor/CHANGELOG.md
derekblank Aug 14, 2023
3444e2c
Update Color Picker code style and test formatting
derekblank Aug 14, 2023
e221e17
Merge branch 'rnmobile/remove-react-native-hsv-color-picker' of https…
derekblank Aug 14, 2023
d14b5f6
Update hsv-color-picker test ID
derekblank Aug 20, 2023
4fbf73a
Merge branch 'trunk' into rnmobile/remove-react-native-hsv-color-picker
derekblank Aug 20, 2023
eb36cd1
Remove color picker test
derekblank Aug 21, 2023
8070145
Update saturation picker imports
derekblank Aug 21, 2023
4dea3b1
Merge branch 'trunk' into rnmobile/remove-react-native-hsv-color-picker
derekblank Aug 28, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 0 additions & 29 deletions package-lock.json
derekblank marked this conversation as resolved.
Show resolved Hide resolved

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 1 addition & 5 deletions packages/block-library/src/cover/test/edit.native.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/**
* External dependencies
*/
import { Image, Pressable } from 'react-native';
import { Image } from 'react-native';
import {
getEditorHtml,
initializeEditor,
Expand All @@ -12,7 +12,6 @@ import {
getBlock,
openBlockSettings,
} from 'test/helpers';
import HsvColorPicker from 'react-native-hsv-color-picker';

/**
* WordPress dependencies
Expand Down Expand Up @@ -541,9 +540,6 @@ describe( 'color settings', () => {
} );

it( 'displays the hex color value in the custom color picker', async () => {
HsvColorPicker.mockImplementation( ( props ) => {
return <Pressable { ...props } testID="hsv-color-picker" />;
} );
const screen = await initializeEditor( {
initialHtml: COVER_BLOCK_PLACEHOLDER_HTML,
} );
Expand Down
88 changes: 88 additions & 0 deletions packages/components/src/color-picker/hsv-color-picker.native.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
/**
* External dependencies
*/
import { View, Dimensions } from 'react-native';

/**
* WordPress dependencies
*/
import { useRef } from '@wordpress/element';

/**
* Internal dependencies
*/
import HuePicker from './hue-picker';
import SaturationValuePicker from './saturation-picker';
import styles from './style.native.scss';

const HsvColorPicker = ( props ) => {
const maxWidth = Dimensions.get( 'window' ).width - 32;
const satValPickerRef = useRef( null );

const {
containerStyle = {},
currentColor,
huePickerContainerStyle = {},
huePickerBorderRadius = 0,
huePickerHue = 0,
huePickerBarWidth = maxWidth,
huePickerBarHeight = 12,
huePickerSliderSize = 24,
onHuePickerDragStart,
onHuePickerDragMove,
onHuePickerDragEnd,
onHuePickerDragTerminate,
onHuePickerPress,
satValPickerContainerStyle = {},
satValPickerBorderRadius = 0,
satValPickerSize = { width: maxWidth, height: 200 },
satValPickerSliderSize = 24,
satValPickerHue = 0,
satValPickerSaturation = 1,
satValPickerValue = 1,
onSatValPickerDragStart,
onSatValPickerDragMove,
onSatValPickerDragEnd,
onSatValPickerDragTerminate,
onSatValPickerPress,
} = props;

return (
<View
style={ [ styles[ 'hsv-container' ], containerStyle ] }
testID="hsv-color-picker"
>
<SaturationValuePicker
containerStyle={ satValPickerContainerStyle }
currentColor={ currentColor }
borderRadius={ satValPickerBorderRadius }
size={ satValPickerSize }
sliderSize={ satValPickerSliderSize }
hue={ satValPickerHue }
saturation={ satValPickerSaturation }
value={ satValPickerValue }
onDragStart={ onSatValPickerDragStart }
onDragMove={ onSatValPickerDragMove }
onDragEnd={ onSatValPickerDragEnd }
onDragTerminate={ onSatValPickerDragTerminate }
onPress={ onSatValPickerPress }
ref={ satValPickerRef }
/>
<HuePicker
containerStyle={ huePickerContainerStyle }
borderRadius={ huePickerBorderRadius }
hue={ huePickerHue }
barWidth={ huePickerBarWidth }
barHeight={ huePickerBarHeight }
sliderSize={ huePickerSliderSize }
onDragStart={ onHuePickerDragStart }
onDragMove={ onHuePickerDragMove }
onDragEnd={ onHuePickerDragEnd }
onDragTerminate={ onHuePickerDragTerminate }
onPress={ onHuePickerPress }
/>
</View>
);
};

export default HsvColorPicker;
194 changes: 194 additions & 0 deletions packages/components/src/color-picker/hue-picker.native.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,194 @@
/**
* External dependencies
*/
import { Animated, View, PanResponder } from 'react-native';
import LinearGradient from 'react-native-linear-gradient';

/**
* WordPress dependencies
*/
import React, { Component } from '@wordpress/element';

/**
* Internal dependencies
*/
import styles from './style.scss';

export default class HuePicker extends Component {
derekblank marked this conversation as resolved.
Show resolved Hide resolved
constructor( props ) {
super( props );
this.hueColors = [
'#ff0000',
'#ffff00',
'#00ff00',
'#00ffff',
'#0000ff',
'#ff00ff',
'#ff0000',
];
this.sliderX = new Animated.Value(
( props.barHeight * props.hue ) / 360
);
this.panResponder = PanResponder.create( {
onStartShouldSetPanResponder: () => true,
onStartShouldSetPanResponderCapture: () => true,
onMoveShouldSetPanResponder: () => true,
onMoveShouldSetPanResponderCapture: () => true,
onPanResponderGrant: ( evt, gestureState ) => {
const { onPress } = this.props;
this.dragStartValue = this.computeHueValuePress( evt );

if ( onPress ) {
onPress( {
hue: this.computeHueValuePress( evt ),
nativeEvent: evt.nativeEvent,
} );
}

this.fireDragEvent( 'onDragStart', gestureState );
},
onPanResponderMove: ( evt, gestureState ) => {
this.fireDragEvent( 'onDragMove', gestureState );
},
onPanResponderTerminationRequest: () => true,
onPanResponderRelease: ( evt, gestureState ) => {
this.fireDragEvent( 'onDragEnd', gestureState );
},
onPanResponderTerminate: ( evt, gestureState ) => {
this.fireDragEvent( 'onDragTerminate', gestureState );
},
onShouldBlockNativeResponder: () => true,
} );
}

componentDidUpdate( prevProps ) {
const { hue = 0, barWidth = 200, sliderSize = 24 } = this.props;
const borderWidth = sliderSize / 10;
if ( prevProps.hue !== hue || prevProps.barWidth !== barWidth ) {
this.sliderX.setValue(
( ( barWidth - sliderSize + borderWidth ) * hue ) / 360
);
}
}

normalizeValue( value ) {
if ( value < 0 ) return 0;
if ( value > 1 ) return 1;
return value;
}

getContainerStyle() {
const {
sliderSize = 24,
barHeight = 12,
containerStyle = {},
} = this.props;
const paddingLeft = sliderSize / 2;
const paddingTop =
sliderSize - barHeight > 0 ? ( sliderSize - barHeight ) / 2 : 0;
return [
styles[ 'hsv-container' ],
containerStyle,
{
paddingTop,
paddingBottom: paddingTop,
paddingLeft,
paddingRight: paddingLeft,
},
];
}

computeHueValueDrag( gestureState ) {
const { dx } = gestureState;
const { barWidth = 200 } = this.props;
const { dragStartValue } = this;
const diff = dx / barWidth;
const updatedHue =
this.normalizeValue( dragStartValue / 360 + diff ) * 360;
return updatedHue;
}

computeHueValuePress( event ) {
const { nativeEvent } = event;
const { locationX } = nativeEvent;
const { barWidth = 200 } = this.props;
const updatedHue = this.normalizeValue( locationX / barWidth ) * 360;
return updatedHue;
}

fireDragEvent( eventName, gestureState ) {
const { [ eventName ]: event } = this.props;
if ( event ) {
event( {
hue: this.computeHueValueDrag( gestureState ),
gestureState,
} );
}
}

firePressEvent( event ) {
const { onPress } = this.props;
if ( onPress ) {
onPress( {
hue: this.computeHueValuePress( event ),
nativeEvent: event.nativeEvent,
} );
}
}

render() {
const { hueColors } = this;
const {
sliderSize = 24,
barWidth = 200,
barHeight = 12,
borderRadius = 0,
} = this.props;
const borderWidth = sliderSize / 10;
return (
<View
style={ this.getContainerStyle() }
{ ...this.panResponder.panHandlers }
hitSlop={ {
top: 10,
bottom: 10,
left: 0,
right: 0,
} }
>
<LinearGradient
colors={ hueColors }
style={ {
borderRadius,
} }
start={ { x: 0, y: 0 } }
end={ { x: 1, y: 0 } }
>
<View
style={ {
width: barWidth,
height: barHeight,
} }
/>
</LinearGradient>
<Animated.View
pointerEvents="none"
style={ [
styles[ 'hue-slider' ],
{
width: sliderSize,
height: sliderSize,
left: ( sliderSize - borderWidth ) / 2,
borderRadius: sliderSize / 2,
transform: [
{
translateX: this.sliderX,
},
],
},
] }
/>
</View>
);
}
}
Loading
Loading