@awsui/components-react
Version:
On July 19th, 2022, we launched [Cloudscape Design System](https://cloudscape.design). Cloudscape is an evolution of AWS-UI. It consists of user interface guidelines, front-end components, design resources, and development tools for building intuitive, en
34 lines • 1.69 kB
JavaScript
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import { useCallback, useEffect, useRef, useState } from 'react';
import { useResizeObserver } from '@awsui/component-toolkit/internal';
import { getLogicalBoundingClientRect } from '@awsui/component-toolkit/internal';
import { useObservedElement } from './use-observed-element';
export function useAppLayoutPlacement(headerSelector, footerSelector) {
const mainElementRef = useRef(null);
const headerHeight = useObservedElement(mainElementRef, headerSelector);
const footerHeight = useObservedElement(mainElementRef, footerSelector);
const [offsets, setOffsets] = useState({
insetInlineStart: 0,
insetInlineEnd: 0,
inlineSize: Number.POSITIVE_INFINITY,
});
const updatePosition = useCallback(() => {
if (!mainElementRef.current) {
return;
}
const { insetInlineStart, insetInlineEnd, inlineSize } = getLogicalBoundingClientRect(mainElementRef.current);
// skip reading sizes in JSDOM
if (inlineSize === 0) {
return;
}
setOffsets({ insetInlineStart, insetInlineEnd: inlineSize - insetInlineEnd, inlineSize });
}, []);
useEffect(() => {
window.addEventListener('resize', updatePosition);
return () => window.removeEventListener('resize', updatePosition);
}, [updatePosition]);
useResizeObserver(mainElementRef, updatePosition);
return [mainElementRef, Object.assign(Object.assign({}, offsets), { insetBlockStart: headerHeight, insetBlockEnd: footerHeight })];
}
//# sourceMappingURL=use-app-layout-placement.js.map