toggles
Version:
A collection of React hooks for toggles with dynamic noun and verb APIs
45 lines (44 loc) • 2.38 kB
JavaScript
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.setNounValue = exports.createNounFromState = exports.NounSetter = exports.nounState = void 0;
// noun state mapping - true for positive states, false for negative
var positiveStates = ['Active', 'Open', 'Shown', 'Visible', 'On', 'Checked', 'Enabled', 'Expanded', 'Activated', 'Connected', 'Focused', 'Mounted', 'Revealed', 'Locked', 'Subscribed'];
var negativeStates = ['Closed', 'Hidden', 'Off', 'Unchecked', 'Disabled', 'Collapsed', 'Deactivated', 'Disconnected', 'Blurred', 'Concealed', 'Unlocked'];
var hasStates = ['Started', 'Ended'];
exports.nounState = Object.fromEntries(__spreadArray(__spreadArray(__spreadArray([], positiveStates.map(function (s) { return ["is".concat(s), true]; }), true), negativeStates.map(function (s) { return ["is".concat(s), false]; }), true), hasStates.map(function (s, i) { return ["has".concat(s), i === 0]; }), true));
exports.NounSetter = Symbol.for('NounSetter');
function createNounFromState(name, getActive, setActive) {
return new Proxy({}, {
get: function (_, prop) {
if (prop === exports.NounSetter)
return setActive;
if (prop === 'name')
return name;
if (typeof prop === 'string' && prop in exports.nounState) {
return exports.nounState[prop] ? getActive() : !getActive();
}
return undefined;
}
});
}
exports.createNounFromState = createNounFromState;
function setNounValue(noun, value) {
if (!noun || typeof noun !== 'object') {
return console.warn("No setter on noun for ".concat(value ? 'positive' : 'negative', " action"));
}
var nounSetter = noun[exports.NounSetter];
if (typeof nounSetter !== 'function') {
return console.warn("No setter on noun ".concat(noun.name, " for ").concat(value ? 'positive' : 'negative', " action"));
}
nounSetter(value);
}
exports.setNounValue = setNounValue;
;