-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathCarouselContextProvider.tsx
More file actions
81 lines (74 loc) · 2.43 KB
/
Copy pathCarouselContextProvider.tsx
File metadata and controls
81 lines (74 loc) · 2.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import React from 'react';
import { CarouselContext } from './CarouselContext';
import type {
CarouselContextComponentPropsType,
CarouselContextStateType,
} from '../types';
import { initialCarouselContextStateValues } from '../constants';
export type CarouselContextProviderProps = {
children: React.ReactNode;
numberOfItems: number;
} & CarouselContextComponentPropsType;
function useCarouselContextState(): Omit<
CarouselContextStateType,
'numberOfItems'
> {
const [isReady] = React.useState<CarouselContextStateType['isReady']>(
initialCarouselContextStateValues.isReady,
);
const [transformValue, setTransformValue] = React.useState<
CarouselContextStateType['transformValue']
>(initialCarouselContextStateValues.transformValue);
const [numberOfSlides, setNumberOfSlides] = React.useState<
CarouselContextStateType['numberOfSlides']
>(initialCarouselContextStateValues.numberOfSlides);
const [itemsPerSlide, setItemsPerSlide] = React.useState<
CarouselContextStateType['itemsPerSlide']
>(initialCarouselContextStateValues.itemsPerSlide);
const [currentSlide, setCurrentSlide] = React.useState<
CarouselContextStateType['currentSlide']
>(initialCarouselContextStateValues.currentSlide);
const [width, setWidth] = React.useState<CarouselContextStateType['width']>(
initialCarouselContextStateValues.width,
);
const handleUpdateSlideProps: CarouselContextStateType['handleUpdateSlideProps'] =
(targetSlide: number): void => {
if (targetSlide === 0) {
setTransformValue('0px');
} else {
// The transform is ALWAYS negative, based purely on the target index.
setTransformValue(`-${targetSlide}00%`);
}
setCurrentSlide(targetSlide);
};
return {
isReady,
transformValue,
setTransformValue,
numberOfSlides,
setNumberOfSlides,
itemsPerSlide,
setItemsPerSlide,
currentSlide,
setCurrentSlide,
width,
setWidth,
handleUpdateSlideProps,
};
}
export function CarouselContextProvider({
children,
numberOfItems,
...backwardCompatibleProps
}: CarouselContextProviderProps): React.ReactElement {
const carouselContext = useCarouselContextState();
const value = React.useMemo(
() => ({
numberOfItems,
...carouselContext,
...backwardCompatibleProps,
}),
[numberOfItems, carouselContext, backwardCompatibleProps],
);
return <CarouselContext value={value}>{children}</CarouselContext>;
}