You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ui-lib/src/util/use-indexed-state.js

31 lines
595 B
JavaScript

"use strict";
const React = require("react");
const timm = require("timm");
module.exports = function useIndexedState(initialState = []) {
let [ state, setState ] = React.useState(initialState);
function setIndexedState(index, value) {
setState((oldArray) => {
let evaluatedValue = (typeof value === "function")
? value(oldArray[index])
: value;
return timm.replaceAt(oldArray, index, evaluatedValue);
});
}
function resetState() {
setState((oldArray) => {
return oldArray.map(() => undefined);
});
}
return [
state,
setIndexedState,
resetState
];
};