@gravityforms/components
Version:
UI components for use in Gravity Forms development. Both React and vanilla js flavors.
215 lines (206 loc) • 4.99 kB
JavaScript
import { React } from '@gravityforms/libraries';
import { getModules } from './utils';
const { useCallback, useState } = React;
/**
* @function resolveCount
* @description Resolves the count of cards in each Kanban item.
*
* @since 5.8.4
*
* @param {Array<object>} data The Kanban data to resolve counts for.
*
* @return {Array<object>} The Kanban data with updated counts.
*/
const resolveCount = ( data ) => data.map( ( item ) => {
const count = item.cards ? item.cards.length : 0;
return {
...item,
props: {
...( item?.props || {} ),
columnCountAttributes: {
...( item?.props?.columnCountAttributes || {} ),
label: count.toString(),
},
},
};
} );
/**
* @module useKanbanState
* @description Custom hook to manage the state of the Kanban board.
*
* @since 5.8.4
*
* @param {object} props The props for the custom hook.
* @param {Array} props.initialData The initial data for the Kanban board.
* @param {object} props.initialState The initial module state.
* @param {Array} props.modules The modules for the kanban.
*
* @return {object} The current data and a function to update the data.
*
* @example
* const initialData = [
* {
* id: 'no-status',
* props: {
* columnCountAttributes: {
* label: '4',
* },
* columnLabelAttributes: {
* label: 'No Status',
* },
* },
* cards: [
* {
* component: KanbanCard,
* props: {
* id: 'card-1',
* children: 'Card 1 Content',
* headerContent: 'Card 1 Header',
* footerContent: 'Card 1 Footer',
* },
* },
* {
* component: KanbanCard,
* props: {
* id: 'card-2',
* children: 'Card 2 Content',
* headerContent: 'Card 2 Header',
* footerContent: 'Card 2 Footer',
* },
* },
* {
* component: KanbanCard,
* props: {
* id: 'card-3',
* children: 'Card 3 Content',
* headerContent: 'Card 3 Header',
* footerContent: 'Card 3 Footer',
* },
* },
* {
* component: KanbanCard,
* props: {
* id: 'card-4',
* children: 'Card 4 Content',
* headerContent: 'Card 4 Header',
* footerContent: 'Card 4 Footer',
* },
* },
* ],
* },
* {
* id: 'in-progress',
* props: {
* columnCountAttributes: {
* label: '2',
* },
* columnLabelAttributes: {
* label: 'In Progress',
* status: 'blue',
* },
* },
* cards: [
* {
* component: KanbanCard,
* props: {
* id: 'card-5',
* children: 'Card 5 Content',
* headerContent: 'Card 5 Header',
* footerContent: 'Card 5 Footer',
* },
* },
* {
* component: KanbanCard,
* props: {
* id: 'card-6',
* children: 'Card 6 Content',
* headerContent: 'Card 6 Header',
* footerContent: 'Card 6 Footer',
* },
* },
* ],
* },
* {
* id: 'completed',
* props: {
* columnCountAttributes: {
* label: '1',
* },
* columnLabelAttributes: {
* label: 'Completed',
* status: 'active',
* },
* },
* cards: [
* {
* component: KanbanCard,
* props: {
* id: 'card-7',
* children: 'Card 7 Content',
* headerContent: 'Card 7 Header',
* footerContent: 'Card 7 Footer',
* },
* },
* ],
* },
* ];
* const initialState = {
* moduleState: {},
* isLoading: false,
* };
* const modules = [ Search, SimpleFilters ];
* const { data, updateData, moduleState, updateModuleState, isLoading, setIsLoading } = useKanbanState( {
* initialData,
* initialState,
* modules,
* } );
*
*/
const useKanbanState = ( {
initialData = [],
initialState = {},
modules = [],
} ) => {
const [ moduleState, setModuleState ] = useState( () => {
const { Search, SimpleFilters } = getModules( modules, [ 'Search', 'SimpleFilters' ] );
return {
...( ( Search && Search?.getDefaultState() ) || {} ),
...( ( SimpleFilters && SimpleFilters?.getDefaultState() ) || {} ),
...( initialState?.moduleState || {} ),
};
} );
const [ data, setData ] = useState( initialData );
const [ isLoading, setIsLoading ] = useState( initialState?.isLoading || false );
/**
* @function updateModuleState
* @description Updates the module state with new values.
*
* @since 5.8.4
*
* @param {object} newState The new state to update the module state with.
*/
const updateModuleState = useCallback( ( newState ) => {
setModuleState( { ...moduleState, ...newState } );
}, [ moduleState ] );
/**
* @function updateData
* @description Updates the Kanban data.
*
* @since 5.8.4
*
* @param {Array<object>} newData The new data for the Kanban board.
*/
const updateData = useCallback( ( newData ) => {
const updatedData = resolveCount( newData );
setData( updatedData );
}, [] );
return {
data,
updateData,
moduleState,
updateModuleState,
isLoading,
setIsLoading,
};
};
export default useKanbanState;