From ca383f01764be942eb4b89188bb678df88ef3575 Mon Sep 17 00:00:00 2001 From: Marius J Date: Fri, 26 Jan 2024 15:41:54 +0100 Subject: [PATCH] fix: carousel should stop immediately after interval is set to false Fix #2779 --- src/Carousel.js | 3 ++ src/__tests__/Carousel.spec.js | 59 ++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/src/Carousel.js b/src/Carousel.js index 29a6c0bdf..2dcd10247 100644 --- a/src/Carousel.js +++ b/src/Carousel.js @@ -112,6 +112,9 @@ class Carousel extends React.Component { } componentDidUpdate(prevProps, prevState) { + if (prevProps.interval !== this.props.interval && (prevProps.interval === false || this.props.interval === false)) { + this.setInterval(); + } if (prevState.activeIndex === this.state.activeIndex) return; this.setInterval(); } diff --git a/src/__tests__/Carousel.spec.js b/src/__tests__/Carousel.spec.js index 20ddcfe8a..614b5d4f2 100644 --- a/src/__tests__/Carousel.spec.js +++ b/src/__tests__/Carousel.spec.js @@ -2,6 +2,7 @@ import React from 'react'; import { render, screen } from '@testing-library/react'; import '@testing-library/jest-dom'; import user from '@testing-library/user-event'; +import { shallow } from 'enzyme'; import { Carousel } from '..'; import CarouselItem from '../CarouselItem'; import CarouselIndicators from '../CarouselIndicators'; @@ -765,5 +766,63 @@ describe('Carousel', () => { jest.advanceTimersByTime(1000); expect(next).toHaveBeenCalled(); }); + + it('it should stop immediately when interval is set to false', () => { + const next = jest.fn(); + const { rerender } = render( + {}} + interval="1000" + activeIndex={0} + ride="carousel" + > + {slides} + , + ); + + rerender( + {}} + interval={false} + activeIndex={0} + ride="carousel" + > + {slides} + , + ); + jest.advanceTimersByTime(1000); + expect(next).not.toHaveBeenCalled(); + }); + + it('it should restart when interval is set again', () => { + const next = jest.fn(); + const { rerender } = render( + {}} + interval={false} + activeIndex={0} + ride="carousel" + > + {slides} + , + ); + + rerender( + {}} + interval="1000" + activeIndex={0} + ride="carousel" + > + {slides} + , + ); + jest.advanceTimersByTime(1000); + expect(next).toHaveBeenCalled(); + }); }); });