import React, { ComponentPropsWithRef, useCallback, useEffect, useState } from 'react' import { EmblaCarouselType } from 'embla-carousel' type UsePrevNextButtonsType = { prevBtnDisabled: boolean nextBtnDisabled: boolean onPrevButtonClick: () => void onNextButtonClick: () => void } export const usePrevNextButtons = ( emblaApi: EmblaCarouselType | undefined ): UsePrevNextButtonsType => { const [prevBtnDisabled, setPrevBtnDisabled] = useState(true) const [nextBtnDisabled, setNextBtnDisabled] = useState(true) const onPrevButtonClick = useCallback(() => { if (!emblaApi) return emblaApi.goToPrev() }, [emblaApi]) const onNextButtonClick = useCallback(() => { if (!emblaApi) return emblaApi.goToNext() }, [emblaApi]) const onSelect = useCallback((emblaApi: EmblaCarouselType) => { setPrevBtnDisabled(!emblaApi.canGoToPrev()) setNextBtnDisabled(!emblaApi.canGoToNext()) }, []) useEffect(() => { if (!emblaApi) return onSelect(emblaApi) emblaApi.on('reinit', onSelect).on('select', onSelect) }, [emblaApi, onSelect]) return { prevBtnDisabled, nextBtnDisabled, onPrevButtonClick, onNextButtonClick } } type PropType = ComponentPropsWithRef<'button'> export const PrevButton = (props: PropType) => { const { children, disabled, ...restProps } = props return ( ) } export const NextButton = (props: PropType) => { const { children, disabled, ...restProps } = props return ( ) }