PluginProbe
Elementor Website Builder – more than just a page builder / 3.8.0-beta1
Elementor Website Builder – more than just a page builder v3.8.0-beta1
4.3.4 4.3.3 4.3.2 4.3.1 4.3.0 4.3.0-beta3 4.3.0-beta2 4.3.0-beta1 4.2.4 4.2.3 4.2.2 4.2.1 4.2.0 4.1.5 4.2.0-beta2 4.2.0-dev2 4.2.0-beta1 4.1.4 4.1.3 4.1.2 4.1.1 4.1.0 4.1.0-beta3 4.1.0-dev3 4.0.9 All 457 releases
elementor / app / modules / kit-library / assets / js / hooks / use-kits.js

use-kits.js in Elementor Website Builder – more than just a page builder 3.8.0-beta1, at app/modules/kit-library/assets/js/hooks/use-kits.js

188 lines 4.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 import Kit from '../models/kit';
2 import useSelectedTaxonomies from './use-selected-taxonomies';
3 import { taxonomyType } from '../models/taxonomy';
4 import { useQuery } from 'react-query';
5 import { useState, useMemo, useCallback, useEffect } from 'react';
6
7 export const KEY = 'kits';
8
9 /**
10 * The default query params
11 *
12 * @type {Object}
13 */
14 export const defaultQueryParams = {
15 favorite: false,
16 search: '',
17 taxonomies: taxonomyType.reduce( ( current, { key } ) => {
18 return {
19 ...current,
20 [ key ]: [],
21 };
22 }, {} ),
23 order: {
24 direction: 'asc',
25 by: 'featuredIndex',
26 },
27 referrer: null,
28 };
29
30 const kitsPipeFunctions = {
31 /**
32 * Filter by favorite
33 *
34 * @param {Array<*>} data
35 * @param {*} queryParams
36 * @return {Array} filtered data
37 */
38 favoriteFilter: ( data, queryParams ) => {
39 if ( ! queryParams.favorite ) {
40 return data;
41 }
42
43 return data.filter( ( item ) => item.isFavorite );
44 },
45
46 /**
47 * Filter by search term.
48 *
49 * @param {Array<*>} data
50 * @param {*} queryParams
51 * @return {Array} filtered data
52 */
53 searchFilter: ( data, queryParams ) => {
54 if ( ! queryParams.search ) {
55 return data;
56 }
57
58 return data.filter( ( item ) => {
59 const keywords = [ ...item.keywords, ...item.taxonomies, item.title ];
60 const searchTerm = queryParams.search.toLowerCase();
61
62 return keywords.some( ( keyword ) => keyword.toLowerCase().includes( searchTerm ) );
63 } );
64 },
65
66 /**
67 * Filter by taxonomies.
68 * In each taxonomy type it use the OR operator and between types it uses the AND operator.
69 *
70 * @param {Array<*>} data
71 * @param {*} queryParams
72 * @return {Array} filtered data
73 */
74 taxonomiesFilter: ( data, queryParams ) => {
75 return Object.values( queryParams.taxonomies )
76 .filter( ( taxonomies ) => taxonomies.length )
77 .reduce( ( current, taxonomies ) => current.filter( ( item ) =>
78 taxonomies.some( ( taxonomy ) =>
79 item.taxonomies.some( ( itemTaxonomy ) => taxonomy === itemTaxonomy ),
80 ) ),
81 data,
82 );
83 },
84
85 /**
86 * Sort all the data by the "order" query param
87 *
88 * @param {Array<*>} data
89 * @param {*} queryParams
90 * @return {Array} sorted data
91 */
92 sort: ( data, queryParams ) => {
93 const order = queryParams.order;
94
95 return data.sort( ( item1, item2 ) => {
96 if ( 'asc' === order.direction ) {
97 return item1[ order.by ] - item2[ order.by ];
98 }
99
100 return item2[ order.by ] - item1[ order.by ];
101 } );
102 },
103 };
104
105 /**
106 * A util function to transform data throw transform functions
107 *
108 * @param {Array<Function>} functions
109 * @return {function(*=, ...[*]): *} function
110 */
111 function pipe( ...functions ) {
112 return ( value, ...args ) =>
113 functions.reduce(
114 ( currentValue, currentFunction ) => currentFunction( currentValue, ...args ),
115 value,
116 );
117 }
118
119 /**
120 * Fetch kits
121 *
122 * @param {boolean} force
123 * @return {*} kits
124 */
125 function fetchKits( force ) {
126 return $e.data.get( 'kits/index', {
127 force: force ? 1 : undefined,
128 }, { refresh: true } )
129 .then( ( response ) => response.data )
130 .then( ( { data } ) => data.map( ( item ) => Kit.createFromResponse( item ) ) );
131 }
132
133 /**
134 * Main function.
135 *
136 * @param {*} initialQueryParams
137 * @return {Object} query
138 */
139 export default function useKits( initialQueryParams = {} ) {
140 const [ force, setForce ] = useState( false );
141 const [ queryParams, setQueryParams ] = useState( () => ( {
142 ready: false, // When the query param is ready to use (after parsing and assign the query param from the url)
143 ...defaultQueryParams,
144 ...initialQueryParams,
145 } ) );
146
147 const forceRefetch = useCallback( () => setForce( true ), [ setForce ] );
148
149 const clearQueryParams = useCallback(
150 () => setQueryParams( { ready: true, ...defaultQueryParams, ...initialQueryParams } ),
151 [ setQueryParams ],
152 );
153
154 const query = useQuery( [ KEY ], () => fetchKits( force ) );
155
156 const data = useMemo(
157 () => ! query.data
158 ? []
159 : pipe( ...Object.values( kitsPipeFunctions ) )( [ ...query.data ], queryParams ),
160 [ query.data, queryParams ],
161 );
162
163 const selectedTaxonomies = useSelectedTaxonomies( queryParams.taxonomies );
164
165 const isFilterActive = useMemo(
166 () => !! queryParams.search || !! selectedTaxonomies.length,
167 [ queryParams ],
168 );
169
170 useEffect( () => {
171 if ( ! force ) {
172 return;
173 }
174
175 query.refetch().then( () => setForce( false ) );
176 }, [ force ] );
177
178 return {
179 ...query,
180 data,
181 queryParams,
182 setQueryParams,
183 clearQueryParams,
184 forceRefetch,
185 isFilterActive,
186 };
187 }
188