import { useEffect, useMemo, useState } from 'react'; import { Button, Group, Modal, Select, Stack, Textarea } from '@mantine/core'; import { useMutation, useQuery } from '@tanstack/react-query'; import { api } from '@/services/api'; import { useToast } from '@/hooks/use-toast'; import type { WarehouseInventoryItem } from '@/types/warehouse'; import { extractErrorMessage } from './options'; interface MoveInventoryModalProps { opened: boolean; onClose: () => void; item: WarehouseInventoryItem | null; } export function MoveInventoryModal({ opened, onClose, item }: MoveInventoryModalProps) { const { toast } = useToast(); const moveMutation = useMutation(api.warehouses.move.mutationOptions()); const [warehouseId, setWarehouseId] = useState(''); const [yardId, setYardId] = useState(''); const [zoneId, setZoneId] = useState(''); const [remarks, setRemarks] = useState(''); useEffect(() => { if (opened) { setWarehouseId(''); setYardId(''); setZoneId(''); setRemarks(''); } }, [opened]); const warehousesQuery = useQuery( api.warehouses.list.queryOptions({ input: { filter: { status: 'ACTIVE' } } }), ); const yardsQuery = useQuery( api.warehouses.listYards.queryOptions({ input: { warehouseId }, enabled: Boolean(warehouseId), }), ); const zonesQuery = useQuery( api.warehouses.listZones.queryOptions({ input: { yardId }, enabled: Boolean(yardId), }), ); const warehouseOptions = useMemo( () => (warehousesQuery.data ?? []).map((w) => ({ value: w.id, label: `${w.name} (${w.code})` })), [warehousesQuery.data], ); const yardOptions = useMemo( () => (yardsQuery.data ?? []).filter((y) => y.status === 'ACTIVE').map((y) => ({ value: y.id, label: `${y.name} (${y.code})` })), [yardsQuery.data], ); const zoneOptions = useMemo( () => (zonesQuery.data ?? []).filter((z) => z.status === 'ACTIVE').map((z) => ({ value: z.id, label: `${z.name} (${z.code})` })), [zonesQuery.data], ); const handleSubmit = async () => { if (!item) return; if (!warehouseId || !yardId || !zoneId) { toast({ variant: 'destructive', title: 'Select destination warehouse, yard and zone' }); return; } try { await moveMutation.mutateAsync({ id: item.id, payload: { warehouseId, yardId, zoneId, remarks: remarks.trim() || undefined }, }); toast({ title: 'Inventory moved' }); onClose(); } catch (error) { toast({ variant: 'destructive', title: 'Move failed', description: extractErrorMessage(error) }); } }; return ( { setYardId(v ?? ''); setZoneId(''); }} />