wix-style-react
Version:
wix-style-react
157 lines (151 loc) • 5.24 kB
JavaScript
;
exports.__esModule = true;
exports.assignRef = assignRef;
exports.callAll = void 0;
exports.getAutoHeightDuration = getAutoHeightDuration;
exports.getElementHeight = getElementHeight;
exports.mergeRefs = mergeRefs;
exports.noop = void 0;
exports.useControlledState = useControlledState;
exports.useEffectAfterMount = useEffectAfterMount;
exports.useUniqueId = useUniqueId;
var _react = require("react");
// eslint-disable-next-line @typescript-eslint/no-empty-function
var noop = () => {};
exports.noop = noop;
function getElementHeight(el) {
if (!(el != null && el.current)) {
return 'auto';
}
return el.current.scrollHeight;
}
// Helper function for render props. Sets a function to be called, plus any additional functions passed in
var callAll = exports.callAll = function callAll() {
for (var _len = arguments.length, fns = new Array(_len), _key = 0; _key < _len; _key++) {
fns[_key] = arguments[_key];
}
return function () {
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
return fns.forEach(fn => fn && fn(...args));
};
};
// https://github.com/mui-org/material-ui/blob/da362266f7c137bf671d7e8c44c84ad5cfc0e9e2/packages/material-ui/src/styles/transitions.js#L89-L98
function getAutoHeightDuration(height) {
if (!height || typeof height === 'string') {
return 0;
}
var constant = height / 36;
// https://www.wolframalpha.com/input/?i=(4+%2B+15+*+(x+%2F+36+)+**+0.25+%2B+(x+%2F+36)+%2F+5)+*+10
return Math.round((4 + 15 * constant ** 0.25 + constant / 5) * 10);
}
function assignRef(ref, value) {
if (ref == null) {
return;
}
if (typeof ref === 'function') {
ref(value);
} else {
try {
ref.current = value;
} catch (error) {
throw new Error("Cannot assign value \"".concat(value, "\" to ref \"").concat(ref, "\""));
}
}
}
/**
* Passes or assigns a value to multiple refs (typically a DOM node). Useful for
* dealing with components that need an explicit ref for DOM calculations but
* also forwards refs assigned by an app.
*
* @param refs Refs to fork
*/
function mergeRefs() {
for (var _len3 = arguments.length, refs = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
refs[_key3] = arguments[_key3];
}
if (refs.every(ref => ref == null)) {
return null;
}
return node => {
refs.forEach(ref => {
assignRef(ref, node);
});
};
}
function useControlledState(isExpanded, defaultExpanded) {
var [stateExpanded, setStateExpanded] = (0, _react.useState)(defaultExpanded || false);
var initiallyControlled = (0, _react.useRef)(isExpanded != null);
var expanded = initiallyControlled.current ? !!isExpanded : stateExpanded;
var setExpanded = (0, _react.useCallback)(n => {
if (!initiallyControlled.current) {
setStateExpanded(n);
}
}, []);
return [expanded, setExpanded];
}
function useEffectAfterMount(cb, dependencies) {
var justMounted = (0, _react.useRef)(true);
var unmounted = (0, _react.useRef)(false);
(0, _react.useEffect)(() => {
return () => {
unmounted.current = true;
};
}, []);
(0, _react.useEffect)(() => {
if (!justMounted.current && !unmounted.current) {
return cb();
}
justMounted.current = false;
// eslint-disable-next-line react-hooks/exhaustive-deps
}, dependencies);
}
/**
* Taken from Reach
* https://github.com/reach/reach-ui/blob/d2b88c50caf52f473a7d20a4493e39e3c5e95b7b/packages/auto-id
*
* Autogenerate IDs to facilitate WAI-ARIA and server rendering.
*
* Note: The returned ID will initially be `null` and will update after a
* component mounts. Users may need to supply their own ID if they need
* consistent values for SSR.
*
* @see Docs https://reach.tech/auto-id
*/
var useIsomorphicLayoutEffect = typeof window !== 'undefined' ? _react.useLayoutEffect : _react.useEffect;
var serverHandoffComplete = false;
var globalId = 0;
var genId = () => ++globalId;
function useUniqueId(idFromProps) {
/*
* If this instance isn't part of the initial render, we don't have to do the
* double render/patch-up dance. We can just generate the ID and return it.
*/
var initialId = idFromProps || (serverHandoffComplete ? genId() : null);
var [id, setId] = (0, _react.useState)(initialId);
useIsomorphicLayoutEffect(() => {
if (id === null) {
/*
* Patch the ID after render. We do this in `useLayoutEffect` to avoid any
* rendering flicker, though it'll make the first render slower (unlikely
* to matter, but you're welcome to measure your app and let us know if
* it's a problem).
*/
setId(genId());
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
(0, _react.useEffect)(() => {
if (serverHandoffComplete === false) {
/*
* Flag all future uses of `useId` to skip the update dance. This is in
* `useEffect` because it goes after `useLayoutEffect`, ensuring we don't
* accidentally bail out of the patch-up dance prematurely.
*/
serverHandoffComplete = true;
}
}, []);
return id != null ? String(id) : undefined;
}
//# sourceMappingURL=utils.js.map