mirror of
https://github.com/MetaFam/TheGame.git
synced 2026-01-14 17:08:00 -05:00
65 lines
1.6 KiB
TypeScript
65 lines
1.6 KiB
TypeScript
import { Flex } from '@metafam/ds';
|
|
import type { PropsWithChildren } from 'react';
|
|
import React, { KeyboardEventHandler, useState } from 'react';
|
|
|
|
import { useCarouselContext } from './CarouselContext';
|
|
|
|
type ItemProps = PropsWithChildren<{ index: number }>;
|
|
|
|
export const Item: React.FC<ItemProps> = ({ children, index }) => {
|
|
const {
|
|
setTrackIsActive,
|
|
setActiveItem,
|
|
activeItem,
|
|
constraint,
|
|
itemWidth,
|
|
positions,
|
|
gap,
|
|
defaultCarousel,
|
|
} = useCarouselContext();
|
|
const [userDidTab, setUserDidTab] = useState(false);
|
|
|
|
const handleFocus = () => setTrackIsActive(true);
|
|
|
|
const handleBlur = () => {
|
|
if (userDidTab && index + 1 === positions.length) {
|
|
setTrackIsActive(false);
|
|
}
|
|
setUserDidTab(false);
|
|
};
|
|
|
|
const handleKeyUp: KeyboardEventHandler<HTMLDivElement> = (event) =>
|
|
event.key === 'Tab' &&
|
|
!(activeItem === positions.length - constraint) &&
|
|
setActiveItem(index);
|
|
|
|
const handleKeyDown: KeyboardEventHandler<HTMLDivElement> = (event) =>
|
|
event.key === 'Tab' && setUserDidTab(true);
|
|
|
|
return (
|
|
<Flex
|
|
onFocus={handleFocus}
|
|
onBlur={handleBlur}
|
|
onKeyUp={handleKeyUp}
|
|
onKeyDown={handleKeyDown}
|
|
w={!defaultCarousel ? '100%' : `${itemWidth}px`}
|
|
flex={
|
|
!defaultCarousel
|
|
? {
|
|
base: `0 0 ${itemWidth}px`,
|
|
xl: `0 0 ${itemWidth}px`,
|
|
'2xl': `0 0 ${itemWidth}px`,
|
|
}
|
|
: 'inherit'
|
|
}
|
|
maxW={!defaultCarousel ? `${itemWidth}px` : 'inherit'}
|
|
_notLast={{
|
|
mr: `${gap}px`,
|
|
}}
|
|
py="4px"
|
|
>
|
|
{children}
|
|
</Flex>
|
|
);
|
|
};
|