PluginProbe ʕ •ᴥ•ʔ
Starter Sites & Templates by Neve / trunk
Starter Sites & Templates by Neve vtrunk
1.4.1 1.4.0 1.3.0 1.2.29 1.2.28 1.2.6 1.2.7 1.2.8 1.2.9 trunk 1.0.10 1.0.11 1.0.7 1.0.8 1.0.9 1.1.0 1.1.1 1.1.10 1.1.11 1.1.12 1.1.13 1.1.14 1.1.15 1.1.16 1.1.17 1.1.18 1.1.19 1.1.2 1.1.20 1.1.21 1.1.22 1.1.23 1.1.24 1.1.25 1.1.26 1.1.27 1.1.28 1.1.29 1.1.3 1.1.30 1.1.31 1.1.32 1.1.33 1.1.34 1.1.35 1.1.36 1.1.37 1.1.38 1.1.39 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8 1.1.9 1.2.0 1.2.1 1.2.10 1.2.11 1.2.12 1.2.13 1.2.14 1.2.15 1.2.16 1.2.17 1.2.18 1.2.19 1.2.2 1.2.20 1.2.21 1.2.22 1.2.23 1.2.24 1.2.25 1.2.26 1.2.27 1.2.3 1.2.4 1.2.5
templates-patterns-collection / onboarding / src / Components / CategoryButtons.js
templates-patterns-collection / onboarding / src / Components Last commit date
CustomizeControls 2 months ago Steps 3 weeks ago App.js 2 years ago CategoryButtons.js 3 weeks ago CustomTooltip.js 2 years ago EditorSelector.js 2 years ago FeaturesList.js 4 days ago Filters.js 3 weeks ago Header.js 3 weeks ago ImportError.js 2 years ago ImportForm.js 1 year ago ImportMock.js 2 years ago ImportProgress.js 1 year ago Onboarding.js 3 weeks ago ProgressBar.js 2 years ago Search.js 3 weeks ago SitePreview.js 2 years ago SiteSettings.js 2 months ago Sites.js 3 weeks ago StarterSiteCard.js 4 days ago Toast.js 3 weeks ago WelcomeMock.js 2 years ago
CategoryButtons.js
69 lines
1 import { useSelect, useDispatch } from '@wordpress/data';
2 import classnames from 'classnames';
3 import { useMemo, useEffect } from '@wordpress/element';
4
5 const CategoryButtons = ( { categories, style } ) => {
6 const data = useSelect( ( select ) => ( {
7 category: select( 'ti-onboarding' ).getCurrentCategory(),
8 sitesMetadata: select( 'ti-onboarding' ).getSites(),
9 editor: select( 'ti-onboarding' ).getCurrentEditor(),
10 } ) );
11
12 const { setCategory } = useDispatch( 'ti-onboarding' );
13
14 const availableCategories = useMemo( () => {
15 return Object.keys( categories )
16 .filter(
17 ( key ) =>
18 // Show "All" and "Free" categories after user selection.
19 data.category || ( key !== 'all' && key !== 'free' )
20 )
21 .filter( ( key ) => {
22 // Hide "Free" is there is not free template available on the selected editor.
23 if ( key !== 'free' ) {
24 return true;
25 }
26 return Object.values( data.sitesMetadata.sites?.[ data.editor ] )?.some(
27 ( site ) => ! site?.upsell
28 );
29 } );
30 }, [ categories, data.category, data.sitesMetadata, data.editor ] );
31
32 const onClick = ( newCategory ) => {
33 setCategory( newCategory );
34 };
35
36 /**
37 * Default the category to 'all' when the current category is unavailable.
38 */
39 useEffect( () => {
40 if ( data.category && ! availableCategories.includes( data.category ) ) {
41 setCategory( 'all' );
42 }
43 }, [ data.category, availableCategories, setCategory ] );
44
45 return (
46 <div className="ob-cat-wrap" style={ style }>
47 { availableCategories.map( ( catSlug ) => {
48 const classes = classnames( {
49 cat: true,
50 [ catSlug ]: true,
51 active: catSlug === data.category,
52 } );
53
54 return (
55 <button
56 className={ classes }
57 key={ catSlug }
58 onClick={ () => onClick( catSlug ) }
59 >
60 { categories[ catSlug ] }
61 </button>
62 );
63 } ) }
64 </div>
65 );
66 };
67
68 export default CategoryButtons;
69