import { Box, Button, Group, Overlay, Stack, Switch, Text, Tooltip } from '@mantine/core'; import { useDebouncedValue, useDisclosure } from '@mantine/hooks'; import { useCommonHooks, useMutationAPI, useQueryAPI } from 'hooks'; import { useEffect, useState } from 'react'; import { FaDice } from 'react-icons/fa'; import { FiChevronRight } from 'react-icons/fi'; import { useNavigate } from 'react-router-dom'; import { switchClasses, textClasses } from 'styles'; import type { Theme, ThemePlaylist } from 'types'; import NoItemsFound from '../Shared/NoItemsFound'; import SettingsHeader from '../Shared/SettingsHeader'; import ThemeCard from './ThemeCard'; import ThemeModal from './ThemeModal'; function ThemesSettings() { const themesEndpoint = 'api/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 { mutateAsync } = useMutationAPI(); const [opened, { open, close }] = useDisclosure(false); const [colorId, setColorId] = useState(''); const [colorValue, setColorValue] = useState('#000000'); const [backgroundList, setBackgroundList] = useState(['None']); const [selectedTheme, setSelectedTheme] = useState({ id: undefined, name: 'default', backgroundImage: 'none', backgroundColor: '#EEEEEE', searchColor: '#00000033', primaryColor: '#222222', accentColor: '#5c5c5c', borderColor: '#5c5c5c', randomEnabled: 0, }); const [pickerOpen, { open: openPicker, close: closePicker }] = useDisclosure(false); const [searchValue, setSearchValue] = useState(''); const [debouncedSearch] = useDebouncedValue(searchValue, 500); const [isLoading, setIsLoading] = useState(false); const navigate = useNavigate(); const { currentTheme, setCurrentTheme, theme, isMobile, currentThemePlaylist, setCurrentThemePlaylist, } = useCommonHooks(); const handleOpen = (theme: Theme) => { setSelectedTheme(theme); open(); }; const handleClose = () => { close(); closePicker(); setSelectedTheme({ id: undefined, name: 'default', backgroundImage: 'none', backgroundColor: '#EEEEEE', searchColor: '#00000033', primaryColor: '#222222', accentColor: '#5c5c5c', borderColor: '#5c5c5c', randomEnabled: 0, }); }; const handleSaveTheme = () => { mutateAsync({ method: selectedTheme?.id === undefined ? 'POST' : 'PATCH', endpoint: themesEndpoint, body: selectedTheme, }); close(); }; 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]); 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, }} /> ); } export default ThemesSettings;