@shopify/react-form
Version:
Manage React forms tersely and safely-typed with no magic using React hooks
59 lines (54 loc) • 1.96 kB
JavaScript
import { useBaseList } from './baselist.mjs';
import { addFieldItemAction, editFieldItemAction, moveFieldItemAction, removeFieldItemAction, removeFieldItemsAction } from './hooks/reducer.mjs';
/*
A custom hook for dynamically adding and removing field items. This utilizes the base functionality of useBaseList.
* @param listOrConfig - A configuration object specifying both the value and validation config.
* @param fieldFactory - A factory function that produces field items according to the list items originally passed in for listOrConfig.
* @param validationDependencies - An array of dependencies to use to decide when to regenerate validators.
* @returns A list of dictionaries of `Field` objects representing the state of your input, an addItem function for adding list items (this calls your factory), and a removeItem function for removing list items by index.
*/
function useDynamicList(listOrConfig, fieldFactory, validationDependencies = []) {
const {
fields,
dispatch,
reset,
dirty,
newDefaultValue,
value,
defaultValue
} = useBaseList(listOrConfig, validationDependencies);
function addItem(factoryArgument) {
const itemToAdd = fieldFactory(factoryArgument);
if (Array.isArray(itemToAdd)) {
dispatch(addFieldItemAction(itemToAdd));
} else {
dispatch(addFieldItemAction([itemToAdd]));
}
}
function editItem(editedItem, index) {
dispatch(editFieldItemAction(editedItem, index));
}
function moveItem(fromIndex, toIndex) {
dispatch(moveFieldItemAction(fromIndex, toIndex));
}
function removeItem(index) {
dispatch(removeFieldItemAction(index));
}
function removeItems(indicesToRemove) {
dispatch(removeFieldItemsAction(indicesToRemove));
}
return {
fields,
addItem,
editItem,
removeItem,
removeItems,
moveItem,
reset,
dirty,
value,
newDefaultValue,
defaultValue
};
}
export { useDynamicList };