/* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable @typescript-eslint/no-explicit-any */ import React, { useState, useEffect } from 'react'; import { mapManifestColumns, getManifestColumnMapping, updateManifestColumnMapping, ManifestColumnMappingData, ManifestColumnMappingResponse } from '../../../../Api/ShipmentApi'; interface ManifestColumnMappingProps { shipmentId: number | string; onMappingSuccess?: (response: ManifestColumnMappingResponse) => void; onMappingError?: (error: string) => void; } // Common field mappings that are typically used const COMMON_FIELDS = [ 'delybell_order_id', 'receiver_name', 'receiver_phone', 'receiver_address', 'receiver_city', 'receiver_state', 'receiver_country', 'receiver_postal_code', 'package_weight', 'package_dimensions', 'shipping_method', 'tracking_number', 'order_date', 'delivery_date', 'special_instructions', 'customer_reference', 'product_description', 'quantity', 'unit_price', 'total_amount' ]; const ManifestColumnMapping: React.FC = ({ shipmentId, onMappingSuccess, onMappingError }) => { const [mappings, setMappings] = useState<{ [key: string]: number }>({}); const [isLoading, setIsLoading] = useState(false); const [isSaving, setIsSaving] = useState(false); const [message, setMessage] = useState(''); const [messageType, setMessageType] = useState<'success' | 'error' | 'info'>('info'); const [availableFields, setAvailableFields] = useState([]); useEffect(() => { loadExistingMapping(); setAvailableFields(COMMON_FIELDS); // eslint-disable-next-line react-hooks/exhaustive-deps }, [shipmentId]); const loadExistingMapping = async () => { setIsLoading(true); try { const result = await getManifestColumnMapping(shipmentId); if (result.success && result.data) { // Convert array format to object format for easier editing const mappingObject: { [key: string]: number | any } = {}; if (Array.isArray(result.data.manifest_columns)) { result.data.manifest_columns.forEach((mapping: any) => { const [fieldName, columnIndex] = Object.entries(mapping)[0]; mappingObject[fieldName] = columnIndex; }); } setMappings(mappingObject); setMessage('Existing mapping loaded successfully'); setMessageType('success'); } else { setMessage('No existing mapping found. Please create a new mapping.'); setMessageType('info'); } } catch (error: unknown) { setMessage('Failed to load existing mapping'); setMessageType('error'); onMappingError?.('Failed to load existing mapping'); } finally { setIsLoading(false); } }; const handleFieldChange = (fieldName: string, columnIndex: string) => { const index = parseInt(columnIndex); if (isNaN(index) || index < 0) { return; } setMappings(prev => ({ ...prev, [fieldName]: index })); }; const addNewField = () => { const newField = `field_${Object.keys(mappings).length + 1}`; setMappings(prev => ({ ...prev, [newField]: 0 })); setAvailableFields(prev => [...prev, newField]); }; const removeField = (fieldName: string) => { setMappings(prev => { const newMappings = { ...prev }; delete newMappings[fieldName]; return newMappings; }); }; const saveMapping = async () => { if (Object.keys(mappings).length === 0) { setMessage('Please add at least one field mapping'); setMessageType('error'); return; } setIsSaving(true); try { // Convert object format to array format for API const mappingData: ManifestColumnMappingData = { shipment_id: shipmentId, manifest_columns: Object.entries(mappings).map(([fieldName, columnIndex]) => ({ [fieldName]: columnIndex })) }; const result = await mapManifestColumns(mappingData); if (result.success) { setMessage('Column mapping saved successfully!'); setMessageType('success'); onMappingSuccess?.(result); } else { setMessage(`Failed to save mapping: ${result.error}`); setMessageType('error'); onMappingError?.(result.error || 'Failed to save mapping'); } } catch (error) { const errorMessage = error instanceof Error ? error.message : 'An unexpected error occurred'; setMessage(`Error: ${errorMessage}`); setMessageType('error'); onMappingError?.(errorMessage); } finally { setIsSaving(false); } }; const updateMapping = async () => { if (Object.keys(mappings).length === 0) { setMessage('Please add at least one field mapping'); setMessageType('error'); return; } setIsSaving(true); try { const mappingData: ManifestColumnMappingData = { shipment_id: shipmentId, manifest_columns: Object.entries(mappings).map(([fieldName, columnIndex]) => ({ [fieldName]: columnIndex })) }; const result = await updateManifestColumnMapping(mappingData); if (result.success) { setMessage('Column mapping updated successfully!'); setMessageType('success'); onMappingSuccess?.(result); } else { setMessage(`Failed to update mapping: ${result.error}`); setMessageType('error'); onMappingError?.(result.error || 'Failed to update mapping'); } } catch (error) { const errorMessage = error instanceof Error ? error.message : 'An unexpected error occurred'; setMessage(`Error: ${errorMessage}`); setMessageType('error'); onMappingError?.(errorMessage); } finally { setIsSaving(false); } }; const resetMapping = () => { setMappings({}); setMessage('Mapping reset. Please add new field mappings.'); setMessageType('info'); }; const getMessageClass = () => { switch (messageType) { case 'success': return 'alert-success'; case 'error': return 'alert-danger'; case 'info': return 'alert-info'; default: return 'alert-info'; } }; return (
Manifest Column Mapping
Map Excel columns to system fields for shipment {shipmentId}
{/* Status Message */} {message && (
{message}
)} {/* Instructions */}
Instructions: Map each system field to the corresponding column index in your Excel file. Column indices start from 0 (first column = 0, second column = 1, etc.).
{/* Field Mappings */}
Field Mappings
{Object.keys(mappings).length === 0 ? (

No field mappings added yet.

{`Click "Add Field" to start mapping your Excel columns.`}

) : (
{Object.entries(mappings).map(([fieldName, columnIndex]) => ( ))}
System Field Excel Column Index Actions
handleFieldChange(fieldName, e.target.value)} disabled={isLoading || isSaving} placeholder="Column index (0, 1, 2...)" />
)}
{/* Action Buttons */}
{/* JSON Preview */} {Object.keys(mappings).length > 0 && (
API Payload Preview:
                
                  {JSON.stringify({
                    shipment_id: shipmentId,
                    manifest_columns: Object.entries(mappings).map(([fieldName, columnIndex]) => ({
                      [fieldName]: columnIndex
                    }))
                  }, null, 2)}
                
              
)}
); }; export default ManifestColumnMapping;