UNPKG

@base-ui/react

Version:

Base UI is a library of headless ('unstyled') React components and low-level hooks. You gain complete control over your app's CSS and accessibility features.

51 lines (50 loc) 1.59 kB
'use client'; import * as React from 'react'; import { useControlled } from '@base-ui/utils/useControlled'; import { useStableCallback } from '@base-ui/utils/useStableCallback'; import { useBaseUiId } from "../../internals/useBaseUiId.js"; import { createChangeEventDetails } from "../../internals/createBaseUIEventDetails.js"; import { REASONS } from "../../internals/reasons.js"; import { useTransitionStatus } from "../../internals/useTransitionStatus.js"; export function useCollapsibleRoot(parameters) { const { open: openParam, defaultOpen, onOpenChange, disabled } = parameters; const [open, setOpen] = useControlled({ controlled: openParam, default: defaultOpen, name: 'Collapsible', state: 'open' }); const { mounted, setMounted, transitionStatus } = useTransitionStatus(open, true, true); const defaultPanelId = useBaseUiId(); const [panelIdState, setPanelIdState] = React.useState(); const panelId = panelIdState ?? defaultPanelId; const handleTrigger = useStableCallback(event => { const nextOpen = !open; const eventDetails = createChangeEventDetails(REASONS.triggerPress, event.nativeEvent); onOpenChange(nextOpen, eventDetails); if (eventDetails.isCanceled) { return; } setOpen(nextOpen); }); return React.useMemo(() => ({ disabled, handleTrigger, mounted, open, panelId, setMounted, setOpen, setPanelIdState, transitionStatus }), [disabled, handleTrigger, mounted, open, panelId, setMounted, setOpen, setPanelIdState, transitionStatus]); }