Signed-off-by: mbrucedogs <mbrucedogs@gmail.com>
This commit is contained in:
parent
0005c2b348
commit
aad198d533
@ -1,19 +1,17 @@
|
||||
import { useCallback, useEffect } from 'react';
|
||||
import { useAppSelector, selectQueueWithUserInfo, selectQueueStats, selectCanReorderQueue } from '../redux';
|
||||
import { useSongOperations } from './useSongOperations';
|
||||
import { useToast } from './useToast';
|
||||
import { useActions } from './useActions';
|
||||
import { queueService } from '../firebase/services';
|
||||
import { selectControllerName } from '../redux';
|
||||
import { debugLog } from '../utils/logger';
|
||||
import type { QueueItem } from '../types';
|
||||
|
||||
|
||||
export const useQueue = () => {
|
||||
const queueItems = useAppSelector(selectQueueWithUserInfo);
|
||||
const queueStats = useAppSelector(selectQueueStats);
|
||||
const canReorder = useAppSelector(selectCanReorderQueue);
|
||||
const controllerName = useAppSelector(selectControllerName);
|
||||
const { removeFromQueue, toggleFavorite } = useSongOperations();
|
||||
const { showSuccess, showError } = useToast();
|
||||
const { handleRemoveFromQueue, handleToggleFavorite } = useActions();
|
||||
|
||||
// Fix queue order if needed
|
||||
const fixQueueOrder = useCallback(async () => {
|
||||
@ -63,184 +61,9 @@ export const useQueue = () => {
|
||||
initializeQueue();
|
||||
}, [controllerName, fixQueueOrder]);
|
||||
|
||||
const handleRemoveFromQueue = useCallback(async (queueItem: QueueItem) => {
|
||||
if (!queueItem.key) return;
|
||||
|
||||
try {
|
||||
await removeFromQueue(queueItem.key);
|
||||
showSuccess('Song removed from queue');
|
||||
} catch {
|
||||
showError('Failed to remove song from queue');
|
||||
}
|
||||
}, [removeFromQueue, showSuccess, showError]);
|
||||
|
||||
const handleToggleFavorite = useCallback(async (song: QueueItem['song']) => {
|
||||
try {
|
||||
await toggleFavorite(song);
|
||||
showSuccess(song.favorite ? 'Removed from favorites' : 'Added to favorites');
|
||||
} catch {
|
||||
showError('Failed to update favorites');
|
||||
}
|
||||
}, [toggleFavorite, showSuccess, showError]);
|
||||
|
||||
const handleMoveUp = useCallback(async (queueItem: QueueItem) => {
|
||||
debugLog('handleMoveUp called with:', queueItem);
|
||||
debugLog('Current queueItems:', queueItems);
|
||||
debugLog('Controller name:', controllerName);
|
||||
|
||||
if (!controllerName || !queueItem.key || queueItem.order <= 1) {
|
||||
debugLog('Early return - conditions not met:', {
|
||||
controllerName: !!controllerName,
|
||||
queueItemKey: !!queueItem.key,
|
||||
order: queueItem.order
|
||||
});
|
||||
return; // Can't move up if already at the top
|
||||
}
|
||||
|
||||
try {
|
||||
// Find the item above this one
|
||||
const itemAbove = queueItems.find(item => item.order === queueItem.order - 1);
|
||||
debugLog('Item above:', itemAbove);
|
||||
|
||||
if (!itemAbove || !itemAbove.key) {
|
||||
debugLog('No item above found');
|
||||
showError('Cannot move item up');
|
||||
return;
|
||||
}
|
||||
|
||||
debugLog('Swapping orders:', {
|
||||
currentItem: { key: queueItem.key, order: queueItem.order },
|
||||
itemAbove: { key: itemAbove.key, order: itemAbove.order }
|
||||
});
|
||||
|
||||
// Swap the order values
|
||||
await Promise.all([
|
||||
queueService.updateQueueItem(controllerName, queueItem.key, { order: queueItem.order - 1 }),
|
||||
queueService.updateQueueItem(controllerName, itemAbove.key, { order: queueItem.order })
|
||||
]);
|
||||
|
||||
debugLog('Move up completed successfully');
|
||||
showSuccess('Song moved up in queue');
|
||||
} catch (error) {
|
||||
console.error('Failed to move song up:', error);
|
||||
showError('Failed to move song up');
|
||||
}
|
||||
}, [controllerName, queueItems, showSuccess, showError]);
|
||||
|
||||
const handleMoveDown = useCallback(async (queueItem: QueueItem) => {
|
||||
debugLog('handleMoveDown called with:', queueItem);
|
||||
debugLog('Current queueItems:', queueItems);
|
||||
debugLog('Controller name:', controllerName);
|
||||
|
||||
if (!controllerName || !queueItem.key || queueItem.order >= queueItems.length) {
|
||||
debugLog('Early return - conditions not met:', {
|
||||
controllerName: !!controllerName,
|
||||
queueItemKey: !!queueItem.key,
|
||||
order: queueItem.order,
|
||||
queueLength: queueItems.length
|
||||
});
|
||||
return; // Can't move down if already at the bottom
|
||||
}
|
||||
|
||||
try {
|
||||
// Find the item below this one
|
||||
const itemBelow = queueItems.find(item => item.order === queueItem.order + 1);
|
||||
debugLog('Item below:', itemBelow);
|
||||
|
||||
if (!itemBelow || !itemBelow.key) {
|
||||
debugLog('No item below found');
|
||||
showError('Cannot move item down');
|
||||
return;
|
||||
}
|
||||
|
||||
debugLog('Swapping orders:', {
|
||||
currentItem: { key: queueItem.key, order: queueItem.order },
|
||||
itemBelow: { key: itemBelow.key, order: itemBelow.order }
|
||||
});
|
||||
|
||||
// Swap the order values
|
||||
await Promise.all([
|
||||
queueService.updateQueueItem(controllerName, queueItem.key, { order: queueItem.order + 1 }),
|
||||
queueService.updateQueueItem(controllerName, itemBelow.key, { order: queueItem.order })
|
||||
]);
|
||||
|
||||
debugLog('Move down completed successfully');
|
||||
showSuccess('Song moved down in queue');
|
||||
} catch (error) {
|
||||
console.error('Failed to move song down:', error);
|
||||
showError('Failed to move song down');
|
||||
}
|
||||
}, [controllerName, queueItems, showSuccess, showError]);
|
||||
|
||||
const handleReorder = useCallback(async (oldIndex: number, newIndex: number) => {
|
||||
debugLog('handleReorder called with:', { oldIndex, newIndex });
|
||||
debugLog('Current queueItems:', queueItems);
|
||||
debugLog('Controller name:', controllerName);
|
||||
|
||||
if (!controllerName || oldIndex === newIndex) {
|
||||
debugLog('Early return - conditions not met:', {
|
||||
controllerName: !!controllerName,
|
||||
oldIndex,
|
||||
newIndex
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const itemToMove = queueItems[oldIndex];
|
||||
if (!itemToMove || !itemToMove.key) {
|
||||
debugLog('No item to move found');
|
||||
showError('Cannot reorder item');
|
||||
return;
|
||||
}
|
||||
|
||||
debugLog('Moving item:', {
|
||||
item: { key: itemToMove.key, order: itemToMove.order },
|
||||
fromIndex: oldIndex,
|
||||
toIndex: newIndex
|
||||
});
|
||||
|
||||
// Calculate the new order for the moved item
|
||||
const newOrder = newIndex + 1;
|
||||
|
||||
// Update all affected items' orders
|
||||
const updatePromises: Promise<void>[] = [];
|
||||
|
||||
if (oldIndex < newIndex) {
|
||||
// Moving down: shift items between oldIndex and newIndex up by 1
|
||||
for (let i = oldIndex + 1; i <= newIndex; i++) {
|
||||
const item = queueItems[i];
|
||||
if (item && item.key) {
|
||||
updatePromises.push(
|
||||
queueService.updateQueueItem(controllerName, item.key, { order: item.order - 1 })
|
||||
);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Moving up: shift items between newIndex and oldIndex down by 1
|
||||
for (let i = newIndex; i < oldIndex; i++) {
|
||||
const item = queueItems[i];
|
||||
if (item && item.key) {
|
||||
updatePromises.push(
|
||||
queueService.updateQueueItem(controllerName, item.key, { order: item.order + 1 })
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Update the moved item's order
|
||||
updatePromises.push(
|
||||
queueService.updateQueueItem(controllerName, itemToMove.key, { order: newOrder })
|
||||
);
|
||||
|
||||
await Promise.all(updatePromises);
|
||||
debugLog('Reorder completed successfully');
|
||||
showSuccess('Queue reordered successfully');
|
||||
} catch (error) {
|
||||
console.error('Failed to reorder queue:', error);
|
||||
showError('Failed to reorder queue');
|
||||
}
|
||||
}, [controllerName, queueItems, showSuccess, showError]);
|
||||
|
||||
return {
|
||||
queueItems,
|
||||
@ -248,8 +71,5 @@ export const useQueue = () => {
|
||||
canReorder,
|
||||
handleRemoveFromQueue,
|
||||
handleToggleFavorite,
|
||||
handleMoveUp,
|
||||
handleMoveDown,
|
||||
handleReorder,
|
||||
};
|
||||
};
|
||||
Loading…
Reference in New Issue
Block a user