UNPKG

@base-ui-components/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.

48 lines (47 loc) 1.38 kB
'use client'; import * as React from 'react'; import { mergeReactProps } from '../utils/mergeReactProps.js'; import { useControlled } from '../utils/useControlled.js'; import { useEventCallback } from '../utils/useEventCallback.js'; export function useToggleGroup(parameters) { const { value, defaultValue, disabled, onValueChange, toggleMultiple } = parameters; const [groupValue, setValueState] = useControlled({ controlled: value, default: defaultValue, name: 'ToggleGroup', state: 'value' }); const setGroupValue = useEventCallback((newValue, nextPressed, event) => { let newGroupValue; if (toggleMultiple) { newGroupValue = groupValue.slice(); if (nextPressed) { newGroupValue.push(newValue); } else { newGroupValue.splice(groupValue.indexOf(newValue), 1); } } else { newGroupValue = nextPressed ? [newValue] : []; } if (Array.isArray(newGroupValue)) { setValueState(newGroupValue); onValueChange?.(newGroupValue, event); } }); const getRootProps = React.useCallback((externalProps = {}) => mergeReactProps(externalProps, { role: 'group' }), []); return React.useMemo(() => ({ getRootProps, disabled, setGroupValue, value: groupValue }), [getRootProps, disabled, groupValue, setGroupValue]); } export let UseToggleGroup;