import { removeAtIndex } from "@saleor/utils/lists"; import useStateFromProps from "./useStateFromProps"; export type FormsetChange = (id: string, value: TValue) => void; export interface FormsetAtomicData { data: TData; id: string; label: string; value: TValue; } export type FormsetData = Array< FormsetAtomicData >; export interface UseFormsetOutput { add: (data: FormsetAtomicData) => void; change: FormsetChange; data: FormsetData; get: (id: string) => FormsetAtomicData; // Used for some rare situations like dataset change set: (data: FormsetData) => void; remove: (id: string) => void; } function useFormset( initial: FormsetData ): UseFormsetOutput { const [data, setData] = useStateFromProps>( initial || [] ); function addItem(itemData: FormsetAtomicData) { setData(prevData => [...prevData, itemData]); } function getItem(id: string): FormsetAtomicData { return data.find(item => item.id === id); } function removeItem(id: string) { setData(prevData => removeAtIndex( prevData, prevData.findIndex(item => item.id === id) ) ); } function setItemValue(id: string, value: TValue) { setData(data => { const itemIndex = data.findIndex(item => item.id === id); return [ ...data.slice(0, itemIndex), { ...data[itemIndex], value }, ...data.slice(itemIndex + 1) ]; }); } return { add: addItem, change: setItemValue, data, get: getItem, remove: removeItem, set: setData }; } export default useFormset;