-
-
Notifications
You must be signed in to change notification settings - Fork 32.5k
/
Copy pathDefaultPropsProvider.tsx
61 lines (52 loc) · 2.09 KB
/
DefaultPropsProvider.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
'use client';
import * as React from 'react';
import PropTypes from 'prop-types';
import resolveProps from '@mui/utils/resolveProps';
const PropsContext = React.createContext<Record<string, any> | undefined>(undefined);
function DefaultPropsProvider({
value,
children,
}: React.PropsWithChildren<{ value: Record<string, any> | undefined }>) {
return <PropsContext.Provider value={value}>{children}</PropsContext.Provider>;
}
DefaultPropsProvider.propTypes /* remove-proptypes */ = {
// ┌────────────────────────────── Warning ──────────────────────────────┐
// │ These PropTypes are generated from the TypeScript type definitions. │
// │ To update them, edit the TypeScript types and run `pnpm proptypes`. │
// └─────────────────────────────────────────────────────────────────────┘
/**
* @ignore
*/
children: PropTypes.node,
/**
* @ignore
*/
value: PropTypes.object,
} as any;
function getThemeProps<
Theme extends {
components?: Record<string, { defaultProps?: any; styleOverrides?: any; variants?: any }>;
},
Props,
Name extends string,
>(params: { props: Props; name: Name; theme?: Theme }): Props {
const { theme, name, props } = params;
if (!theme || !theme.components || !theme.components[name]) {
return props;
}
const config = theme.components[name];
if (config.defaultProps) {
// compatible with v5 signature
return resolveProps(config.defaultProps, props);
}
if (!config.styleOverrides && !config.variants) {
// v6 signature, no property 'defaultProps'
return resolveProps(config as any, props);
}
return props;
}
export function useDefaultProps<Props>({ props, name }: { props: Props; name: string }) {
const ctx = React.useContext(PropsContext);
return getThemeProps({ props, name, theme: { components: ctx } });
}
export default DefaultPropsProvider;