import { Box, Button, Divider, Group, Overlay, Stack, Switch, Text, Tooltip, } from '@mantine/core'; import { useDebouncedValue, useDisclosure } from '@mantine/hooks'; import { NoItemsFound, SettingsHeader } from 'components'; import { useCommonHooks, useQueryAPI } from 'hooks'; import { useEffect, useState } from 'react'; import { FaDice } from 'react-icons/fa'; import { FiChevronRight, FiEdit, FiMousePointer, FiStopCircle } from 'react-icons/fi'; import { useNavigate } from 'react-router-dom'; import { switchClasses, textClasses } from 'styles'; import type { Theme, ThemePlaylist } from 'types'; import { BackgroundModal } from '../Backgrounds'; import { ThemeCard } from './ThemeCard'; import { ThemeModal } from './ThemeModal'; export function Themes() { const backgroundsEndpoint = 'api/backgrounds'; const { data: allThemeData, isFetched: isAllThemeDataFetched } = useQueryAPI({ endpoint: 'api/themes', }); const [allThemes, setAllThemes] = useState([]); const { data: backgroundData, isFetched: isBackgroundFetched } = useQueryAPI({ endpoint: backgroundsEndpoint, }); const { data: themePlaylistData } = useQueryAPI({ endpoint: 'api/themePlaylists', }); const [themePlaylists, setThemePlaylists] = useState([]); const [themeModalOpened, { open: openThemeModal, close: closeThemeModal }] = useDisclosure(false); const [ backgroundModalOpened, { open: openBackgroundModal, close: closeBackgroundModal }, ] = useDisclosure(false); const [backgroundList, setBackgroundList] = useState(['None']); const [inUseBackgrounds, setInUseBackgrounds] = useState([]); const [selectedTheme, setSelectedTheme] = useState({ id: undefined, name: 'default', backgroundImage: 'none', backgroundColor: '#EEEEEE', searchColor: '#00000033', primaryColor: '#222222', accentColor: '#5c5c5c', borderColor: '#5c5c5c', randomEnabled: 1, textShadowsEnabled: 0, appShadowsEnabled: 0, }); const [searchValue, setSearchValue] = useState(''); const [debouncedSearch] = useDebouncedValue(searchValue, 500); const [isLoading, setIsLoading] = useState(false); const [isNew, setIsNew] = useState(false); const navigate = useNavigate(); const { currentTheme, setCurrentTheme, theme, isMobile, currentThemePlaylist, setCurrentThemePlaylist, } = useCommonHooks(); const handleNewTheme = () => { setIsNew(true); openThemeModal(); }; useEffect(() => { if (backgroundData && isBackgroundFetched) { setBackgroundList(['None', ...backgroundData]); } }, [backgroundData, isBackgroundFetched]); useEffect(() => { if (themePlaylistData) { setThemePlaylists(themePlaylistData); } }, [themePlaylistData]); useEffect(() => { if (allThemeData && isAllThemeDataFetched) { setAllThemes( allThemeData.filter((a: Theme) => a.name.toLowerCase().includes(debouncedSearch.toLowerCase()), ), ); } if (debouncedSearch === searchValue) { setIsLoading(false); } }, [allThemeData, isAllThemeDataFetched, debouncedSearch]); useEffect(() => { if (allThemes) { setInUseBackgrounds([ ...new Set( allThemes .filter((t) => { if (t.backgroundImage !== 'none') { return t.backgroundImage; } return undefined; }) .map((t) => t.backgroundImage), ), ]); } }, [allThemes]); return ( {allThemes.length > 0 ? ( allThemes.map((cardTheme: Theme) => ( {cardTheme.name === currentTheme && ( )} t.name.toLowerCase() === currentThemePlaylist.toLowerCase(), )[0] ?.themeList.includes(`${cardTheme.id}`) || cardTheme.name === theme.name) ? 195 : 0, }} > )) ) : ( )} Current Settings: Active Playlist: {currentThemePlaylist === 'All' ? 'All' : currentThemePlaylist} ) : ( Shuffle Enabled ) } labelPosition='left' checked={currentTheme === 'random'} onChange={(e) => { setCurrentTheme(e.target.checked ? 'random' : theme.name); setCurrentThemePlaylist('All'); }} className={switchClasses.default} classNames={switchClasses} style={{ zIndex: 250, }} /> ); }