jeffvli
3 years ago
committed by
Jeff
1 changed files with 159 additions and 0 deletions
@ -0,0 +1,159 @@ |
|||
import React, { useState } from 'react'; |
|||
import settings from 'electron-settings'; |
|||
import { useQuery } from 'react-query'; |
|||
import { ButtonToolbar, Icon } from 'rsuite'; |
|||
import { getIndexes, getMusicDirectory } from '../../api/api'; |
|||
import PageLoader from '../loader/PageLoader'; |
|||
import ListViewType from '../viewtypes/ListViewType'; |
|||
import { useAppDispatch } from '../../redux/hooks'; |
|||
import { |
|||
clearSelected, |
|||
setRangeSelected, |
|||
toggleRangeSelected, |
|||
toggleSelected, |
|||
} from '../../redux/multiSelectSlice'; |
|||
import GenericPage from '../layout/GenericPage'; |
|||
import GenericPageHeader from '../layout/GenericPageHeader'; |
|||
import { StyledButton, StyledInputPicker } from '../shared/styled'; |
|||
import { fixPlayer2Index, setPlayQueueByRowClick } from '../../redux/playQueueSlice'; |
|||
import { setStatus } from '../../redux/playerSlice'; |
|||
import useSearchQuery from '../../hooks/useSearchQuery'; |
|||
|
|||
const FolderList = () => { |
|||
const dispatch = useAppDispatch(); |
|||
const [folderId, setFolderId] = useState(''); |
|||
const { isLoading, isError, data, error }: any = useQuery(['folders'], () => getIndexes(), { |
|||
refetchOnReconnect: false, |
|||
refetchOnWindowFocus: false, |
|||
}); |
|||
const { data: folderData }: any = useQuery( |
|||
['folder', folderId], |
|||
() => getMusicDirectory({ id: folderId }), |
|||
{ |
|||
enabled: folderId !== '', |
|||
refetchOnReconnect: false, |
|||
refetchOnWindowFocus: false, |
|||
} |
|||
); |
|||
const [searchQuery, setSearchQuery] = useState(''); |
|||
const filteredData = useSearchQuery(searchQuery, folderData?.child, [ |
|||
'title', |
|||
'artist', |
|||
'album', |
|||
'year', |
|||
'genre', |
|||
'path', |
|||
]); |
|||
|
|||
let timeout: any = null; |
|||
const handleRowClick = (e: any, rowData: any) => { |
|||
if (timeout === null) { |
|||
timeout = window.setTimeout(() => { |
|||
timeout = null; |
|||
|
|||
if (e.ctrlKey) { |
|||
dispatch(toggleSelected(rowData)); |
|||
} else if (e.shiftKey) { |
|||
dispatch(setRangeSelected(rowData)); |
|||
dispatch(toggleRangeSelected(folderData.child)); |
|||
} |
|||
}, 100); |
|||
} |
|||
}; |
|||
|
|||
const handleRowDoubleClick = (rowData: any) => { |
|||
window.clearTimeout(timeout); |
|||
timeout = null; |
|||
|
|||
dispatch(clearSelected()); |
|||
if (rowData.isDir) { |
|||
setFolderId(rowData.id); |
|||
} else { |
|||
dispatch( |
|||
setPlayQueueByRowClick({ |
|||
entries: folderData?.child?.filter((entry: any) => entry.isDir === false), |
|||
currentIndex: rowData.index, |
|||
currentSongId: rowData.id, |
|||
uniqueSongId: rowData.uniqueId, |
|||
}) |
|||
); |
|||
dispatch(setStatus('PLAYING')); |
|||
dispatch(fixPlayer2Index()); |
|||
} |
|||
}; |
|||
|
|||
return ( |
|||
<> |
|||
{isLoading && <PageLoader />} |
|||
{isError && <div>Error: {error}</div>} |
|||
{!isLoading && data && ( |
|||
<GenericPage |
|||
hideDivider |
|||
header={ |
|||
<GenericPageHeader |
|||
title={`${folderData?.name ? folderData.name : 'Select a folder'}`} |
|||
showSearchBar |
|||
searchQuery={searchQuery} |
|||
handleSearch={(e: any) => setSearchQuery(e)} |
|||
clearSearchQuery={() => setSearchQuery('')} |
|||
showTitleTooltip |
|||
subtitle={ |
|||
<> |
|||
<ButtonToolbar> |
|||
<StyledInputPicker |
|||
data={data} |
|||
size="sm" |
|||
labelKey="name" |
|||
valueKey="id" |
|||
virtualized |
|||
onChange={(e: string) => setFolderId(e)} |
|||
/> |
|||
|
|||
<StyledButton |
|||
size="sm" |
|||
disabled={!folderData?.parent} |
|||
onClick={() => { |
|||
if (folderData?.parent) { |
|||
setFolderId(folderData?.parent); |
|||
} |
|||
}} |
|||
> |
|||
<Icon icon="level-up" style={{ marginRight: '10px' }} /> |
|||
Go up |
|||
</StyledButton> |
|||
</ButtonToolbar> |
|||
</> |
|||
} |
|||
/> |
|||
} |
|||
> |
|||
<ListViewType |
|||
data={searchQuery !== '' ? filteredData : folderData?.child} |
|||
tableColumns={settings.getSync('musicListColumns')} |
|||
rowHeight={Number(settings.getSync('musicListRowHeight'))} |
|||
fontSize={Number(settings.getSync('musicListFontSize'))} |
|||
handleRowClick={handleRowClick} |
|||
handleRowDoubleClick={handleRowDoubleClick} |
|||
cacheImages={{ |
|||
enabled: settings.getSync('cacheImages'), |
|||
cacheType: 'folder', |
|||
cacheIdProperty: 'albumId', |
|||
}} |
|||
listType="folder" |
|||
virtualized |
|||
disabledContextMenuOptions={[ |
|||
'addToFavorites', |
|||
'removeFromFavorites', |
|||
'viewInModal', |
|||
'moveSelectedTo', |
|||
'removeFromCurrent', |
|||
'deletePlaylist', |
|||
]} |
|||
/> |
|||
</GenericPage> |
|||
)} |
|||
</> |
|||
); |
|||
}; |
|||
|
|||
export default FolderList; |
Loading…
Reference in new issue