import { useDimensions } from "@react-native-community/hooks"; import React, { useCallback, useRef, useState } from "react"; import { Animated, ScrollView } from "react-native"; import { Button, Dot } from "../../components"; import { slides } from "../../data"; import { Box } from "../../utils"; import { Slider, SliderImage, SliderText, SliderTitle } from "./Slider"; import { SubSlider, SubSliderItem } from "./SubSlider"; type OnboardingProps = { onDone: () => void; }; const Onboarding = React.memo(({ onDone }: OnboardingProps) => { const { width } = useDimensions().window; const [completed, setCompleted] = useState(false); const scroll = useRef(null); const x = React.useRef(new Animated.Value(0)).current; const onPress = useCallback((index: number) => { scroll.current.scrollTo({ x: width * (index + 1), animated: true }); }, []); React.useEffect(() => { x.addListener(({ value }) => { if (Math.ceil(value / width) === slides.length - 1) { setCompleted(true); } else { setCompleted(false); } }); return () => x.removeAllListeners(); }, []); return ( {renderScroll(scroll, width, x)} {renderSubSlider(x, width, completed, onDone, onPress)} ); }); export default Onboarding; const renderScroll = ( scroll: React.MutableRefObject, width: number, x: Animated.Value ) => { return ( {slides.map((data, index) => { const opacity = x.interpolate({ inputRange: [ (index - 0.5) * width, index * width, (index + 0.5) * width, ], outputRange: [0.5, 1, 0.5], }); return ( {data.label} {data.description} ); })} ); }; const renderSubSlider = ( x: Animated.Value, width: number, completed: boolean, onDone: () => void, onPress: (index: number) => void ) => { return ( {slides.map((_, index) => { return ( ); })} ); };