Fix drag-and-drop multiple reorders and wheel lights pattern

- Allow multiple prize reorders before saving by using current displayed order
- Simplify lights pattern calculation using distance-based logic
- Fixes: drag only worked once, lights appeared to go through wheel
This commit is contained in:
c0mrade
2026-02-04 00:22:46 +03:00
parent b6561f32b3
commit 84c6d265cf
2 changed files with 15 additions and 11 deletions

View File

@@ -62,13 +62,10 @@ const FortuneWheel = memo(function FortuneWheel({
const numLights = isSpinning ? 3 : 4; // 3 lights when spinning, 4 when idle const numLights = isSpinning ? 3 : 4; // 3 lights when spinning, 4 when idle
return Array.from({ length: 20 }, (_, i) => { return Array.from({ length: 20 }, (_, i) => {
// Check if this light index is within the active range // Calculate distance from current lightPhase
for (let j = 0; j < numLights; j++) { const distance = (i - lightPhase + 20) % 20;
if (i === (lightPhase + j) % 20) { // Light is on if within range [0, numLights)
return true; return distance < numLights;
}
}
return false;
}); });
}, [isSpinning, lightPhase]); }, [isSpinning, lightPhase]);

View File

@@ -427,17 +427,24 @@ export default function AdminWheel() {
onTelegramDragEnd(); onTelegramDragEnd();
const { active, over } = event; const { active, over } = event;
if (over && active.id !== over.id && config) { if (over && active.id !== over.id && config) {
const oldIndex = config.prizes.findIndex((p) => p.id === active.id); // Use current displayed order (either local or from config)
const newIndex = config.prizes.findIndex((p) => p.id === over.id); const currentPrizes = localPrizeOrder
? localPrizeOrder
.map((id) => config.prizes.find((p) => p.id === id))
.filter((p): p is WheelPrizeAdmin => p !== undefined)
: config.prizes;
const oldIndex = currentPrizes.findIndex((p) => p.id === active.id);
const newIndex = currentPrizes.findIndex((p) => p.id === over.id);
if (oldIndex !== -1 && newIndex !== -1) { if (oldIndex !== -1 && newIndex !== -1) {
const newOrder = arrayMove(config.prizes, oldIndex, newIndex); const newOrder = arrayMove(currentPrizes, oldIndex, newIndex);
// Save order locally, don't trigger mutation immediately // Save order locally, don't trigger mutation immediately
setLocalPrizeOrder(newOrder.map((p) => p.id)); setLocalPrizeOrder(newOrder.map((p) => p.id));
setHasUnsavedOrder(true); setHasUnsavedOrder(true);
} }
} }
}, },
[config, onTelegramDragEnd], [config, localPrizeOrder, onTelegramDragEnd],
); );
// Save prize order // Save prize order