import type { InventoryItemDetailDto } from "@mrp/shared/dist/inventory/types.js"; import { permissions } from "@mrp/shared"; import { useEffect, useState } from "react"; import { Link, useParams } from "react-router-dom"; import { useAuth } from "../../auth/AuthProvider"; import { api, ApiError } from "../../lib/api"; import { InventoryStatusBadge } from "./InventoryStatusBadge"; import { InventoryTypeBadge } from "./InventoryTypeBadge"; export function InventoryDetailPage() { const { token, user } = useAuth(); const { itemId } = useParams(); const [item, setItem] = useState(null); const [status, setStatus] = useState("Loading inventory item..."); const canManage = user?.permissions.includes(permissions.inventoryWrite) ?? false; useEffect(() => { if (!token || !itemId) { return; } api .getInventoryItem(token, itemId) .then((nextItem) => { setItem(nextItem); setStatus("Inventory item loaded."); }) .catch((error: unknown) => { const message = error instanceof ApiError ? error.message : "Unable to load inventory item."; setStatus(message); }); }, [itemId, token]); if (!item) { return
{status}
; } return (

Inventory Detail

{item.sku}

{item.name}

Last updated {new Date(item.updatedAt).toLocaleString()}.

Back to items {canManage ? ( Edit item ) : null}

Item Definition

Description
{item.description || "No description provided."}
Unit of measure
{item.unitOfMeasure}
Default cost
{item.defaultCost == null ? "Not set" : `$${item.defaultCost.toFixed(2)}`}
Flags
{item.isSellable ? "Sellable" : "Not sellable"} / {item.isPurchasable ? "Purchasable" : "Not purchasable"}

Internal Notes

{item.notes || "No internal notes recorded for this item yet."}

Created {new Date(item.createdAt).toLocaleDateString()}

Bill Of Materials

Component structure

{item.bomLines.length === 0 ? (
No BOM lines are defined for this item yet.
) : (
{item.bomLines.map((line) => ( ))}
Position Component Quantity UOM Notes
{line.position}
{line.componentSku}
{line.componentName}
{line.quantity} {line.unitOfMeasure} {line.notes || "—"}
)}
); }