Private
Public Access
1
0
Files
power-apps-codeapps-blog-part2/node_modules/@fluentui/react-nav/lib-commonjs/components/Nav/useNav.js

140 lines
5.8 KiB
JavaScript

'use client';
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "useNav_unstable", {
enumerable: true,
get: function() {
return useNav_unstable;
}
});
const _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
const _reactutilities = require("@fluentui/react-utilities");
/**
* Initial value for the uncontrolled case of the list of open indexes
*/ function initializeUncontrolledOpenCategories({ defaultOpenCategories, multiple }) {
if (defaultOpenCategories !== undefined) {
if (Array.isArray(defaultOpenCategories)) {
return multiple ? defaultOpenCategories : [
defaultOpenCategories[0]
];
}
return [
defaultOpenCategories
];
}
return undefined;
}
/**
* Updates the list of open indexes based on an index that changes
* @param value - the index that will change
* @param previousOpenItems - list of current open indexes
* @param multiple - if Nav supports open categories at the same time
*/ const updateOpenCategories = (value, previousOpenItems, multiple)=>{
if (multiple) {
if (previousOpenItems.includes(value)) {
return previousOpenItems.filter((i)=>i !== value);
} else {
return [
...previousOpenItems,
value
];
}
}
return previousOpenItems[0] === value ? [] : [
value
];
};
const useNav_unstable = (props, ref)=>{
const { onNavItemSelect, onNavCategoryItemToggle, multiple = true, density = 'medium', openCategories: controlledOpenCategoryItems, selectedCategoryValue: controlledSelectedCategoryValue, selectedValue: controlledSelectedValue, defaultOpenCategories, defaultSelectedValue, defaultSelectedCategoryValue } = props;
const innerRef = _react.useRef(null);
const [openCategories, setOpenCategories] = (0, _reactutilities.useControllableState)({
state: controlledOpenCategoryItems,
defaultState: initializeUncontrolledOpenCategories({
defaultOpenCategories,
multiple
}),
initialState: []
});
const [selectedCategoryValue, setSelectedCategoryValue] = (0, _reactutilities.useControllableState)({
state: controlledSelectedCategoryValue,
defaultState: defaultSelectedCategoryValue,
initialState: undefined
});
const [selectedValue, setSelectedValue] = (0, _reactutilities.useControllableState)({
state: controlledSelectedValue,
defaultState: defaultSelectedValue,
initialState: undefined
});
// considered usePrevious, but it is sensitive to re-renders
// this could cause the previous to move to current in the case where the navItem list re-renders.
// these refs avoid getRegisteredNavItems changing when selectedValue changes and causing
// renders for navItems that have not changed.
const currentSelectedValue = _react.useRef(undefined);
const previousSelectedValue = _react.useRef(undefined);
const currentSelectedCategoryValue = _react.useRef(undefined);
const previousSelectedCategoryValue = _react.useRef(undefined);
if (currentSelectedValue.current !== selectedValue) {
previousSelectedValue.current = currentSelectedValue.current;
currentSelectedValue.current = selectedValue;
}
if (currentSelectedCategoryValue.current !== selectedCategoryValue) {
previousSelectedCategoryValue.current = currentSelectedCategoryValue.current;
currentSelectedCategoryValue.current = selectedCategoryValue;
}
// used for NavItems and NavSubItems
const onSelect = (0, _reactutilities.useEventCallback)((event, data)=>{
setSelectedValue(data.value);
setSelectedCategoryValue(data.categoryValue ? data.categoryValue : '');
onNavItemSelect === null || onNavItemSelect === void 0 ? void 0 : onNavItemSelect(event, data);
});
// used for NavCategoryItems
const onRequestNavCategoryItemToggle = (0, _reactutilities.useEventCallback)((event, data)=>{
if (data.categoryValue !== undefined) {
const nextOpenCategories = updateOpenCategories(data.categoryValue, openCategories !== null && openCategories !== void 0 ? openCategories : [], multiple);
onNavCategoryItemToggle === null || onNavCategoryItemToggle === void 0 ? void 0 : onNavCategoryItemToggle(event, data);
setOpenCategories(nextOpenCategories);
}
});
const registeredNavItems = _react.useRef({});
const onRegister = _react.useCallback((data)=>{
registeredNavItems.current[JSON.stringify(data.value)] = data;
}, []);
const onUnregister = _react.useCallback((data)=>{
delete registeredNavItems.current[JSON.stringify(data.value)];
}, []);
const getRegisteredNavItems = _react.useCallback(()=>{
return {
selectedValue: currentSelectedValue.current,
previousSelectedValue: previousSelectedValue.current,
selectedCategoryValue: currentSelectedCategoryValue.current,
previousSelectedCategoryValue: previousSelectedCategoryValue.current,
registeredNavItems: registeredNavItems.current
};
}, []);
return {
components: {
root: 'div'
},
root: _reactutilities.slot.always((0, _reactutilities.getIntrinsicElementProps)('div', {
ref: (0, _reactutilities.useMergedRefs)(ref, innerRef),
...props
}), {
elementType: 'div'
}),
openCategories,
selectedValue,
selectedCategoryValue,
onRegister,
onUnregister,
onSelect,
getRegisteredNavItems,
onRequestNavCategoryItemToggle,
multiple,
density,
tabbable: false
};
};