react-aria
Version:
Spectrum UI components in React
78 lines (74 loc) • 3.56 kB
JavaScript
import {useMemo as $fyoYl$useMemo, cloneElement as $fyoYl$cloneElement} from "react";
/*
* Copyright 2024 Adobe. All rights reserved.
* This file is licensed to you under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. You may obtain a copy
* of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
* OF ANY KIND, either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
function $91ad91478b215293$export$727c8fc270210f13(props) {
let { children: children, items: items, idScope: idScope, addIdAndValue: addIdAndValue, dependencies: dependencies = [] } = props;
// In development, invalidate when the children function updates (e.g. HMR).
let childrenString = (0, $fyoYl$useMemo)(()=>process.env.NODE_ENV !== 'production' && typeof children === 'function' ? children.toString() : undefined, [
children
]);
// Invalidate the cache whenever dependencies change.
// eslint-disable-next-line react-hooks/exhaustive-deps
let cache = (0, $fyoYl$useMemo)(()=>new WeakMap(), [
...dependencies,
childrenString
]);
return (0, $fyoYl$useMemo)(()=>{
if (items && typeof children === 'function') {
let res = [];
for (let item of items){
let cacheKey = $91ad91478b215293$var$isWeakKey(item) ? item : null;
let rendered = cacheKey ? cache.get(cacheKey) : null;
if (!rendered) {
rendered = children(item);
var _rendered_props_id, _ref;
// @ts-ignore
let id = (_ref = (_rendered_props_id = rendered.props.id) !== null && _rendered_props_id !== void 0 ? _rendered_props_id : item === null || item === void 0 ? void 0 : item.key) !== null && _ref !== void 0 ? _ref : item === null || item === void 0 ? void 0 : item.id;
if (idScope != null && rendered.props.id == null && id != null) id = idScope + ':' + id;
// If no id is inferred from data, use the index as the React key.
// An id will be generated by the collection document.
let key = id !== null && id !== void 0 ? id : res.length;
// Note: only works if wrapped Item passes through id...
rendered = (0, $fyoYl$cloneElement)(rendered, addIdAndValue ? {
key: key,
id: id,
value: item
} : {
key: key
});
if (cacheKey) cache.set(cacheKey, rendered);
}
res.push(rendered);
}
return res;
} else if (typeof children !== 'function') return children;
}, [
children,
items,
cache,
idScope,
addIdAndValue
]);
}
function $91ad91478b215293$var$isWeakKey(value) {
switch(typeof value){
case 'object':
return value != null;
case 'function':
case 'symbol':
return true;
default:
return false;
}
}
export {$91ad91478b215293$export$727c8fc270210f13 as useCachedChildren};
//# sourceMappingURL=useCachedChildren.js.map