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.
31 lines
595 B
JavaScript
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
|
|
];
|
|
};
|