You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
3.3 KiB
JavaScript
93 lines
3.3 KiB
JavaScript
'use client';
|
|
|
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
import * as React from 'react';
|
|
import { unstable_useId as useId, unstable_useForkRef as useForkRef } from '@mui/utils';
|
|
import { useTabsContext } from '../Tabs';
|
|
import { extractEventHandlers } from '../utils/extractEventHandlers';
|
|
import { useCompoundItem } from '../useCompound';
|
|
import { useListItem } from '../useList';
|
|
import { useButton } from '../useButton';
|
|
import { combineHooksSlotProps } from '../utils/combineHooksSlotProps';
|
|
function tabValueGenerator(otherTabValues) {
|
|
return otherTabValues.size;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* Demos:
|
|
*
|
|
* - [Tabs](https://mui.com/base-ui/react-tabs/#hooks)
|
|
*
|
|
* API:
|
|
*
|
|
* - [useTab API](https://mui.com/base-ui/react-tabs/hooks-api/#use-tab)
|
|
*/
|
|
function useTab(parameters) {
|
|
var valueParam = parameters.value,
|
|
externalRef = parameters.rootRef,
|
|
_parameters$disabled = parameters.disabled,
|
|
disabled = _parameters$disabled === void 0 ? false : _parameters$disabled,
|
|
idParam = parameters.id;
|
|
var tabRef = React.useRef(null);
|
|
var id = useId(idParam);
|
|
var _useTabsContext = useTabsContext(),
|
|
selectedValue = _useTabsContext.value,
|
|
selectionFollowsFocus = _useTabsContext.selectionFollowsFocus,
|
|
getTabPanelId = _useTabsContext.getTabPanelId;
|
|
var tabMetadata = React.useMemo(function () {
|
|
return {
|
|
disabled: disabled,
|
|
ref: tabRef,
|
|
id: id
|
|
};
|
|
}, [disabled, tabRef, id]);
|
|
var _useCompoundItem = useCompoundItem(valueParam != null ? valueParam : tabValueGenerator, tabMetadata),
|
|
value = _useCompoundItem.id,
|
|
index = _useCompoundItem.index,
|
|
totalTabsCount = _useCompoundItem.totalItemCount;
|
|
var _useListItem = useListItem({
|
|
item: value
|
|
}),
|
|
getTabProps = _useListItem.getRootProps,
|
|
highlighted = _useListItem.highlighted,
|
|
selected = _useListItem.selected;
|
|
var _useButton = useButton({
|
|
disabled: disabled,
|
|
focusableWhenDisabled: !selectionFollowsFocus,
|
|
type: 'button'
|
|
}),
|
|
getButtonProps = _useButton.getRootProps,
|
|
buttonRefHandler = _useButton.rootRef,
|
|
active = _useButton.active,
|
|
focusVisible = _useButton.focusVisible,
|
|
setFocusVisible = _useButton.setFocusVisible;
|
|
var handleRef = useForkRef(tabRef, externalRef, buttonRefHandler);
|
|
var tabPanelId = value !== undefined ? getTabPanelId(value) : undefined;
|
|
var getRootProps = function getRootProps() {
|
|
var externalProps = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
var externalEventHandlers = extractEventHandlers(externalProps);
|
|
var getCombinedRootProps = combineHooksSlotProps(getTabProps, getButtonProps);
|
|
return _extends({}, externalProps, getCombinedRootProps(externalEventHandlers), {
|
|
role: 'tab',
|
|
'aria-controls': tabPanelId,
|
|
'aria-selected': selected,
|
|
id: id,
|
|
ref: handleRef
|
|
});
|
|
};
|
|
return {
|
|
getRootProps: getRootProps,
|
|
active: active,
|
|
focusVisible: focusVisible,
|
|
highlighted: highlighted,
|
|
index: index,
|
|
rootRef: handleRef,
|
|
// the `selected` state isn't set on the server (it relies on effects to be calculated),
|
|
// so we fall back to checking the `value` prop with the selectedValue from the TabsContext
|
|
selected: selected || value === selectedValue,
|
|
setFocusVisible: setFocusVisible,
|
|
totalTabsCount: totalTabsCount
|
|
};
|
|
}
|
|
export { useTab }; |