@itgold/grandbazar-ui-kit
Version:
Grandbazar.io UI component library: React, Typescript, Tailwind, Rollup, Storybook, Jest.
47 lines (35 loc) • 1.11 kB
text/typescript
import { MutableRefObject, useEffect, useState } from 'react';
export type TUseAccordionProps = {
accordionContentRef: MutableRefObject<HTMLDivElement | null>;
opened: boolean;
};
export function useAccordion({ accordionContentRef, opened }: TUseAccordionProps) {
const [contentHeight, setContentHeight] = useState(0);
const [isOpened, setIsOpened] = useState(false);
useEffect(() => {
setIsOpened(opened);
}, [opened]);
const contentHeightHandler = () => {
if (!accordionContentRef.current || !accordionContentRef) {
return;
}
setContentHeight(accordionContentRef.current?.scrollHeight ?? 0);
};
useEffect(() => {
if (!accordionContentRef.current) {
return;
}
const resizeObserver = new ResizeObserver(() => {
contentHeightHandler();
});
resizeObserver.observe(accordionContentRef.current as Element);
return () => {
resizeObserver.disconnect();
};
}, []);
const toggleAccordion = () => {
contentHeightHandler();
setIsOpened(!isOpened);
};
return { contentHeight, isOpened, toggleAccordion };
}