on 18759a2 help sign in
bridge/src/lib/useArray.js
44 lines 865 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 = useCallback(
10 () => _setItems(items => [...items, itemBuilder()]),
11 [_setItems, itemBuilder]
12 );
14 const removeAt = useCallback(
15 i =>
16 _setItems(items => {
17 const newItems = [...items.slice(0, i), ...items.slice(i + 1)];
18 return newItems;
19 }),
20 [_setItems]
21 );
23 const updateAt = useCallback(
24 (i, update = {}) =>
25 _setItems(items => [
26 ...items.slice(0, i),
27 {
28 ...items[i],
29 ...update,
30 },
31 ...items.slice(i + 1),
32 ]),
33 [_setItems]
34 );
36 return [
37 items,
38 {
39 append,
40 removeAt,
41 updateAt,
42 },
43 ];