on 81c364b help sign in
bridge/src/lib/useArray.js
48 lines 994 B history raw
1import { useCallback, useState } from 'react';
2import { identity } from 'lodash';
4/**
5 * Manages an immutable array of items.
6 */
7export default function useArray(initialItems = [], itemBuilder = identity) {
8 const [items, _setItems] = useState(initialItems);
10 const append = useCallback(
11 item => _setItems(items => [...items, itemBuilder(item)]),
12 [_setItems, itemBuilder]
13 );
15 const removeAt = useCallback(
16 i =>
17 _setItems(items => {
18 const newItems = [...items.slice(0, i), ...items.slice(i + 1)];
19 return newItems;
20 }),
21 [_setItems]
22 );
24 const updateAt = useCallback(
25 (i, update = {}) =>
26 _setItems(items => [
27 ...items.slice(0, i),
28 {
29 ...items[i],
30 ...update,
31 },
32 ...items.slice(i + 1),
33 ]),
34 [_setItems]
35 );
37 const clear = useCallback(() => _setItems([]), [_setItems]);
39 return [
40 items,
41 {
42 append,
43 removeAt,
44 updateAt,
45 clear,
46 },
47 ];