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, PlayerStatus, 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'; const mpvPlayer = isElectron() ? window.electron.mpvPlayer : null; const remote = isElectron() ? window.electron.remote : 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) { mpvPlayer!.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) { mpvPlayer!.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) { mpvPlayer!.setQueue(playerData); } else { mpvPlayer!.setQueueNext(playerData); } } if (isCurrentSongRemoved) { remote?.updateSong({ song: playerData.current.song }); } }; const handleClearQueue = () => { const playerData = clearQueue(); if (playbackType === PlaybackType.LOCAL) { mpvPlayer!.setQueue(playerData); mpvPlayer!.pause(); } remote?.updateSong({ song: undefined, status: PlayerStatus.PAUSED }); setCurrentTime(0); pause(); }; const handleShuffleQueue = () => { const playerData = shuffleQueue(); if (playbackType === PlaybackType.LOCAL) { mpvPlayer!.setQueueNext(playerData); } }; return ( ); };