import { ActionIcon, Button, type ComboboxItem, Group, Menu, MultiSelect, Overlay, Select, Slider, Stack, Text, Tooltip, } from '@mantine/core'; import { useQueryClient } from '@tanstack/react-query'; import { useCommonHooks, useMutationAPI, useQueryAPI } from 'hooks'; import { useEffect, useState } from 'react'; import { FaDice, FaSync } from 'react-icons/fa'; import { FiMenu, FiPower, FiSettings, FiShuffle } from 'react-icons/fi'; import { useNavigate } from 'react-router-dom'; import { toast } from 'react-toastify'; import { actionIconClasses, buttonClasses, menuClasses, multiSelectClasses, selectClasses, sliderClasses, stackClasses, } from 'styles'; import type { AppCategory, Theme, ThemePlaylist, WolClient } from 'types'; function SettingsButton() { const { data: appCategoryData, isFetched: appCategoryDataIsFetched } = useQueryAPI({ endpoint: 'api/appCategories', }); const { data: wolClientData, isFetched: wolClientDataIsFetched } = useQueryAPI({ endpoint: 'api/wolClients', }); const [wolClients, setWolClients] = useState([]); const { data: allThemeData, isFetched: allThemeDataIsFetched } = useQueryAPI({ endpoint: 'api/themes', }); const { data: themePlaylistData } = useQueryAPI({ endpoint: 'api/themePlaylists', }); const { mutateAsync } = useMutationAPI(); const [allThemes, setAllThemes] = useState([]); const [categories, setCategories] = useState([{ value: 'All', label: 'All' }]); const [selectedClient] = useState(wolClientData?.[0]); const [overlayOpened, setOverlayOpened] = useState(false); const navigate = useNavigate(); const notify = (notification: any) => toast(notification, { position: 'bottom-right' }); const { currentTheme, setCurrentTheme, setThemeName, handleThemeChange, theme, appFilter, setAppFilter, appSort, setAppSort, appDensity, setAppDensity, bookmarkSort, setBookmarkSort, bookmarkFilter, setBookmarkFilter, bookmarkDensity, setBookmarkDensity, isMobile, currentThemePlaylist, setCurrentThemePlaylist, } = useCommonHooks(); const handleWakeRequest = () => { mutateAsync({ method: 'POST', endpoint: 'api/wakeClient', body: selectedClient || wolClientData?.[0], }); }; const queryClient = useQueryClient(); const handleRefresh = () => { queryClient.refetchQueries(); }; useEffect(() => { if (appCategoryData) { const list: [any] = appCategoryData.map((category: AppCategory) => { return { value: category.filterName, label: category.filterName }; }); list.unshift({ value: 'All', label: 'All' }); setCategories(list); } }, [appCategoryData, appCategoryDataIsFetched]); useEffect(() => { if (wolClientData && wolClientDataIsFetched) { setWolClients(wolClientData); } }, [wolClientData, wolClientDataIsFetched]); useEffect(() => { if (allThemeData && allThemeDataIsFetched) { setAllThemes(allThemeData); } }, [allThemeData, allThemeDataIsFetched]); return ( <> {overlayOpened && } setOverlayOpened(true)} onClose={() => setOverlayOpened(false)} > Wake on LAN { return { value: playlist.name, label: playlist.name, }; }) .toSorted((a: ComboboxItem, b: ComboboxItem) => a.label.localeCompare(b.label), ) ?? [] } w='92%' classNames={{ input: selectClasses.menuSelectInput, label: selectClasses.menuSelectLabel, options: selectClasses.menuSelectOptions, option: selectClasses.menuSelectOption, }} comboboxProps={{ withinPortal: false, width: 'fit-content', }} onChange={(_value, option: ComboboxItem) => { setCurrentThemePlaylist(option.value); if (option.value !== 'Time of Day') { setThemeName('random'); } else { const themeList = JSON.parse( themePlaylistData.find( (t: ThemePlaylist) => t.name === 'Time of Day', ).themeList, ); setThemeName( allThemeData.find( (t: Theme) => t.id === Number(themeList[Math.floor(new Date().getHours() / 6)]), ).name, ); } }} /> Apps Density setAppDensity(value)} min={1} max={8} /> a.label.localeCompare(b.label), ) ?? [] } placeholder={ appFilter.length > 0 ? appFilter.length === 1 ? appFilter[0] : `${appFilter.length} apps selected` : 'No apps selected' } defaultValue={appFilter} onChange={(data: string[]) => { setAppFilter(data); }} classNames={multiSelectClasses} comboboxProps={{ withinPortal: false, }} /> Z', 'Z>A', 'Newest', 'Oldest']} classNames={{ input: selectClasses.menuSelectInput, label: selectClasses.menuSelectLabel, options: selectClasses.menuSelectOptions, option: selectClasses.menuSelectOption, }} comboboxProps={{ withinPortal: false, }} onChange={(_value, option: ComboboxItem) => { setBookmarkSort(option.value); }} /> ); } export default SettingsButton;