Private
Public Access
1
0
Files
power-apps-codeapps-blog-part2/node_modules/@fluentui/react-carousel/lib/components/CarouselNav/useCarouselNav.js

56 lines
1.9 KiB
JavaScript

'use client';
import { useArrowNavigationGroup } from '@fluentui/react-tabster';
import { getIntrinsicElementProps, slot, useIsomorphicLayoutEffect } from '@fluentui/react-utilities';
import * as React from 'react';
import { useCarouselContext_unstable as useCarouselContext } from '../CarouselContext';
import { useControllableState } from '@fluentui/react-utilities';
/**
* Create the state required to render CarouselNav.
*
* The returned state can be modified with hooks such as useCarouselNavStyles_unstable,
* before being passed to renderCarouselNav_unstable.
*
* @param props - props from this instance of CarouselNav
* @param ref - reference to root HTMLDivElement of CarouselNav
*/ export const useCarouselNav_unstable = (props, ref)=>{
const { appearance } = props;
const focusableGroupAttr = useArrowNavigationGroup({
circular: false,
axis: 'horizontal',
memorizeCurrent: false,
// eslint-disable-next-line @typescript-eslint/naming-convention
unstable_hasDefault: true
});
// Users can choose controlled or uncontrolled, if uncontrolled, the default is initialized by carousel context
const [totalSlides, setTotalSlides] = useControllableState({
state: props.totalSlides,
initialState: 0
});
const subscribeForValues = useCarouselContext((ctx)=>ctx.subscribeForValues);
useIsomorphicLayoutEffect(()=>{
return subscribeForValues((data)=>{
setTotalSlides(data.navItemsCount);
});
}, [
subscribeForValues,
setTotalSlides
]);
return {
totalSlides,
appearance,
renderNavButton: props.children,
components: {
root: 'div'
},
root: slot.always(getIntrinsicElementProps('div', {
ref,
role: 'tablist',
...props,
...focusableGroupAttr,
children: null
}), {
elementType: 'div'
})
};
};