import React, { useState, useEffect } from 'react'; import { IonButton, IonIcon, IonReorderGroup, IonReorder, IonItem, IonLabel, IonItemSliding, IonItemOptions, IonItemOption } from '@ionic/react'; import { trash, reorderThreeOutline, reorderTwoOutline, playCircle } from 'ionicons/icons'; import { ActionButton } from '../../components/common'; import { useQueue } from '../../hooks'; import { useAppSelector } from '../../redux'; import { selectQueue, selectPlayerState, selectIsAdmin, selectControllerName } from '../../redux'; import { PlayerState } from '../../types'; import { queueService } from '../../firebase/services'; import { debugLog } from '../../utils/logger'; import type { QueueItem } from '../../types'; type QueueMode = 'delete' | 'reorder'; const Queue: React.FC = () => { const [queueMode, setQueueMode] = useState('delete'); const [listItems, setListItems] = useState([]); const { queueItems, queueStats, canReorder, handleRemoveFromQueue, } = useQueue(); const queue = useAppSelector(selectQueue); const playerState = useAppSelector(selectPlayerState); const isAdmin = useAppSelector(selectIsAdmin); const controllerName = useAppSelector(selectControllerName); const queueCount = Object.keys(queue).length; // Debug logging debugLog('Queue component - queue count:', queueCount); debugLog('Queue component - queue items:', queueItems); debugLog('Queue component - player state:', playerState); debugLog('Queue component - isAdmin:', isAdmin); debugLog('Queue component - canReorder:', canReorder); debugLog('Queue component - queueMode:', queueMode); // Check if items can be deleted (admin can delete any item when not playing) const canDeleteItems = isAdmin && (playerState?.state === PlayerState.stopped || playerState?.state === PlayerState.paused); debugLog('Queue component - canDeleteItems:', canDeleteItems); debugLog('Queue component - canReorder:', canReorder); // Update list items when queue changes useEffect(() => { if (queueItems.length > 0) { // Skip the first item (currently playing) for reordering setListItems(queueItems.slice(1)); } else { setListItems([]); } }, [queueItems]); // Toggle between modes const toggleQueueMode = () => { setQueueMode(prevMode => prevMode === 'delete' ? 'reorder' : 'delete'); }; // Handle reorder event from IonReorderGroup const doReorder = async (event: CustomEvent) => { debugLog('Reorder event:', event.detail); const { from, to, complete } = event.detail; if (listItems && controllerName) { const copy = [...listItems]; const draggedItem = copy.splice(from, 1)[0]; copy.splice(to, 0, draggedItem); // Complete the reorder animation complete(); // Create the new queue order (first item + reordered items) const newQueueItems = [queueItems[0], ...copy]; debugLog('New queue order:', newQueueItems); try { // Update all items with their new order values const updatePromises = newQueueItems.map((item, index) => { const newOrder = index + 1; if (item.key && item.order !== newOrder) { debugLog(`Updating item ${item.key} from order ${item.order} to ${newOrder}`); return queueService.updateQueueItem(controllerName, item.key, { order: newOrder }); } return Promise.resolve(); }); await Promise.all(updatePromises); debugLog('Queue reorder completed successfully'); } catch (error) { console.error('Failed to reorder queue:', error); // You might want to show an error toast here } } }; // Render queue item const renderQueueItem = (queueItem: QueueItem, index: number) => { debugLog(`Queue item ${index}: order=${queueItem.order}, key=${queueItem.key}`); const canDelete = isAdmin && queueMode === 'delete'; // Only allow delete in delete mode return ( {/* Order Number */}
{queueItem.order}
{/* Song Info */}

{queueItem.singer.name}

{queueItem.song.title}

{queueItem.song.artist}

{/* Delete Button or Drag Handle */}
{canDelete && (
e.stopPropagation()}> handleRemoveFromQueue(queueItem)} variant="danger" size="sm" >
)} {canReorder && queueMode === 'reorder' && (
)}
{/* Swipe Actions */} {canDelete && ( handleRemoveFromQueue(queueItem)} > )}
); }; // Render first item (currently playing) separately const renderFirstItem = () => { if (queueItems.length === 0) return null; const firstItem = queueItems[0]; const canDeleteFirstItem = isAdmin && (playerState?.state === PlayerState.stopped || playerState?.state === PlayerState.paused); return ( {/* Order Number */}
{firstItem.order}
{/* Song Info */}

{firstItem.singer.name}

{firstItem.song.title}

{firstItem.song.artist}

{/* Delete Button */}
{canDeleteFirstItem && queueMode === 'delete' && (
e.stopPropagation()}> handleRemoveFromQueue(firstItem)} variant="danger" size="sm" className="opacity-100" >
)}
{/* Swipe Actions */} {canDeleteFirstItem && queueMode === 'delete' && ( handleRemoveFromQueue(firstItem)} > )}
); }; return ( <>
{isAdmin && ( )}
{/* First Item (Currently Playing) */} {renderFirstItem()} {/* Queue List with Reorder */} {canReorder && queueMode === 'reorder' ? ( {listItems.map((queueItem, index) => ( {renderQueueItem(queueItem, index)} ))} ) : (
{listItems.map((queueItem, index) => renderQueueItem(queueItem, index))}
)}
); }; export default Queue;