/* eslint-disable react/no-unknown-property */ import { useCallback, useState, Fragment, useRef } from 'react'; import { ActionIcon, Group, Kbd, ScrollArea } from '@mantine/core'; import { useDisclosure, useDebouncedValue } from '@mantine/hooks'; import { RiSearchLine, RiCloseFill } from 'react-icons/ri'; import { generatePath, useNavigate } from 'react-router'; import styled from 'styled-components'; import { GoToCommands } from './go-to-commands'; import { Command, CommandPalettePages } from '/@/renderer/features/search/components/command'; import { Button, Modal, Paper, Spinner, TextInput } from '/@/renderer/components'; import { HomeCommands } from './home-commands'; import { ServerCommands } from '/@/renderer/features/search/components/server-commands'; import { useSearch } from '/@/renderer/features/search/queries/search-query'; import { useCurrentServer } from '/@/renderer/store'; import { AppRoute } from '/@/renderer/router/routes'; import { LibraryCommandItem } from '/@/renderer/features/search/components/library-command-item'; import { LibraryItem } from '/@/renderer/api/types'; import { usePlayQueueAdd } from '/@/renderer/features/player'; interface CommandPaletteProps { modalProps: typeof useDisclosure['arguments']; } const CustomModal = styled(Modal)` & .mantine-Modal-header { display: none; } `; export const CommandPalette = ({ modalProps }: CommandPaletteProps) => { const navigate = useNavigate(); const server = useCurrentServer(); const [value, setValue] = useState(''); const [query, setQuery] = useState(''); const [debouncedQuery] = useDebouncedValue(query, 400); const [pages, setPages] = useState([CommandPalettePages.HOME]); const activePage = pages[pages.length - 1]; const isHome = activePage === CommandPalettePages.HOME; const searchInputRef = useRef(null); const popPage = useCallback(() => { setPages((pages) => { const x = [...pages]; x.splice(-1, 1); return x; }); }, []); const { data, isLoading } = useSearch({ options: { enabled: isHome && debouncedQuery !== '' && query !== '' }, query: { albumArtistLimit: 4, albumArtistStartIndex: 0, albumLimit: 4, albumStartIndex: 0, query: debouncedQuery, songLimit: 4, songStartIndex: 0, }, serverId: server?.id, }); const showAlbumGroup = isHome && Boolean(query && data && data?.albums?.length > 0); const showArtistGroup = isHome && Boolean(query && data && data?.albumArtists?.length > 0); const showTrackGroup = isHome && Boolean(query && data && data?.songs?.length > 0); const handlePlayQueueAdd = usePlayQueueAdd(); return ( { if (isHome) { modalProps.handlers.close(); setQuery(''); } else { popPage(); } }, toggle: () => { if (isHome) { modalProps.handlers.toggle(); setQuery(''); } else { popPage(); } }, }} scrollAreaComponent={ScrollArea.Autosize} size="lg" > {pages.map((page, index) => ( {index > 0 && ' > '} ))} { if (value.includes(search)) return 1; if (value.includes('search')) return 1; return 0; }} label="Global Command Menu" value={value} onValueChange={setValue} > } rightSection={ { setQuery(''); searchInputRef.current?.focus(); }} > } size="lg" value={query} onChange={(e) => setQuery(e.currentTarget.value)} /> No results found. {showAlbumGroup && ( {data?.albums?.map((album) => ( { navigate(generatePath(AppRoute.LIBRARY_ALBUMS_DETAIL, { albumId: album.id })); modalProps.handlers.close(); setQuery(''); }} > artist.name).join(', ')} title={album.name} /> ))} )} {showArtistGroup && ( {data?.albumArtists.map((artist) => ( { navigate( generatePath(AppRoute.LIBRARY_ALBUM_ARTISTS_DETAIL, { albumArtistId: artist.id, }), ); modalProps.handlers.close(); setQuery(''); }} > 0 ? `${artist.albumCount} albums` : undefined } title={artist.name} /> ))} )} {showTrackGroup && ( {data?.songs.map((song) => ( { navigate( generatePath(AppRoute.LIBRARY_ALBUMS_DETAIL, { albumId: song.albumId, }), ); modalProps.handlers.close(); setQuery(''); }} > artist.name).join(', ')} title={song.name} /> ))} )} {activePage === CommandPalettePages.HOME && ( )} {activePage === CommandPalettePages.GO_TO && ( )} {activePage === CommandPalettePages.MANAGE_SERVERS && ( )} {isHome && isLoading && query !== '' && } ESC ); };