64 lines
2.5 KiB
React
Raw Normal View History

2023-07-20 15:13:31 -04:00
import { useRef } from "react";
import classNames from "classnames";
import { Disclosure, Transition } from '@headlessui/react';
import { MdKeyboardArrowDown } from "react-icons/md";
2022-08-24 10:44:35 +03:00
import List from "components/services/list";
import ResolvedIcon from "components/resolvedicon";
2022-08-24 10:44:35 +03:00
2023-06-22 11:51:12 -07:00
export default function ServicesGroup({ group, services, layout, fiveColumns, disableCollapse }) {
2023-07-20 15:13:31 -04:00
const panel = useRef();
2022-08-24 10:44:35 +03:00
return (
<div
key={services.name}
className={classNames(
"services-group",
2023-04-07 22:28:19 -07:00
layout?.style === "row" ? "basis-full" : "basis-full md:basis-1/2 lg:basis-1/3 xl:basis-1/4",
2023-04-07 22:35:42 -07:00
layout?.style !== "row" && fiveColumns ? "3xl:basis-1/5" : "",
2023-08-06 04:38:37 +03:00
layout?.header === false ? "flex-1 px-1 -my-1" : "flex-1 p-1",
)}
2022-08-24 10:44:35 +03:00
>
2023-08-06 04:38:37 +03:00
<Disclosure defaultOpen>
{({ open }) => (
<>
{ layout?.header !== false &&
<Disclosure.Button disabled={disableCollapse} className="flex w-full select-none items-center group">
{layout?.icon &&
<div className="flex-shrink-0 mr-2 w-7 h-7 service-group-icon">
2023-08-06 04:38:37 +03:00
<ResolvedIcon icon={layout.icon} />
</div>
}
<h2 className="flex text-theme-800 dark:text-theme-300 text-xl font-medium service-group-name">{services.name}</h2>
2023-08-06 04:38:37 +03:00
<MdKeyboardArrowDown className={classNames(
disableCollapse ? 'hidden' : '',
'transition-all opacity-0 group-hover:opacity-100 ml-auto text-theme-800 dark:text-theme-300 text-xl',
2023-08-26 00:25:24 -07:00
open ? '' : 'rotate-180'
2023-08-06 04:38:37 +03:00
)} />
</Disclosure.Button>
}
2023-08-06 04:38:37 +03:00
<Transition
// 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);
}}
>
<Disclosure.Panel className="transition-all overflow-hidden duration-300 ease-out" ref={panel} static>
<List group={group} services={services.services} layout={layout} />
</Disclosure.Panel>
</Transition>
</>
)}
</Disclosure>
2022-08-24 10:44:35 +03:00
</div>
);
}