import { Box, Group, SimpleGrid, Stack, Text } from '@mantine/core'; import { useDebouncedValue, useDisclosure } from '@mantine/hooks'; import { useCommonHooks, useMutationAPI, useQueryAPI } from 'hooks'; import { useEffect, useState } from 'react'; import { FiChevronRight } from 'react-icons/fi'; import { textClasses } from 'styles'; import type { Theme, ThemePlaylist } from 'types'; import NoItemsFound from '../Shared/NoItemsFound'; import SettingsHeader from '../Shared/SettingsHeader'; import ThemePlaylistCard from './ThemePlaylistCard'; import ThemePlaylistModal from './ThemePlaylistModal'; function ThemePlaylists() { const themesEndpoint = 'api/themes'; const { data: allThemeData } = useQueryAPI({ endpoint: themesEndpoint, }); const themePlaylistsEndpoint = 'api/themePlaylists'; const { data: themePlaylistData, isFetched: isThemePlaylistDataFetched } = useQueryAPI({ endpoint: themePlaylistsEndpoint, }); const [themePlaylists, setThemePlaylists] = useState([]); const defaultPlaylist = { id: undefined, default: 0, name: 'New Playlist', themeList: '[]', }; const { mutateAsync } = useMutationAPI(); const [opened, { open, close }] = useDisclosure(false); const [selectedPlaylist, setSelectedPlaylist] = useState(defaultPlaylist); const { currentThemePlaylist, theme, isMobile } = useCommonHooks(); const [searchValue, setSearchValue] = useState(''); const [debouncedSearch] = useDebouncedValue(searchValue, 500); const [isLoading, setIsLoading] = useState(false); const handleOpen = (playlist: ThemePlaylist) => { setSelectedPlaylist(playlist); open(); }; const handleClose = () => { setSelectedPlaylist(defaultPlaylist); close(); }; const handleSavePlaylist = () => { mutateAsync({ method: selectedPlaylist?.id === undefined ? 'POST' : 'PATCH', endpoint: themePlaylistsEndpoint, body: selectedPlaylist ?? {}, }); close(); }; useEffect(() => { if (themePlaylistData && isThemePlaylistDataFetched) { setThemePlaylists( themePlaylistData.filter( (a: ThemePlaylist) => a.name.toLowerCase().includes(debouncedSearch.toLowerCase()) || a.name.includes('Time of Day'), ), ); } if (debouncedSearch === searchValue) { setIsLoading(false); } }, [themePlaylistData, isThemePlaylistDataFetched, debouncedSearch]); return ( {allThemeData && ( <> Defaults {'All' === currentThemePlaylist && ( )} a.id) ?? ''}]`, }} handleOpen={handleOpen} allThemes={allThemeData} /> {'Backgrounds' === currentThemePlaylist && ( )} !a.backgroundImage.toLowerCase().includes('none')).map((a: Theme) => a.id) ?? ''}]`, }} handleOpen={handleOpen} allThemes={allThemeData} /> {'No Backgrounds' === currentThemePlaylist && ( )} a.backgroundImage.toLowerCase().includes('none')).map((a: Theme) => a.id) ?? ''}]`, }} handleOpen={handleOpen} allThemes={allThemeData} /> {'Time of Day' === currentThemePlaylist && ( )} a.name === 'Time of Day', )[0]?.id ?? undefined, name: 'Time of Day', default: 1, themeList: themePlaylists?.filter( (a: ThemePlaylist) => a.name === 'Time of Day', )[0]?.themeList ?? '[]', }} handleOpen={handleOpen} allThemes={allThemeData} /> User Made {themePlaylists.length > 1 ? ( {themePlaylists .filter((playlist: ThemePlaylist) => playlist.default === 0) .sort((a: ThemePlaylist, b: ThemePlaylist) => a.name > b.name ? 1 : -1, ) .map((cardPlaylist: ThemePlaylist) => { return ( {cardPlaylist.name === currentThemePlaylist && ( )} ); })} ) : ( )} )} ); } export default ThemePlaylists;