|
1 | 1 | import _ from 'lodash';
|
2 |
| -import React, {useCallback, useEffect, useState, useMemo} from 'react'; |
3 |
| -import {asBaseComponent, forwardRef, ForwardRefInjectedProps} from '../../commons/new'; |
| 2 | +import React, {useCallback, useMemo, useContext} from 'react'; |
| 3 | +import {forwardRef, ForwardRefInjectedProps} from '../../commons/new'; |
4 | 4 | import {ComponentStatics} from '../../typings/common';
|
| 5 | +import {useThemeProps} from '../../hooks'; |
5 | 6 | import {Colors} from '../../style';
|
6 | 7 | import {Slider as NewSlider} from '../../incubator';
|
7 | 8 | import Gradient from '../gradient';
|
8 | 9 | import {GradientSliderProps, GradientSliderTypes, HSLA} from './types';
|
9 | 10 | import Slider from './index';
|
10 |
| -import {SliderContextProps} from './context/SliderContext'; |
11 |
| -import asSliderGroupChild from './context/asSliderGroupChild'; |
| 11 | +import SliderContext from './SliderContext'; |
12 | 12 |
|
13 |
| -type GradientSliderComponentProps<T> = { |
14 |
| - sliderContext: SliderContextProps; |
15 |
| -} & GradientSliderProps<T>; |
16 |
| - |
17 |
| -type Props<T> = GradientSliderComponentProps<T> & ForwardRefInjectedProps; |
| 13 | +type Props<T> = GradientSliderProps<T> & ForwardRefInjectedProps; |
18 | 14 |
|
19 | 15 | /**
|
20 | 16 | * @description: A Gradient Slider component
|
21 | 17 | * @example: https://github.com/wix/react-native-ui-lib/blob/master/demo/src/screens/componentScreens/SliderScreen.tsx
|
22 | 18 | * @gif: https://github.com/wix/react-native-ui-lib/blob/master/demo/showcase/GradientSlider/GradientSlider.gif?raw=true
|
23 | 19 | */
|
24 | 20 | const GradientSlider = <T extends string | HSLA = string>(props: Props<T>) => {
|
| 21 | + const themeProps = useThemeProps(props, 'GradientSlider'); |
25 | 22 | const {
|
26 | 23 | type = GradientSliderTypes.DEFAULT,
|
27 | 24 | gradientSteps = 120,
|
28 |
| - color: propsColors = Colors.$backgroundPrimaryHeavy, |
29 |
| - sliderContext, |
30 |
| - onValueChange: _onValueChange, |
| 25 | + color, |
| 26 | + onValueChange, |
31 | 27 | migrate,
|
32 | 28 | containerStyle,
|
33 | 29 | disabled,
|
34 | 30 | accessible,
|
35 | 31 | forwardedRef,
|
36 | 32 | ...others
|
37 |
| - } = props; |
| 33 | + } = themeProps; |
| 34 | + const sliderContext = useContext(SliderContext); |
| 35 | + const defaultColor = Colors.getHSL(Colors.$backgroundPrimaryHeavy); |
38 | 36 |
|
39 |
| - const initialColor = useMemo((): HSLA => { |
40 |
| - return _.isString(propsColors) ? Colors.getHSL(propsColors) : propsColors; |
41 |
| - }, [propsColors]); |
42 |
| - const [color, setColor] = useState(initialColor); |
43 |
| - |
44 |
| - useEffect(() => { |
45 |
| - setColor(initialColor); |
46 |
| - }, [initialColor]); |
| 37 | + const initialColor = useMemo((): HSLA | undefined => { |
| 38 | + return _.isString(color) ? Colors.getHSL(color) : color; |
| 39 | + }, [color]); |
47 | 40 |
|
48 | 41 | const getColor = useCallback(() => {
|
49 |
| - return color || sliderContext.value; |
50 |
| - }, [color, sliderContext.value]); |
| 42 | + return initialColor || sliderContext.value || defaultColor; |
| 43 | + }, [initialColor, sliderContext.value, defaultColor]); |
51 | 44 |
|
52 | 45 | const hueColor = useMemo(() => {
|
53 | 46 | const color = getColor();
|
@@ -75,26 +68,19 @@ const GradientSlider = <T extends string | HSLA = string>(props: Props<T>) => {
|
75 | 68 | return <Gradient type={Gradient.types.SATURATION} color={hueColor} numberOfSteps={gradientSteps}/>;
|
76 | 69 | }, [hueColor, gradientSteps]);
|
77 | 70 |
|
78 |
| - const onValueChange = useCallback((value: string, alpha: number) => { |
79 |
| - // alpha returns for type.DEFAULT |
80 |
| - _onValueChange?.(value, alpha); |
81 |
| - }, |
82 |
| - [_onValueChange]); |
83 |
| - |
84 | 71 | const updateColor = useCallback((color: HSLA) => {
|
85 | 72 | if (!_.isEmpty(sliderContext)) {
|
86 | 73 | sliderContext.setValue?.(color);
|
87 | 74 | } else {
|
88 |
| - setColor(color); |
89 |
| - const hex = Colors.getHexString(color); |
90 |
| - onValueChange(hex, color.a); |
| 75 | + const hex = Colors.getHexString(color); // alpha returns for type.DEFAULT |
| 76 | + onValueChange?.(hex, color.a); |
91 | 77 | }
|
92 | 78 | },
|
93 | 79 | [sliderContext, onValueChange]);
|
94 | 80 |
|
95 | 81 | const reset = useCallback(() => {
|
96 |
| - updateColor(initialColor); |
97 |
| - }, [initialColor, updateColor]); |
| 82 | + updateColor(initialColor || defaultColor); |
| 83 | + }, [initialColor, updateColor, defaultColor]); |
98 | 84 |
|
99 | 85 | const updateAlpha = useCallback((a: number) => {
|
100 | 86 | const color = getColor();
|
@@ -122,25 +108,26 @@ const GradientSlider = <T extends string | HSLA = string>(props: Props<T>) => {
|
122 | 108 |
|
123 | 109 | let step = 0.01;
|
124 | 110 | let maximumValue = 1;
|
125 |
| - let value = color.a; |
| 111 | + const initialValue = useMemo(() => getColor(), []); |
| 112 | + let value = initialValue.a; |
126 | 113 | let renderTrack = renderDefaultGradient;
|
127 | 114 | let sliderOnValueChange = updateAlpha;
|
128 | 115 |
|
129 | 116 | switch (type) {
|
130 | 117 | case GradientSliderTypes.HUE:
|
131 | 118 | step = 1;
|
132 | 119 | maximumValue = 359;
|
133 |
| - value = initialColor.h; |
| 120 | + value = initialValue.h; |
134 | 121 | renderTrack = renderHueGradient;
|
135 | 122 | sliderOnValueChange = updateHue;
|
136 | 123 | break;
|
137 | 124 | case GradientSliderTypes.LIGHTNESS:
|
138 |
| - value = initialColor.l; |
| 125 | + value = initialValue.l; |
139 | 126 | renderTrack = renderLightnessGradient;
|
140 | 127 | sliderOnValueChange = updateLightness;
|
141 | 128 | break;
|
142 | 129 | case GradientSliderTypes.SATURATION:
|
143 |
| - value = initialColor.s; |
| 130 | + value = initialValue.s; |
144 | 131 | renderTrack = renderSaturationGradient;
|
145 | 132 | sliderOnValueChange = updateSaturation;
|
146 | 133 | break;
|
@@ -170,8 +157,4 @@ const GradientSlider = <T extends string | HSLA = string>(props: Props<T>) => {
|
170 | 157 |
|
171 | 158 | GradientSlider.displayName = 'GradientSlider';
|
172 | 159 | GradientSlider.types = GradientSliderTypes;
|
173 |
| -// @ts-expect-error |
174 |
| -export default asBaseComponent<GradientSliderProps, ComponentStatics<typeof GradientSlider>>( |
175 |
| - // @ts-expect-error |
176 |
| - forwardRef(asSliderGroupChild(forwardRef(GradientSlider))) |
177 |
| -); |
| 160 | +export default forwardRef<GradientSliderProps<string | HSLA>, ComponentStatics<typeof GradientSlider>>(GradientSlider); |
0 commit comments