import React, { useState, useEffect } from 'react';
import { useParams, useNavigate } from 'react-router-dom';
import axios from 'axios';
import {
Card,
CardHeader,
CardBody,
CardFooter,
Row,
Col,
Table,
Badge,
Button,
Spinner,
Alert,
Tabs,
Tab,
Modal
} from 'react-bootstrap';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import {
faEdit,
faTrash,
faWrench,
faInfoCircle,
faHistory,
faFileAlt,
faExclamationTriangle
} from '@fortawesome/free-solid-svg-icons';
import ServiceHistoryList from './ServiceHistoryList';
import DocumentList from './DocumentList';
const EquipmentDetails = () => {
const { propertyId, equipmentId } = useParams();
const navigate = useNavigate();
const [equipment, setEquipment] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
const [activeTab, setActiveTab] = useState('details');
const [showDeleteModal, setShowDeleteModal] = useState(false);
useEffect(() => {
const fetchEquipmentDetails = async () => {
try {
setLoading(true);
const response = await axios.get(`/api/v1/properties/${propertyId}/equipment/${equipmentId}`);
setEquipment(response.data.data);
setError(null);
} catch (err) {
setError(err.response?.data?.message || 'Failed to load equipment details');
} finally {
setLoading(false);
}
};
fetchEquipmentDetails();
}, [propertyId, equipmentId]);
const handleEdit = () => {
navigate(`/properties/${propertyId}/equipment/${equipmentId}/edit`);
};
const handleServiceRequest = () => {
navigate(`/properties/${propertyId}/equipment/${equipmentId}/service-request`);
};
const handleDelete = async () => {
try {
await axios.delete(`/api/v1/properties/${propertyId}/equipment/${equipmentId}`);
setShowDeleteModal(false);
navigate(`/properties/${propertyId}/equipment`);
} catch (err) {
setError(err.response?.data?.message || 'Failed to delete equipment');
setShowDeleteModal(false);
}
};
const renderStatusBadge = (status) => {
const statusMap = {
'operational': { variant: 'success', label: 'Operational' },
'needs_maintenance': { variant: 'warning', label: 'Needs Maintenance' },
'out_of_service': { variant: 'danger', label: 'Out of Service' }
};
const { variant, label } = statusMap[status] || { variant: 'secondary', label: status };
return {label} ;
};
if (loading) {
return (
Loading...
);
}
if (error) {
return (
{error}
);
}
if (!equipment) {
return (
Equipment not found
);
}
return (
{equipment.nickname || equipment.model.name}
Edit
setShowDeleteModal(true)}>
Delete
setActiveTab(k)}
className="mb-4"
>
Manufacturer
{equipment.model.manufacturerName}
Model
{equipment.model.name} ({equipment.model.modelNumber})
Category
{equipment.model.categoryName}
Serial Number
{equipment.serialNumber || 'N/A'}
Status
{renderStatusBadge(equipment.status)}
Location
{equipment.locationInProperty || 'N/A'}
Installation Date
{equipment.installationDate || 'N/A'}
Warranty Expiry
{equipment.warrantyExpiry || 'N/A'}
Purchase Date
{equipment.purchaseDate || 'N/A'}
Purchase Price
{equipment.purchasePrice ? `${equipment.purchasePrice}` : 'N/A'}
Seller
{equipment.sellerName || 'N/A'}
Last Serviced
{equipment.lastServicedDate || 'N/A'}
{equipment.notes && (
)}
{equipment.specifications && equipment.specifications.length > 0 && (
Specifications
Specification
Value
{equipment.specifications.map((spec) => (
{spec.specName}
{spec.specValue} {spec.specUnit}
))}
)}
navigate(`/properties/${propertyId}/equipment`)}
>
Back to Equipment List
Request Service
{/* Delete Confirmation Modal */}
setShowDeleteModal(false)}>
Confirm Deletion
Are you sure you want to delete this equipment?
This action cannot be undone and will remove all service history.
setShowDeleteModal(false)}>
Cancel
Delete Equipment
);
};
export default EquipmentDetails;