import { ActionIcon, Box, Button, Group, Overlay, Stack, Text } from '@mantine/core'; import { useDisclosure, useElementSize } from '@mantine/hooks'; import { useCommonHooks, useMutationAPI } from 'hooks'; import { useState } from 'react'; import { FiEdit, FiShuffle, FiTrash, FiX } from 'react-icons/fi'; import { actionIconClasses, boxClasses } from 'styles'; import type { Theme, ThemePlaylist } from 'types'; import DeleteItemModal from '../Shared/DeleteItemModal'; function ThemeCard({ cardTheme, handleOpen, allThemes, themePlaylists, }: { cardTheme: Theme; handleOpen: (cardTheme: Theme) => void; allThemes: Theme[]; themePlaylists: ThemePlaylist[]; }) { const { ref, width } = useElementSize(); const [hover, setHover] = useState(false); const [shiftEdit, setShiftEdit] = useState(0); const [shiftShuffle, setShiftShuffle] = useState(0); const { mutateAsync } = useMutationAPI(); const [modalOpened, { open: openModal, close: closeModal }] = useDisclosure(false); const { handleThemeChange, currentTheme, setCurrentTheme, theme, currentThemePlaylist, setCurrentThemePlaylist, handleDelete, } = useCommonHooks(); return ( setHover(true)} onMouseLeave={() => setHover(false)} > handleDelete(cardTheme, 'api/themes')} title={'Delete Theme'} body={ Are you sure you want to delete this theme? {`"${cardTheme.name}"`} This action cannot be undone! } /> {cardTheme.name} {currentTheme === 'random' && cardTheme.name === theme.name ? ( { setShiftEdit(2); }} onMouseLeave={() => { setShiftEdit(0); }} onClick={() => { handleOpen(cardTheme); }} gap={0} style={{ zIndex: 300, position: 'absolute', left: 0, top: 27 - shiftEdit, backgroundColor: shiftEdit === 0 ? 'white' : 'var(--mantine-color-background-0)', borderRadius: '50%', padding: '.5rem', margin: '.25rem', border: 'solid 2px', borderColor: shiftEdit === 0 ? 'black' : 'var(--mantine-color-primary-0)', transition: 'all 0.2s', }} > { setShiftShuffle(2); }} onMouseLeave={() => { setShiftShuffle(0); }} onClick={() => { if (currentThemePlaylist === 'All') { handleThemeChange(allThemes, false); } else if (currentThemePlaylist === 'Backgrounds') { handleThemeChange( allThemes.filter( (a: any) => !a.backgroundImage.toLowerCase().includes('none'), ), false, ); } else if (currentThemePlaylist === 'No Backgrounds') { handleThemeChange( allThemes.filter((a: any) => a.backgroundImage.toLowerCase().includes('none'), ), false, ); } else { const themeList = JSON.parse( themePlaylists?.find( (t: ThemePlaylist) => t?.name === currentThemePlaylist, )?.themeList ?? '[]', ); const filteredThemes = allThemes.filter((t: Theme) => themeList.includes(t.id), ); handleThemeChange(filteredThemes, false); } }} gap={0} style={{ zIndex: 300, position: 'absolute', right: 0, top: 27 - shiftShuffle, backgroundColor: shiftShuffle === 0 ? 'white' : 'var(--mantine-color-background-0)', borderRadius: '50%', padding: '.5rem', margin: '.25rem', border: 'solid 2px', borderColor: shiftShuffle === 0 ? 'black' : 'var(--mantine-color-primary-0)', transition: 'all 0.2s', }} > ) : ( { mutateAsync({ method: 'PATCH', endpoint: 'api/themes', body: { ...cardTheme, randomEnabled: !cardTheme.randomEnabled }, }); }} > {cardTheme.randomEnabled ? : } handleOpen(cardTheme)} mb={'.125rem'} > )} ); } export default ThemeCard;