import { FloatingFocusManager, FloatingOverlay, FloatingPortal, useClick, useDismiss, useFloating, useInteractions, useRole, } from '@floating-ui/react' import { useAtom, useSetAtom } from 'jotai' import { useState } from 'react' import { clearItemSelectionActionAtom, closeMoveConfirmationAtom, type MoveItemsResult, moveConfirmationAtom, moveSelectedItemsAtom, } from '@/state/atoms' export function MoveConfirmationPopup() { const [confirmationState] = useAtom(moveConfirmationAtom) const closeConfirmation = useSetAtom(closeMoveConfirmationAtom) const moveItems = useSetAtom(moveSelectedItemsAtom) const clearSelection = useSetAtom(clearItemSelectionActionAtom) const [isMoving, setIsMoving] = useState(false) const [moveResult, setMoveResult] = useState(null) const { refs, context } = useFloating({ open: confirmationState.isOpen, onOpenChange: open => { if (!open && !isMoving) { closeConfirmation() setMoveResult(null) } }, }) const click = useClick(context) const dismiss = useDismiss(context, { outsidePressEvent: 'mousedown', escapeKey: !isMoving, }) const role = useRole(context) const { getFloatingProps } = useInteractions([click, dismiss, role]) if (!confirmationState.isOpen) return null const { selectedItems, sourceCharacter, targetCharacter } = confirmationState const handleConfirm = async () => { setIsMoving(true) try { const result = await moveItems() setMoveResult(result) if (result.failedCount === 0) { clearSelection() setTimeout(() => { closeConfirmation() setMoveResult(null) }, 1500) } } catch (_error) { // Error handled in UI } finally { setIsMoving(false) } } const handleCancel = () => { if (!isMoving) { closeConfirmation() } } const renderItemPreview = () => { const itemsArray = Array.from(selectedItems.values()) const totalUniqueItems = itemsArray.length const totalQuantity = itemsArray.reduce((sum, { count }) => sum + count, 0) if (totalUniqueItems > 5) { return (

Moving {totalUniqueItems} different items

Total quantity: {totalQuantity.toLocaleString()}

) } return (
{itemsArray.map(({ item, count }) => (
{item.item_name} {item.item_name}
×{count.toLocaleString()}
))}
) } return (

Confirm Item Movement

From: {sourceCharacter?.name || 'Unknown'}
To: {targetCharacter?.name || 'Unknown'}
{renderItemPreview()}
{moveResult && (
0 ? 'bg-yellow-50' : 'bg-green-50'}`} >

{moveResult.failedCount === 0 ? `Successfully moved ${moveResult.successCount} items!` : `Moved ${moveResult.successCount} of ${moveResult.totalItems} items`}

{moveResult.errors.length > 0 && (
{moveResult.errors.slice(0, 3).map(error => (

{error.error}

))} {moveResult.errors.length > 3 && (

...and {moveResult.errors.length - 3} more errors

)}
)}
)}
) }