@ozen-ui/kit
Version:
React component library
104 lines (103 loc) • 3.62 kB
JavaScript
import { __read } from "tslib";
import { useEffect, useState } from 'react';
import { useStoredValue } from '../../../../../hooks/useStoredValue';
import { useThemeVariables } from '../../../../../hooks/useThemeVariables';
import { SIDEBAR_WIDTH_BY_VARIANT } from '../../../constants';
import { useSidebarContext } from '../../../SidebarContext';
export var useSidebarCollapsibleItemAnimation = function (_a) {
var autoCenter = _a.autoCenter, ref = _a.ref, fixedRef = _a.fixedRef, isCollapsed = _a.isCollapsed;
var _b = useSidebarContext(), variant = _b.variant, size = _b.size;
var transition = useThemeVariables().transition;
var _c = __read(useState(false), 2), wasRender = _c[0], setWasRender = _c[1];
var isFirstAnimation = useStoredValue(true);
var currentWidths = SIDEBAR_WIDTH_BY_VARIANT[size];
var calculateCenter = function () {
var _a;
if (!autoCenter) {
return null;
}
var element = ref.current;
if (!element) {
return null;
}
var parent = (_a = element.parentElement) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect();
if (!parent) {
return null;
}
var fixed = fixedRef.current;
if (!fixed) {
return null;
}
var fixedRect = fixed.getBoundingClientRect();
var panelWidth = currentWidths[variant];
var targetLeftCenter = parent.left + (panelWidth - fixedRect.width) / 2;
var dx = fixedRect.left - targetLeftCenter;
return Math.abs(dx);
};
var onEnter = function () {
if (!autoCenter) {
return;
}
var parent = ref.current;
var fixed = fixedRef.current;
if (!fixed || !parent) {
return;
}
var originalTransform = fixed.style.transform;
parent.style.marginInline = '0';
fixed.style.transition = '';
fixed.style.transform = '';
var centerX = calculateCenter();
if (centerX === null) {
return;
}
fixed.style.transform = originalTransform;
fixed.getBoundingClientRect();
if (!isFirstAnimation.current) {
fixed.style.transition = "".concat(transition.default, " transform");
}
fixed.style.transform = "translateX(".concat(centerX, "px)");
isFirstAnimation.current = false;
};
var onExit = function () {
if (!autoCenter) {
return;
}
var fixed = fixedRef.current;
if (!fixed) {
return;
}
fixed.style.transition = "".concat(transition.default, " transform");
fixed.style.transform = "translate(0px)";
isFirstAnimation.current = false;
};
var onTransitionEnd = function () {
var node = ref.current;
if (!node) {
return;
}
node.style.transition = '';
node.style.transform = '';
};
var previousIsCollapsed = useStoredValue(isCollapsed);
useEffect(function () {
setWasRender(true);
}, []);
useEffect(function () {
if (!wasRender) {
return;
}
if (previousIsCollapsed.current === isCollapsed) {
onEnter();
}
previousIsCollapsed.current = isCollapsed;
}, [variant]);
var hasMarginAutoClass = isCollapsed && autoCenter && !wasRender;
return {
calculateCenter: calculateCenter,
onExit: onExit,
onEnter: onEnter,
onTransitionEnd: onTransitionEnd,
hasMarginAutoClass: hasMarginAutoClass,
};
};