react-formstate-fp
Version:
An API to build, query, update, and bind formstate in React. Develop forms DRYly in React.
443 lines (363 loc) • 15.1 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.clearPromise = clearPromise;
exports.clearStatus = clearStatus;
exports.getAsyncEndTime = getAsyncEndTime;
exports.getAsyncError = getAsyncError;
exports.getAsyncStartTime = getAsyncStartTime;
exports.getAsyncToken = getAsyncToken;
exports.getCustomProperty = getCustomProperty;
exports.getInitialValue = getInitialValue;
exports.getMessage = getMessage;
exports.getValue = getValue;
exports.isAsynclyInvalid = isAsynclyInvalid;
exports.isAsynclyValid = isAsynclyValid;
exports.isAsynclyValidated = isAsynclyValidated;
exports.isBlurred = isBlurred;
exports.isChanged = isChanged;
exports.isInvalid = isInvalid;
exports.isSubmitted = isSubmitted;
exports.isSubmitting = isSubmitting;
exports.isSynclyInvalid = isSynclyInvalid;
exports.isSynclyValid = isSynclyValid;
exports.isSynclyValidated = isSynclyValidated;
exports.isValid = isValid;
exports.isValidated = isValidated;
exports.isWaiting = isWaiting;
exports.setAsyncError = setAsyncError;
exports.setAsyncFinished = setAsyncFinished;
exports.setAsyncStarted = setAsyncStarted;
exports.setAsynclyInvalid = setAsynclyInvalid;
exports.setAsynclyValid = setAsynclyValid;
exports.setBlurred = setBlurred;
exports.setChanged = setChanged;
exports.setCustomProperty = setCustomProperty;
exports.setInvalid = void 0;
exports.setMessage = setMessage;
exports.setNotSynclyValidated = setNotSynclyValidated;
exports.setNotValidated = void 0;
exports.setPromise = setPromise;
exports.setSubmitted = setSubmitted;
exports.setSubmitting = setSubmitting;
exports.setSynclyInvalid = setSynclyInvalid;
exports.setSynclyValid = setSynclyValid;
exports.setTouched = setTouched;
exports.setValid = void 0;
exports.setValueAndClearStatus = setValueAndClearStatus;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _helperFunctions = require("./helperFunctions.js");
var _schemaAndLookup = require("./schemaAndLookup.js");
//
// helpers
//
function createStatus() {
return {
touched: {},
synclyValid: null,
async: {},
message: '',
custom: {}
};
}
function getStatusAndId(formstate, modelKey) {
var id = (0, _schemaAndLookup.getId)(formstate, modelKey);
var status = formstate.statuses[id] || createStatus(getValue(formstate, modelKey));
return [status, id];
}
function getStatus(formstate, modelKey) {
return getStatusAndId(formstate, modelKey)[0];
}
function upsertStatus(formstate, id, status, message) {
if (message !== undefined) {
status = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, status), {}, {
message: cleanMessage(message)
});
}
var statuses = (0, _objectSpread2["default"])({}, formstate.statuses);
statuses[id] = status;
return (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, formstate), {}, {
statuses: statuses
});
}
function clearStatus(formstate, modelKey) {
return upsertStatus(formstate, (0, _schemaAndLookup.getId)(formstate, modelKey), createStatus());
} //
// reading field/scope status
//
function getValue(formstate, modelKey) {
var rootModelKey = (0, _schemaAndLookup.convertToRootModelKey)(formstate, modelKey);
return (0, _helperFunctions.modelGet)(formstate.model, rootModelKey);
}
function getInitialValue(formstate, modelKey) {
var rootModelKey = (0, _schemaAndLookup.convertToRootModelKey)(formstate, modelKey);
return (0, _helperFunctions.modelGet)(formstate.initialModel, rootModelKey, false);
}
function isSynclyValid(formstate, modelKey) {
return getStatus(formstate, modelKey).synclyValid === true;
}
function isSynclyInvalid(formstate, modelKey) {
return getStatus(formstate, modelKey).synclyValid === false;
}
function isSynclyValidated(formstate, modelKey) {
return getStatus(formstate, modelKey).synclyValid !== null;
}
function isWaiting(formstate, modelKey) {
var s = getStatus(formstate, modelKey);
return Boolean(s.async.started && !s.async.finished);
}
function isAsynclyValid(formstate, modelKey) {
return getStatus(formstate, modelKey).async.asynclyValid === true;
}
function isAsynclyInvalid(formstate, modelKey) {
return getStatus(formstate, modelKey).async.asynclyValid === false;
}
function isAsynclyValidated(formstate, modelKey) {
var s = getStatus(formstate, modelKey);
return s.async.asynclyValid === true || s.async.asynclyValid === false;
}
function getAsyncError(formstate, modelKey) {
return getStatus(formstate, modelKey).async.error;
}
function getAsyncToken(formstate, modelKey) {
return getStatus(formstate, modelKey).async.token;
}
function getAsyncStartTime(formstate, modelKey) {
return getStatus(formstate, modelKey).async.started;
}
function getAsyncEndTime(formstate, modelKey) {
return getStatus(formstate, modelKey).async.finished;
} // function getValidity(formstate, modelKey) {
// if (isInvalid(formstate, modelKey)) {return false;}
// if (isValid(formstate, modelKey)) {return true;}
// return null;
// }
function isValid(formstate, modelKey) {
var s = getStatus(formstate, modelKey);
if (s.synclyValid === false || s.async.asynclyValid === false || Boolean(s.async.error)) {
return false;
}
if (s.async.asynclyValid === true) {
return true;
}
if (s.synclyValid === true) {
return Boolean(!s.async.started || s.async.finished);
}
return false;
}
function isInvalid(formstate, modelKey) {
var s = getStatus(formstate, modelKey);
return s.synclyValid === false || s.async.asynclyValid === false;
}
function isValidated(formstate, modelKey) {
return isValid(formstate, modelKey) || isInvalid(formstate, modelKey);
}
function getMessage(formstate, modelKey) {
return getStatus(formstate, modelKey).message;
}
function isChanged(formstate, modelKey) {
return getStatus(formstate, modelKey).touched.changed === true;
}
function isBlurred(formstate, modelKey) {
return getStatus(formstate, modelKey).touched.blurred === true;
}
function isSubmitting(formstate, modelKey) {
return getStatus(formstate, modelKey).touched.submitted === 'submitting';
}
function isSubmitted(formstate, modelKey) {
return getStatus(formstate, modelKey).touched.submitted === true;
}
function getCustomProperty(formstate, modelKey, name) {
return getStatus(formstate, modelKey).custom[name];
} //
// updating field/scope status
//
function setValueAndClearStatus(formstate, modelKey, value) {
var rootModelKey = (0, _schemaAndLookup.convertToRootModelKey)(formstate, modelKey);
if ((0, _schemaAndLookup.isScope)(formstate, (0, _schemaAndLookup.getId)(formstate, modelKey))) {
throw new Error("You cannot set the value for a scope. You can configure \"".concat(rootModelKey, "\" as a field using a validation schema (for something like a multi-select), or you can use addModelKey and deleteModelKey to modify actual scopes."));
}
formstate = clearStatus(formstate, modelKey); // Clear all affected scopes too.
// Cannot use a relative model key for scopes above the nested scope...
var nestedScopeId = formstate.nestedScopeId;
formstate = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, formstate), {}, {
nestedScopeId: null
});
Object.keys(formstate.lookup.scopes).forEach(function (scopeId) {
var rootScopeKey = (0, _schemaAndLookup.getRootModelKey)(formstate, scopeId);
if ((0, _helperFunctions.inScope)(rootModelKey, rootScopeKey)) {
formstate = clearStatus(formstate, rootScopeKey);
}
});
var model = (0, _helperFunctions.modelAssign)(formstate.model, rootModelKey, value);
return (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, formstate), {}, {
model: model,
nestedScopeId: nestedScopeId
});
}
function cleanMessage(message) {
return (0, _helperFunctions.isNonEmptyString)(message) ? message : '';
}
function setValidity(formstate, modelKey, value, message) {
var _getStatusAndId = getStatusAndId(formstate, modelKey),
_getStatusAndId2 = (0, _slicedToArray2["default"])(_getStatusAndId, 2),
status = _getStatusAndId2[0],
id = _getStatusAndId2[1];
var newStatus = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, status), {}, {
synclyValid: value
});
return upsertStatus(formstate, id, newStatus, message);
}
function setNotSynclyValidated(formstate, modelKey, message) {
return setValidity(formstate, modelKey, null, message);
}
function setSynclyValid(formstate, modelKey, message) {
return setValidity(formstate, modelKey, true, message);
}
function setSynclyInvalid(formstate, modelKey, message) {
return setValidity(formstate, modelKey, false, message);
}
var setNotValidated = setNotSynclyValidated;
exports.setNotValidated = setNotValidated;
var setValid = setSynclyValid;
exports.setValid = setValid;
var setInvalid = setSynclyInvalid;
exports.setInvalid = setInvalid;
function setAsyncStarted(formstate, modelKey, message) {
var _getStatusAndId3 = getStatusAndId(formstate, modelKey),
_getStatusAndId4 = (0, _slicedToArray2["default"])(_getStatusAndId3, 2),
status = _getStatusAndId4[0],
id = _getStatusAndId4[1];
var newStatus = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, status), {}, {
async: {
token: (0, _helperFunctions.generateQuickGuid)(),
started: Date.now(),
finished: null,
asynclyValid: null
}
});
return upsertStatus(formstate, id, newStatus, message);
}
function setPromise(formstate, asyncToken, promise) {
var promises = (0, _objectSpread2["default"])({}, formstate.formStatus.promises);
promises[asyncToken] = promise;
return (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, formstate), {}, {
formStatus: (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, formstate.formStatus), {}, {
promises: promises
})
});
}
function clearPromise(formstate, asyncToken) {
var promises = (0, _objectSpread2["default"])({}, formstate.formStatus.promises);
delete promises[asyncToken];
return (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, formstate), {}, {
formStatus: (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, formstate.formStatus), {}, {
promises: promises
})
});
}
function setAsyncFinished(asyncToken, formstate, modelKey, message, result) {
formstate = clearPromise(formstate, asyncToken);
var _getStatusAndId5 = getStatusAndId(formstate, modelKey),
_getStatusAndId6 = (0, _slicedToArray2["default"])(_getStatusAndId5, 2),
status = _getStatusAndId6[0],
id = _getStatusAndId6[1];
if (status.async.token !== asyncToken) {
return formstate;
}
var newStatus = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, status), {}, {
async: (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, status.async), {}, {
finished: Date.now()
}, result)
});
return upsertStatus(formstate, id, newStatus, message);
} // function setNotAsynclyValidated(formstate, modelKey, message) {
// const [status, id] = getStatusAndId(formstate, modelKey);
// const newStatus = {...status, async: {}};
// return upsertStatus(formstate, id, newStatus, message);
// }
function setAsynclyValid(asyncToken, formstate, modelKey, message) {
return setAsyncFinished(asyncToken, formstate, modelKey, message, {
asynclyValid: true
});
}
function setAsynclyInvalid(asyncToken, formstate, modelKey, message) {
return setAsyncFinished(asyncToken, formstate, modelKey, message, {
asynclyValid: false
});
}
function setAsyncError(asyncToken, formstate, modelKey, error, message) {
return setAsyncFinished(asyncToken, formstate, modelKey, message, {
error: error || new Error('Unknown error.')
});
}
function setMessage(formstate, modelKey, message) {
var _getStatusAndId7 = getStatusAndId(formstate, modelKey),
_getStatusAndId8 = (0, _slicedToArray2["default"])(_getStatusAndId7, 2),
status = _getStatusAndId8[0],
id = _getStatusAndId8[1];
return upsertStatus(formstate, id, status, message || '');
}
function setTouched(formstate, modelKey, howTouched) {
var _getStatusAndId9 = getStatusAndId(formstate, modelKey),
_getStatusAndId10 = (0, _slicedToArray2["default"])(_getStatusAndId9, 2),
status = _getStatusAndId10[0],
id = _getStatusAndId10[1];
var newStatus = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, status), {}, {
touched: (0, _objectSpread2["default"])({}, status.touched)
});
newStatus.touched[howTouched] = true;
return upsertStatus(formstate, id, newStatus);
}
function setChanged(formstate, modelKey) {
formstate = setTouched(formstate, modelKey, 'changed'); // Set all affected scopes changed too.
var rootModelKey = (0, _schemaAndLookup.convertToRootModelKey)(formstate, modelKey); // Cannot use a relative model key for scopes above the nested scope...
var nestedScopeId = formstate.nestedScopeId;
formstate = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, formstate), {}, {
nestedScopeId: null
});
Object.keys(formstate.lookup.scopes).forEach(function (scopeId) {
var rootScopeKey = (0, _schemaAndLookup.getRootModelKey)(formstate, scopeId);
if ((0, _helperFunctions.inScope)(rootModelKey, rootScopeKey)) {
formstate = setTouched(formstate, rootScopeKey, 'changed');
}
});
return (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, formstate), {}, {
nestedScopeId: nestedScopeId
});
}
function setBlurred(formstate, modelKey) {
return setTouched(formstate, modelKey, 'blurred');
}
function setSubmitting(formstate, modelKey) {
var _getStatusAndId11 = getStatusAndId(formstate, modelKey),
_getStatusAndId12 = (0, _slicedToArray2["default"])(_getStatusAndId11, 2),
status = _getStatusAndId12[0],
id = _getStatusAndId12[1];
if (status.touched.submitted === true && !status.async.error) {
return formstate;
}
var newStatus = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, status), {}, {
touched: (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, status.touched), {}, {
submitted: 'submitting'
})
});
return upsertStatus(formstate, id, newStatus);
}
function setSubmitted(formstate, modelKey) {
return setTouched(formstate, modelKey, 'submitted');
}
function setCustomProperty(formstate, modelKey, name, value) {
var _getStatusAndId13 = getStatusAndId(formstate, modelKey),
_getStatusAndId14 = (0, _slicedToArray2["default"])(_getStatusAndId13, 2),
status = _getStatusAndId14[0],
id = _getStatusAndId14[1];
var newStatus = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, status), {}, {
custom: (0, _objectSpread2["default"])({}, status.custom)
});
newStatus.custom[name] = value;
return upsertStatus(formstate, id, newStatus);
}