[d565449] | 1 | import { useMemo, useRef } from 'react';
|
---|
| 2 | import useUpdate from './useUpdate';
|
---|
| 3 | import { resolveHookState } from './misc/hookState';
|
---|
| 4 | function useList(initialList) {
|
---|
| 5 | if (initialList === void 0) { initialList = []; }
|
---|
| 6 | var list = useRef(resolveHookState(initialList));
|
---|
| 7 | var update = useUpdate();
|
---|
| 8 | var actions = useMemo(function () {
|
---|
| 9 | var a = {
|
---|
| 10 | set: function (newList) {
|
---|
| 11 | list.current = resolveHookState(newList, list.current);
|
---|
| 12 | update();
|
---|
| 13 | },
|
---|
| 14 | push: function () {
|
---|
| 15 | var items = [];
|
---|
| 16 | for (var _i = 0; _i < arguments.length; _i++) {
|
---|
| 17 | items[_i] = arguments[_i];
|
---|
| 18 | }
|
---|
| 19 | items.length && actions.set(function (curr) { return curr.concat(items); });
|
---|
| 20 | },
|
---|
| 21 | updateAt: function (index, item) {
|
---|
| 22 | actions.set(function (curr) {
|
---|
| 23 | var arr = curr.slice();
|
---|
| 24 | arr[index] = item;
|
---|
| 25 | return arr;
|
---|
| 26 | });
|
---|
| 27 | },
|
---|
| 28 | insertAt: function (index, item) {
|
---|
| 29 | actions.set(function (curr) {
|
---|
| 30 | var arr = curr.slice();
|
---|
| 31 | index > arr.length ? (arr[index] = item) : arr.splice(index, 0, item);
|
---|
| 32 | return arr;
|
---|
| 33 | });
|
---|
| 34 | },
|
---|
| 35 | update: function (predicate, newItem) {
|
---|
| 36 | actions.set(function (curr) { return curr.map(function (item) { return (predicate(item, newItem) ? newItem : item); }); });
|
---|
| 37 | },
|
---|
| 38 | updateFirst: function (predicate, newItem) {
|
---|
| 39 | var index = list.current.findIndex(function (item) { return predicate(item, newItem); });
|
---|
| 40 | index >= 0 && actions.updateAt(index, newItem);
|
---|
| 41 | },
|
---|
| 42 | upsert: function (predicate, newItem) {
|
---|
| 43 | var index = list.current.findIndex(function (item) { return predicate(item, newItem); });
|
---|
| 44 | index >= 0 ? actions.updateAt(index, newItem) : actions.push(newItem);
|
---|
| 45 | },
|
---|
| 46 | sort: function (compareFn) {
|
---|
| 47 | actions.set(function (curr) { return curr.slice().sort(compareFn); });
|
---|
| 48 | },
|
---|
| 49 | filter: function (callbackFn, thisArg) {
|
---|
| 50 | actions.set(function (curr) { return curr.slice().filter(callbackFn, thisArg); });
|
---|
| 51 | },
|
---|
| 52 | removeAt: function (index) {
|
---|
| 53 | actions.set(function (curr) {
|
---|
| 54 | var arr = curr.slice();
|
---|
| 55 | arr.splice(index, 1);
|
---|
| 56 | return arr;
|
---|
| 57 | });
|
---|
| 58 | },
|
---|
| 59 | clear: function () {
|
---|
| 60 | actions.set([]);
|
---|
| 61 | },
|
---|
| 62 | reset: function () {
|
---|
| 63 | actions.set(resolveHookState(initialList).slice());
|
---|
| 64 | },
|
---|
| 65 | };
|
---|
| 66 | /**
|
---|
| 67 | * @deprecated Use removeAt method instead
|
---|
| 68 | */
|
---|
| 69 | a.remove = a.removeAt;
|
---|
| 70 | return a;
|
---|
| 71 | }, []);
|
---|
| 72 | return [list.current, actions];
|
---|
| 73 | }
|
---|
| 74 | export default useList;
|
---|