on 17a8377 help sign in
bridge/src/lib/useArray.js
35 lines 714 B history raw
1import { useCallback, useState } from 'react';
3/**
4 * Manages an immutable array of items.
5 */
6export default function useArray(initialItems = [], itemBuilder) {
7 const [items, _setItems] = useState(initialItems);
9 const append = () => _setItems(items => [...items, itemBuilder()]);
11 const removeAt = i =>
12 _setItems(items => {
13 const newItems = [...items.slice(0, i), ...items.slice(i + 1)];
14 return newItems;
15 });
17 const updateAt = (i, update = {}) =>
18 _setItems(items => [
19 ...items.slice(0, i),
20 {
21 ...items[i],
22 ...update,
23 },
24 ...items.slice(i + 1),
25 ]);
27 return [
28 items,
29 {
30 append,
31 removeAt,
32 updateAt,
33 },
34 ];