import React, { useEffect, useState } from "react"; import { useNavigate, useParams } from "react-router-dom"; import { Box, Typography, Button, Paper, Grid, CircularProgress, } from "@mui/material"; import ArrowBackIcon from "@mui/icons-material/ArrowBack"; import EditIcon from "@mui/icons-material/Edit"; import type { ResourceConfig } from "../types"; import { useResource } from "../context/useResource"; import { useAppContext } from "../context/AppContext"; import { DetailFieldRenderer, applyDisplayFormat } from "./fields"; interface ResourceDetailProps { resource: ResourceConfig; basePath: string; } export function ResourceDetail({ resource, basePath }: ResourceDetailProps) { const navigate = useNavigate(); const { id } = useParams(); const crud = useResource(resource.name); const { resources: allResources } = useAppContext(); const [data, setData] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { if (id) { setLoading(true); crud .get(id) .then(setData) .catch(() => navigate(`${basePath}/${resource.name}`)) .finally(() => setLoading(false)); } }, [id]); if (loading) { return ( ); } if (!data) { return ( Record not found ); } const visibleFields = resource.orderedFields.filter((f) => !f.hidden?.detail); return ( {applyDisplayFormat(data, resource.displayFormat)} {resource.operations.update && ( )} {visibleFields.map((field) => { let value = data[field.name]; let fmt = resource.displayFormat; if (field.fk && typeof value === "object") { const targetRes = allResources.find((r) => r.name === field.fk!.resource); fmt = targetRes!.displayFormat; } else if (field.refSchema && !field.fk && typeof value === "object") { fmt = field.inlineDisplayFormat ?? resource.displayFormat; } return ( ); })} ); }