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 } from '/@/renderer/components'; import isElectron from 'is-electron'; import { useTranslation } from 'react-i18next'; import { RiArrowDownLine, RiArrowUpLine, RiShuffleLine, RiDeleteBinLine, RiListSettingsLine, RiEraserLine, } from 'react-icons/ri'; import { Song } from '/@/renderer/api/types'; import { usePlayerControls, useQueueControls } from '/@/renderer/store'; import { PlaybackType, TableType } from '/@/renderer/types'; import { usePlaybackType } from '/@/renderer/store/settings.store'; import { usePlayerStore, useSetCurrentTime } from '../../../store/player.store'; import { TableConfigDropdown } from '/@/renderer/components/virtual-table'; import { updateSong } from '/@/renderer/features/player/update-remote-song'; import { setQueue, setQueueNext } from '/@/renderer/utils/set-transcoded-queue-data'; const mpvPlayer = isElectron() ? window.electron.mpvPlayer : null; interface PlayQueueListOptionsProps { tableRef: MutableRefObject<{ grid: AgGridReactType } | null>; type: TableType; } export const PlayQueueListControls = ({ type, tableRef }: PlayQueueListOptionsProps) => { const { t } = useTranslation(); const { clearQueue, moveToBottomOfQueue, moveToTopOfQueue, shuffleQueue, removeFromQueue } = useQueueControls(); const { pause } = usePlayerControls(); const playbackType = usePlaybackType(); const setCurrentTime = useSetCurrentTime(); const handleMoveToBottom = () => { const selectedRows = tableRef?.current?.grid.api.getSelectedRows(); const uniqueIds = selectedRows?.map((row) => row.uniqueId); if (!uniqueIds?.length) return; const playerData = moveToBottomOfQueue(uniqueIds); if (playbackType === PlaybackType.LOCAL) { setQueueNext(playerData); } }; const handleMoveToTop = () => { const selectedRows = tableRef?.current?.grid.api.getSelectedRows(); const uniqueIds = selectedRows?.map((row) => row.uniqueId); if (!uniqueIds?.length) return; const playerData = moveToTopOfQueue(uniqueIds); if (playbackType === PlaybackType.LOCAL) { setQueueNext(playerData); } }; const handleRemoveSelected = () => { const selectedRows = tableRef?.current?.grid.api.getSelectedRows(); const uniqueIds = selectedRows?.map((row) => row.uniqueId); if (!uniqueIds?.length) return; const currentSong = usePlayerStore.getState().current.song; const playerData = removeFromQueue(uniqueIds); const isCurrentSongRemoved = currentSong && uniqueIds.includes(currentSong.uniqueId); if (playbackType === PlaybackType.LOCAL) { if (isCurrentSongRemoved) { setQueue(playerData); } else { setQueueNext(playerData); } } if (isCurrentSongRemoved) { updateSong(playerData.current.song); } }; const handleClearQueue = () => { const playerData = clearQueue(); if (playbackType === PlaybackType.LOCAL) { setQueue(playerData); mpvPlayer!.pause(); } updateSong(undefined); setCurrentTime(0); pause(); }; const handleShuffleQueue = () => { const playerData = shuffleQueue(); if (playbackType === PlaybackType.LOCAL) { setQueueNext(playerData); } }; return ( ); };