Анимация бесконечного slider next js, как работать с классами в массиве объектов?

Изучаю Next.JS, занялся анимацией, есть пару вопросов, которые не могу решить.

Задача: сделать бесконечный не интерактивный слайдер иконок криптовалюты.

Бесконечность и анимацию прокрутки мне вроде бы удалось реализовать, но я думаю можно лучше (застрял на добавлении класса первому элементу).

Первый элемент должен быть выделен более ярким бекграундом и величиной иконки. Он также должен анимировано скинуть класс main и уйти за предел видимости пользователя, а второй элемент должен встать анимировано на его место и получить класс main.

Бесконечная прокрутка работает, а вот как реализовать добавление классов в pages я нигде не найду.

Так же есть вопрос по key — сыпет в консоль предупреждение, что кей не уникален в самом последнем return. Во-первых, я не пойму зачем там key, во-вторых, я не пойму, как это пофиксить.

Код:

import { StyledCardList, StyledSecondaryCard } from './styled'
import React from "react";
import { useState, useEffect } from "react";
import cardDetails from "./swiperconfig"

const TRANSITION_DURATION = 1500;

export const Carousel = () => {
    const [pages, setPages] = useState([])
    const [offset, setOffset] = useState(0)
    const [transitionDuration, setTransitionDuration] = useState(TRANSITION_DURATION)

    const handleTransitionEnd = () => {
        setOffset(0);
        setTransitionDuration(0);
        console.log(offset)
    }

    useEffect(() => {
        if (transitionDuration === 0) {
            setTimeout(() => {
                setTransitionDuration(TRANSITION_DURATION)
            }, TRANSITION_DURATION)
        }
    }, [transitionDuration])

    useEffect(() => {
        setTimeout(() => {
            setOffset((currentOffset) => {
                const newOffset = currentOffset - 30;
                console.log(pages);
                pages[1] = () => {
                    return(
                        <StyledSecondaryCard key={cardDetails.id} className="card">
                        <img key={cardDetails.id} className="image" src={cardDetails.imgUrl} alt={cardDetails.alt} />
                        </StyledSecondaryCard>
                    )
                }

                return (newOffset);
            })
        }, 5000)

        pages.push(pages[0]);
        pages.shift(pages[0]);

        if (offset != 0){
            setTimeout(() => {
                setTransitionDuration(0)
                setOffset(0)
            }, 15000)
        }
    })

    useEffect(() => {
        let curr = -1;
        setPages(
            cardDetails.map(() => {
                curr++;
                if (curr == 1){
                    return (
                        <StyledSecondaryCard key={cardDetails.id} className="card main">
                        <img key={cardDetails.id} className="image" src={cardDetails.imgUrl} alt={cardDetails.alt} />
                        </StyledSecondaryCard>
                    )
                }

                else{
                    return(
                        <StyledSecondaryCard key={cardDetails.id} className="card">
                        <img key={cardDetails.id} className="image" src={cardDetails.imgUrl} alt={cardDetails.alt} />
                       </StyledSecondaryCard>
                    )
                }
            })
        )
    }, [])

    // useEffect(() => {
    // },[])
    let data = new Date();

    return (
        <div style={{maxWidth: '710px', overflow: 'hidden'}}>
            <StyledCardList key={offset * data} className="cardList" sx={{
                marginLeft: "-50px",
                transform: `translateX(${offset}px)`,
                transitionDuration: `${transitionDuration}ms`}} onTransitionEnd={handleTransitionEnd} onTransitionEndCapture={handleTransitionEnd}>
                {pages}
            </StyledCardList>
        </div>
    )
}

Ответы (0 шт):