@mui/internal-docs-infra
Version:
MUI Infra - internal documentation creation tools.
67 lines (65 loc) • 1.97 kB
JavaScript
'use client';
import * as React from 'react';
import { TypesDataContext } from "./TypesDataContext.mjs";
/**
* Provider that collects type data from all `useTypes()` calls within its subtree.
* This enables `useType(name)` to look up individual type data anywhere in the tree,
* and `useTypeProp(typeName, propName)` to look up individual properties.
*/
import { jsx as _jsx } from "react/jsx-runtime";
export function TypesDataProvider({
children
}) {
const [types, setTypes] = React.useState(() => new Map());
const [typeProps, setTypeProps] = React.useState(() => new Map());
const registerTypes = React.useCallback(entries => {
setTypes(prev => {
let changed = false;
for (const entry of entries) {
const existing = prev.get(entry.name);
if (existing?.meta !== entry.data.meta || existing?.href !== entry.data.href) {
changed = true;
break;
}
}
if (!changed) {
return prev;
}
const next = new Map(prev);
for (const entry of entries) {
next.set(entry.name, entry.data);
}
return next;
});
}, []);
const registerTypeProps = React.useCallback(entries => {
setTypeProps(prev => {
let changed = false;
for (const entry of entries) {
const existing = prev.get(entry.key);
if (existing?.property !== entry.data.property || existing?.href !== entry.data.href) {
changed = true;
break;
}
}
if (!changed) {
return prev;
}
const next = new Map(prev);
for (const entry of entries) {
next.set(entry.key, entry.data);
}
return next;
});
}, []);
const value = React.useMemo(() => ({
types,
registerTypes,
typeProps,
registerTypeProps
}), [types, registerTypes, typeProps, registerTypeProps]);
return /*#__PURE__*/_jsx(TypesDataContext.Provider, {
value: value,
children: children
});
}