49 lines
1.8 KiB
React
Raw Normal View History

2023-07-20 15:13:31 -04:00
import { useRef } from "react";
2023-06-22 11:51:38 -07:00
import classNames from "classnames";
import { Disclosure, Transition } from '@headlessui/react';
import { MdKeyboardArrowDown } from "react-icons/md";
import ErrorBoundary from "components/errorboundry";
2022-08-24 10:44:35 +03:00
import List from "components/bookmarks/list";
2023-06-22 11:51:38 -07:00
export default function BookmarksGroup({ group, disableCollapse }) {
2023-07-20 15:13:31 -04:00
const panel = useRef();
2022-08-24 10:44:35 +03:00
return (
<div key={group.name} className="flex-1">
2023-06-22 11:51:38 -07:00
<Disclosure defaultOpen>
{({ open }) => (
<>
<Disclosure.Button disabled={disableCollapse} className="flex w-full select-none items-center group">
<h2 className="text-theme-800 dark:text-theme-300 text-xl font-medium">{group.name}</h2>
<MdKeyboardArrowDown className={classNames(
disableCollapse ? 'hidden' : '',
2023-07-20 15:13:31 -04:00
'transition-all opacity-0 group-hover:opacity-100 ml-auto text-theme-800 dark:text-theme-300 text-xl',
open ? '' : 'rotate-90'
2023-06-22 11:51:38 -07:00
)} />
</Disclosure.Button>
<Transition
2023-07-20 15:13:31 -04:00
// Otherwise the transition group does display: none and cancels animation
className="!block"
unmount={false}
beforeLeave={() => {
panel.current.style.height = `${panel.current.scrollHeight}px`;
setTimeout(() => {panel.current.style.height = `0`}, 1);
}}
beforeEnter={() => {
panel.current.style.height = `0px`;
setTimeout(() => {panel.current.style.height = `${panel.current.scrollHeight}px`}, 1);
}}
2023-06-22 11:51:38 -07:00
>
2023-07-20 15:13:31 -04:00
<Disclosure.Panel className="transition-all overflow-hidden duration-300 ease-out" ref={panel} static>
2023-06-22 11:51:38 -07:00
<ErrorBoundary>
<List bookmarks={group.bookmarks} />
</ErrorBoundary>
</Disclosure.Panel>
</Transition>
</>
)}
</Disclosure>
2022-08-24 10:44:35 +03:00
</div>
);
}