es-grid-template
Version:
es-grid-template
53 lines (52 loc) • 1.84 kB
JavaScript
import cx from 'classnames';
function composeEventHandler(handler1, handler2) {
return (...args) => {
// Execute the original event handler first
handler1(args);
handler2(args);
// Event handlers do not return a value, so nothing is returned here
};
}
/** Merge two cellProps objects and return a new merged object.
*
* mergeCellProps merges according to these rules:
* - For primitive fields (number, string, boolean), values from `extra` override `base` (with `className` concatenated).
* - For function fields (event handlers), mergeCellProps returns a new function that calls `base` then `extra`.
* - For plain object fields (e.g., styles), mergeCellProps shallow-merges the two objects.
*/
export default function mergeCellProps(base, extra) {
if (base == null) {
return extra;
}
if (extra == null) {
return base;
}
const result = Object.assign({}, base);
for (const key of Object.keys(extra)) {
const value = extra[key];
const type = typeof value;
if (value === null) {
// When value === null, override the original value
result[key] = null;
} else if (value === undefined) {
// When value === undefined, keep the original value
} else if (type === 'number' || type === 'string' || type === 'boolean') {
if (key === 'className') {
result[key] = cx(result[key], value);
} else {
result[key] = value;
}
} else if (type === 'function') {
const prev = result[key];
if (prev == null) {
result[key] = value;
} else {
result[key] = composeEventHandler(prev, value);
}
} else if (type === 'object') {
result[key] = Object.assign({}, result[key], value);
}
// else `type` is 'bigint' or 'symbol', `value` is an invalid cellProp, ignore it
}
return result;
}