react-use-object-state
Version:
React hooks to create stateful API's for reusable object patterns
443 lines (398 loc) • 11 kB
JavaScript
import { useState, useMemo } from 'react';
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
var __assign = function() {
__assign = Object.assign || function __assign(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
function __rest(s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
}
function __spreadArrays() {
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
for (var r = Array(s), k = 0, i = 0; i < il; i++)
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
r[k] = a[j];
return r;
}
var useObjectState = function (apiFactory, initialState) {
var _a = useState(initialState),
state = _a[0],
setState = _a[1];
return __assign(__assign({}, useMemo(function () {
return apiFactory(setState);
}, [apiFactory, setState])), {
state: state,
setState: setState
});
};
var anchorElStateFactory = function (setState) {
return {
clearAnchorEl: function () {
return setState(null);
},
setAnchorEl: function (event) {
setState(event.currentTarget);
}
};
};
var useAnchorElState = function (initialValue) {
var _a = useObjectState(anchorElStateFactory, initialValue),
anchorEl = _a.state,
setState = _a.setState,
args = __rest(_a, ["state", "setState"]);
return __assign({
anchorEl: anchorEl
}, args);
};
var deleteAt = function (index) {
return function (state) {
if (index >= 0 && index < state.length) {
return __spreadArrays(state.slice(0, index), state.slice(index + 1, state.length));
}
return state;
};
};
var clear = function () {
return [];
};
var pop = function (state) {
if (state.length > 0) {
return __spreadArrays(state.slice(0, state.length - 1));
}
return state;
};
var push = function (val) {
return function (state) {
return __spreadArrays(state, val);
};
};
var shift = function (state) {
if (state.length > 0) {
return deleteAt(0)(state);
}
return state;
};
var unshift = function (val) {
return function (state) {
return __spreadArrays(val, state);
};
};
var reverse = function (state) {
return __spreadArrays(state.reverse());
};
var insertAt = function (val, index) {
return function (state) {
if (index >= 0 && index < state.length) {
return __spreadArrays(state.slice(0, index), [val], state.slice(index));
}
return state;
};
};
var upsertAt = function (val, index) {
return function (state) {
if (index >= 0 && index < state.length) {
var stateCopy = state.slice();
stateCopy[index] = val;
return stateCopy;
}
return state;
};
};
var arrayStateFactory = function (setState) {
return {
clear: function () {
return setState(clear);
},
reverse: function () {
return setState(reverse);
},
pop: function () {
return setState(pop);
},
push: function () {
var val = [];
for (var _i = 0; _i < arguments.length; _i++) {
val[_i] = arguments[_i];
}
return setState(push(val));
},
shift: function () {
return setState(shift);
},
unshift: function () {
var val = [];
for (var _i = 0; _i < arguments.length; _i++) {
val[_i] = arguments[_i];
}
return setState(unshift(val));
},
insertAt: function (val, index) {
return setState(insertAt(val, index));
},
upsertAt: function (val, index) {
return setState(upsertAt(val, index));
},
deleteAt: function (index) {
return setState(deleteAt(index));
}
};
};
var useArrayState = function (initialState) {
return useObjectState(arrayStateFactory, initialState);
};
var booleanStateFactory = function (setState) {
return {
setTrue: function () {
return setState(true);
},
setFalse: function () {
return setState(false);
},
toggle: function () {
return setState(function (state) {
return !state;
});
}
};
};
var useBooleanState = function (initialState) {
return useObjectState(booleanStateFactory, initialState);
};
var incrementBy = function (val) {
return function (state) {
var max = state.max,
_a = state.count,
count = _a === void 0 ? 0 : _a;
if (max !== undefined && count + val > max) {
return __assign(__assign({}, state), {
count: max
});
} else {
return __assign(__assign({}, state), {
count: count + val
});
}
};
};
var decrementBy = function (val) {
return function (state) {
var min = state.min,
_a = state.count,
count = _a === void 0 ? 0 : _a;
if (min !== undefined && count - val <= min) {
return __assign(__assign({}, state), {
count: min
});
} else {
return __assign(__assign({}, state), {
count: count - val
});
}
};
};
var setCount = function (count) {
return function (state) {
return __assign(__assign({}, state), {
count: count
});
};
};
var setMin = function (min) {
return function (state) {
return __assign(__assign({}, state), {
min: min
});
};
};
var setMax = function (max) {
return function (state) {
return __assign(__assign({}, state), {
max: max
});
};
};
var counterStateFactory = function (setState) {
return {
increment: function () {
return setState(incrementBy(1));
},
decrement: function () {
return setState(decrementBy(1));
},
incrementBy: function (val) {
return setState(incrementBy(val));
},
decrementBy: function (val) {
return setState(decrementBy(val));
},
setCount: function (count) {
return setState(setCount(count));
},
setMin: function (min) {
return setState(setMin(min));
},
setMax: function (max) {
return setState(setMax(max));
}
};
};
var useCounterState = function (initialState) {
if (initialState === void 0) {
initialState = {
count: 0
};
}
var _a = useObjectState(counterStateFactory, initialState),
_b = _a.state,
count = _b.count,
min = _b.min,
max = _b.max,
setState = _a.setState,
counterState = __rest(_a, ["state", "setState"]);
return __assign({
count: count,
min: min,
max: max
}, counterState);
};
var mapStateFactory = function (setState) {
return {
clear: function () {
return setState(new Map());
},
set: function (key, value) {
return setState(function (state) {
return new Map(state.set(key, value));
});
},
delete: function (key) {
return setState(function (state) {
state.delete(key);
return new Map(state);
});
}
};
};
var useMapState = function (initialEntries) {
return useObjectState(mapStateFactory, new Map(initialEntries));
};
var findIndex = function (arr, value) {
return arr.findIndex(function (element) {
return JSON.stringify(element) === JSON.stringify(value);
});
};
var toggle = function (values) {
return function (state) {
var stateCopy = state.slice();
values.forEach(function (value) {
var index = findIndex(stateCopy, value);
if (index >= 0) {
stateCopy.splice(index, 1);
} else {
stateCopy.push(value);
}
});
return stateCopy;
};
};
var push$1 = function (values) {
return function (state) {
var uniqueNewVals = [];
values.forEach(function (value) {
if (findIndex(state, value) < 0) {
uniqueNewVals.push(value);
}
});
return push(uniqueNewVals)(state);
};
};
var unshift$1 = function (values) {
return function (state) {
var uniqueNewVals = [];
values.forEach(function (value) {
if (findIndex(state, value) < 0) {
uniqueNewVals.push(value);
}
});
return unshift(uniqueNewVals)(state);
};
};
var upsertAt$1 = function (val, index) {
return function (state) {
var indexOfVal = findIndex(state, val);
if (indexOfVal < 0) {
return upsertAt(val, index)(state);
}
return state;
};
};
var insertAt$1 = function (val, index) {
return function (state) {
var indexOfVal = findIndex(state, val);
if (indexOfVal < 0) {
return insertAt(val, index)(state);
}
return state;
};
};
var uniqueArrayStateFactory = function (setState) {
return __assign(__assign({}, arrayStateFactory(setState)), {
push: function () {
var val = [];
for (var _i = 0; _i < arguments.length; _i++) {
val[_i] = arguments[_i];
}
return setState(push$1(val));
},
toggle: function () {
var val = [];
for (var _i = 0; _i < arguments.length; _i++) {
val[_i] = arguments[_i];
}
return setState(toggle(val));
},
unshift: function () {
var val = [];
for (var _i = 0; _i < arguments.length; _i++) {
val[_i] = arguments[_i];
}
return setState(unshift$1(val));
},
insertAt: function (val, index) {
return setState(insertAt$1(val, index));
},
upsertAt: function (val, index) {
return setState(upsertAt$1(val, index));
}
});
};
var useUniqueArrayState = function (initialState) {
return useObjectState(uniqueArrayStateFactory, initialState);
};
export { anchorElStateFactory, arrayStateFactory, booleanStateFactory, counterStateFactory, mapStateFactory, uniqueArrayStateFactory, useAnchorElState, useArrayState, useBooleanState, useCounterState, useMapState, useObjectState, useUniqueArrayState };
//# sourceMappingURL=index.es.js.map