@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
JavaScript
'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;