feishin/src/renderer/features/now-playing/components/play-queue-list-controls.tsx

163 lines
4.4 KiB
TypeScript
Raw Normal View History

2022-12-19 15:59:14 -08:00
import type { MutableRefObject } from 'react';
import type { AgGridReact as AgGridReactType } from '@ag-grid-community/react/lib/agGridReact';
import { Group } from '@mantine/core';
import { Button, Popover, TableConfigDropdown } from '/@/renderer/components';
2022-12-25 01:25:46 -08:00
import isElectron from 'is-electron';
2022-12-19 15:59:14 -08:00
import {
RiArrowDownLine,
RiArrowUpLine,
RiShuffleLine,
RiDeleteBinLine,
RiListSettingsLine,
RiEraserLine,
} from 'react-icons/ri';
import { Song } from '/@/renderer/api/types';
import { useQueueControls } from '/@/renderer/store';
2022-12-25 01:55:00 -08:00
import { PlaybackType, TableType } from '/@/renderer/types';
import { usePlayerType } from '/@/renderer/store/settings.store';
2022-12-19 15:59:14 -08:00
2022-12-25 01:25:46 -08:00
const mpvPlayer = isElectron() ? window.electron.mpvPlayer : null;
2022-12-19 15:59:14 -08:00
interface PlayQueueListOptionsProps {
tableRef: MutableRefObject<{ grid: AgGridReactType<Song> } | null>;
type: TableType;
}
export const PlayQueueListControls = ({ type, tableRef }: PlayQueueListOptionsProps) => {
const { clearQueue, moveToBottomOfQueue, moveToTopOfQueue, shuffleQueue, removeFromQueue } =
useQueueControls();
2022-12-25 01:55:00 -08:00
const playerType = usePlayerType();
2022-12-19 15:59:14 -08:00
const handleMoveToBottom = () => {
const selectedRows = tableRef?.current?.grid.api.getSelectedRows();
const uniqueIds = selectedRows?.map((row) => row.uniqueId);
if (!uniqueIds?.length) return;
const playerData = moveToBottomOfQueue(uniqueIds);
2022-12-25 01:55:00 -08:00
if (playerType === PlaybackType.LOCAL) {
mpvPlayer.setQueueNext(playerData);
}
2022-12-19 15:59:14 -08:00
};
const handleMoveToTop = () => {
const selectedRows = tableRef?.current?.grid.api.getSelectedRows();
const uniqueIds = selectedRows?.map((row) => row.uniqueId);
if (!uniqueIds?.length) return;
const playerData = moveToTopOfQueue(uniqueIds);
2022-12-25 01:55:00 -08:00
if (playerType === PlaybackType.LOCAL) {
mpvPlayer.setQueueNext(playerData);
}
2022-12-19 15:59:14 -08:00
};
const handleRemoveSelected = () => {
const selectedRows = tableRef?.current?.grid.api.getSelectedRows();
const uniqueIds = selectedRows?.map((row) => row.uniqueId);
if (!uniqueIds?.length) return;
const playerData = removeFromQueue(uniqueIds);
2022-12-25 01:55:00 -08:00
if (playerType === PlaybackType.LOCAL) {
mpvPlayer.setQueueNext(playerData);
}
2022-12-19 15:59:14 -08:00
};
const handleClearQueue = () => {
const playerData = clearQueue();
2022-12-25 01:55:00 -08:00
if (playerType === PlaybackType.LOCAL) {
mpvPlayer.setQueue(playerData);
mpvPlayer.stop();
}
2022-12-19 15:59:14 -08:00
};
const handleShuffleQueue = () => {
const playerData = shuffleQueue();
2022-12-25 01:55:00 -08:00
if (playerType === PlaybackType.LOCAL) {
mpvPlayer.setQueueNext(playerData);
}
2022-12-19 15:59:14 -08:00
};
return (
<Group
position="apart"
px="1rem"
2022-12-25 01:55:00 -08:00
py="1rem"
2022-12-19 15:59:14 -08:00
sx={{ alignItems: 'center' }}
2022-12-28 01:29:37 -08:00
w="100%"
2022-12-19 15:59:14 -08:00
>
2023-01-30 01:36:36 -08:00
<Group spacing="sm">
2022-12-19 15:59:14 -08:00
<Button
compact
2023-01-30 01:36:36 -08:00
size="md"
2022-12-19 15:59:14 -08:00
tooltip={{ label: 'Shuffle queue' }}
variant="default"
onClick={handleShuffleQueue}
>
2023-01-30 01:36:36 -08:00
<RiShuffleLine size="1.1rem" />
2022-12-19 15:59:14 -08:00
</Button>
<Button
compact
2023-01-30 01:36:36 -08:00
size="md"
2022-12-19 15:59:14 -08:00
tooltip={{ label: 'Move selected to top' }}
variant="default"
onClick={handleMoveToTop}
>
2023-01-30 01:36:36 -08:00
<RiArrowUpLine size="1.1rem" />
2022-12-19 15:59:14 -08:00
</Button>
<Button
compact
2023-01-30 01:36:36 -08:00
size="md"
2022-12-19 15:59:14 -08:00
tooltip={{ label: 'Move selected to bottom' }}
variant="default"
onClick={handleMoveToBottom}
>
2023-01-30 01:36:36 -08:00
<RiArrowDownLine size="1.1rem" />
2022-12-19 15:59:14 -08:00
</Button>
<Button
compact
2023-01-30 01:36:36 -08:00
size="md"
2022-12-19 15:59:14 -08:00
tooltip={{ label: 'Remove selected' }}
variant="default"
onClick={handleRemoveSelected}
>
2023-01-30 01:36:36 -08:00
<RiEraserLine size="1.1rem" />
2022-12-19 15:59:14 -08:00
</Button>
<Button
compact
2023-01-30 01:36:36 -08:00
size="md"
2022-12-19 15:59:14 -08:00
tooltip={{ label: 'Clear queue' }}
variant="default"
onClick={handleClearQueue}
>
2023-01-30 01:36:36 -08:00
<RiDeleteBinLine size="1.1rem" />
2022-12-19 15:59:14 -08:00
</Button>
</Group>
<Group>
<Popover
position="top-end"
transition="fade"
>
2022-12-19 15:59:14 -08:00
<Popover.Target>
<Button
compact
2023-01-30 01:36:36 -08:00
size="md"
2022-12-19 15:59:14 -08:00
tooltip={{ label: 'Configure' }}
variant="subtle"
2022-12-19 15:59:14 -08:00
>
2023-01-30 01:36:36 -08:00
<RiListSettingsLine size="1.1rem" />
2022-12-19 15:59:14 -08:00
</Button>
</Popover.Target>
<Popover.Dropdown>
<TableConfigDropdown type={type} />
</Popover.Dropdown>
</Popover>
</Group>
</Group>
);
};