-
Notifications
You must be signed in to change notification settings - Fork 4.3k
/
Copy pathuse-gradient.js
122 lines (113 loc) · 3.16 KB
/
use-gradient.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/**
* WordPress dependencies
*/
import { useCallback, useMemo } from '@wordpress/element';
import { useSelect, useDispatch } from '@wordpress/data';
/**
* Internal dependencies
*/
import { useBlockEditContext } from '../block-edit';
import { useSettings } from '../use-settings';
import { store as blockEditorStore } from '../../store';
export function __experimentalGetGradientClass( gradientSlug ) {
if ( ! gradientSlug ) {
return undefined;
}
return `has-${ gradientSlug }-gradient-background`;
}
/**
* Retrieves the gradient value per slug.
*
* @param {Array} gradients Gradient Palette
* @param {string} slug Gradient slug
*
* @return {string} Gradient value.
*/
export function getGradientValueBySlug( gradients, slug ) {
const gradient = gradients?.find( ( g ) => g.slug === slug );
return gradient && gradient.gradient;
}
export function __experimentalGetGradientObjectByGradientValue(
gradients,
value
) {
const gradient = gradients?.find( ( g ) => g.gradient === value );
return gradient;
}
/**
* Retrieves the gradient slug per slug.
*
* @param {Array} gradients Gradient Palette
* @param {string} value Gradient value
* @return {string} Gradient slug.
*/
export function getGradientSlugByValue( gradients, value ) {
const gradient = __experimentalGetGradientObjectByGradientValue(
gradients,
value
);
return gradient && gradient.slug;
}
export function __experimentalUseGradient( {
gradientAttribute = 'gradient',
customGradientAttribute = 'customGradient',
} = {} ) {
const { clientId } = useBlockEditContext();
const [
userGradientPalette,
themeGradientPalette,
defaultGradientPalette,
] = useSettings(
'color.gradients.custom',
'color.gradients.theme',
'color.gradients.default'
);
const allGradients = useMemo(
() => [
...( userGradientPalette || [] ),
...( themeGradientPalette || [] ),
...( defaultGradientPalette || [] ),
],
[ userGradientPalette, themeGradientPalette, defaultGradientPalette ]
);
const { gradient, customGradient } = useSelect(
( select ) => {
const { getBlockAttributes } = select( blockEditorStore );
const attributes = getBlockAttributes( clientId ) || {};
return {
customGradient: attributes[ customGradientAttribute ],
gradient: attributes[ gradientAttribute ],
};
},
[ clientId, gradientAttribute, customGradientAttribute ]
);
const { updateBlockAttributes } = useDispatch( blockEditorStore );
const setGradient = useCallback(
( newGradientValue ) => {
const slug = getGradientSlugByValue(
allGradients,
newGradientValue
);
if ( slug ) {
updateBlockAttributes( clientId, {
[ gradientAttribute ]: slug,
[ customGradientAttribute ]: undefined,
} );
return;
}
updateBlockAttributes( clientId, {
[ gradientAttribute ]: undefined,
[ customGradientAttribute ]: newGradientValue,
} );
},
[ allGradients, clientId, updateBlockAttributes ]
);
const gradientClass = __experimentalGetGradientClass( gradient );
let gradientValue;
if ( gradient ) {
gradientValue = getGradientValueBySlug( allGradients, gradient );
} else {
gradientValue = customGradient;
}
return { gradientClass, gradientValue, setGradient };
}