Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 1 addition & 14 deletions packages/mui-material/src/utils/mergeSlotProps.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,7 @@
import { SlotComponentProps } from '@mui/utils/types';
import isEventHandler from '@mui/utils/isEventHandler';
import clsx from 'clsx';

// Brought from [Base UI](https://github.com/mui/base-ui/blob/master/packages/react/src/merge-props/mergeProps.ts#L119)
// Use it directly from Base UI once it's a package dependency.
function isEventHandler(key: string, value: unknown) {
// This approach is more efficient than using a regex.
const thirdCharCode = key.charCodeAt(2);
return (
key[0] === 'o' &&
key[1] === 'n' &&
thirdCharCode >= 65 /* A */ &&
thirdCharCode <= 90 /* Z */ &&
typeof value === 'function'
);
}

export default function mergeSlotProps<
T extends SlotComponentProps<React.ElementType, {}, {}>,
K = T,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,4 @@ describe('extractEventHandlers', () => {
const result = extractEventHandlers(undefined);
expect(result).to.deep.equal({});
});

it('excludes the provided handlers from the result', () => {
const input = {
onClick: () => {},
onChange: () => {},
onFocus: () => {},
};

const result = extractEventHandlers(input, ['onClick', 'onFocus']);
expect(result).to.deep.equal({ onChange: input.onChange });
});
});
Original file line number Diff line number Diff line change
@@ -1,30 +1,24 @@
import isEventHandler from '@mui/utils/isEventHandler';
import { EventHandlers } from '../types';

/**
* Extracts event handlers from a given object.
* A prop is considered an event handler if it is a function and its name starts with `on`.
*
* @param object An object to extract event handlers from.
* @param excludeKeys An array of keys to exclude from the returned object.
*/
function extractEventHandlers(
object: Record<string, any> | undefined,
excludeKeys: string[] = [],
): EventHandlers {
function extractEventHandlers(object: Record<string, any> | undefined): EventHandlers {
if (object === undefined) {
return {};
}

const result: EventHandlers = {};

Object.keys(object)
.filter(
Comment thread
ZeeshanTamboli marked this conversation as resolved.
(prop) =>
prop.match(/^on[A-Z]/) && typeof object[prop] === 'function' && !excludeKeys.includes(prop),
)
.forEach((prop) => {
for (const prop of Object.keys(object)) {
if (isEventHandler(prop, object[prop])) {
result[prop] = object[prop];
});
}
}

return result;
}
Expand Down
1 change: 1 addition & 0 deletions packages/mui-utils/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,4 +55,5 @@ export { default as unstable_resolveComponentProps } from './resolveComponentPro
export { default as unstable_extractEventHandlers } from './extractEventHandlers';
export { default as unstable_getReactNodeRef } from './getReactNodeRef';
export { default as unstable_getReactElementRef } from './getReactElementRef';
export { default as isEventHandler } from './isEventHandler';
export * from './types';
1 change: 1 addition & 0 deletions packages/mui-utils/src/isEventHandler/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default } from './isEventHandler';
13 changes: 13 additions & 0 deletions packages/mui-utils/src/isEventHandler/isEventHandler.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// Brought from [Base UI](https://github.com/mui/base-ui/blob/master/packages/react/src/merge-props/mergeProps.ts#L119)
// Use it directly from Base UI once it's a package dependency.
export default function isEventHandler(key: string, value: unknown) {
// This approach is more efficient than using a regex.
const thirdCharCode = key.charCodeAt(2);
return (
key[0] === 'o' &&
key[1] === 'n' &&
thirdCharCode >= 65 /* A */ &&
thirdCharCode <= 90 /* Z */ &&
typeof value === 'function'
);
}
Loading