import type { Variants } from 'motion/react'; import type { MouseEvent } from 'react'; import { AnimatePresence, motion } from 'motion/react'; import { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { generatePath, Link } from 'react-router-dom'; import styles from './feature-carousel.module.css'; import { usePlayQueueAdd } from '/@/renderer/features/player/hooks/use-playqueue-add'; import { PlayButton } from '/@/renderer/features/shared'; import { AppRoute } from '/@/renderer/router/routes'; import { usePlayButtonBehavior } from '/@/renderer/store'; import { Badge } from '/@/shared/components/badge/badge'; import { Button } from '/@/shared/components/button/button'; import { Group } from '/@/shared/components/group/group'; import { Icon } from '/@/shared/components/icon/icon'; import { Image } from '/@/shared/components/image/image'; import { Stack } from '/@/shared/components/stack/stack'; import { TextTitle } from '/@/shared/components/text-title/text-title'; import { Text } from '/@/shared/components/text/text'; import { Album, LibraryItem } from '/@/shared/types/domain-types'; import { Play } from '/@/shared/types/types'; const variants: Variants = { animate: { opacity: 1, transition: { opacity: { duration: 0.5 } }, }, exit: { opacity: 0, transition: { opacity: { duration: 0.5 } }, }, initial: { opacity: 0, }, }; interface FeatureCarouselProps { data: Album[] | undefined; } export const FeatureCarousel = ({ data }: FeatureCarouselProps) => { const { t } = useTranslation(); const handlePlayQueueAdd = usePlayQueueAdd(); const [itemIndex, setItemIndex] = useState(0); const [direction, setDirection] = useState(0); const playType = usePlayButtonBehavior(); const currentItem = data?.[itemIndex]; const handleNext = (e: MouseEvent) => { e.preventDefault(); setDirection(1); if (itemIndex === (data?.length || 0) - 1 || 0) { setItemIndex(0); return; } setItemIndex((prev) => prev + 1); }; const handlePrevious = (e: MouseEvent) => { e.preventDefault(); setDirection(-1); if (itemIndex === 0) { setItemIndex((data?.length || 0) - 1); return; } setItemIndex((prev) => prev - 1); }; return ( {data && (
{currentItem?.name}
{currentItem?.albumArtists.slice(0, 1).map((artist) => ( {artist.name} ))}
{currentItem?.genres?.slice(0, 1).map((genre) => ( {genre.name} ))} {currentItem?.releaseYear} { e.preventDefault(); e.stopPropagation(); if (!currentItem) return; handlePlayQueueAdd?.({ byItemType: { id: [currentItem.id], type: LibraryItem.ALBUM, }, playType, }); }} variant="outline" > {t( playType === Play.NOW ? 'player.play' : playType === Play.NEXT ? 'player.addNext' : 'player.addLast', { postProcess: 'titleCase' }, )}
)} ); };