import React from 'react'; import { Show, SimpleShowLayout, Tab, TabbedShowLayout, useResourceContext, } from 'react-admin'; import { useParams } from 'react-router-dom'; import type { Field, Resource } from '@api-platform/api-doc-parser'; import FieldGuesser from '../field/FieldGuesser.js'; import Introspecter from '../introspection/Introspecter.js'; import useMercureSubscription from '../mercure/useMercureSubscription.js'; import useDisplayOverrideCode from '../useDisplayOverrideCode.js'; import type { IntrospectedShowGuesserProps, ShowGuesserProps, } from '../types.js'; const getOverrideCode = (schema: Resource, fields: Field[]) => { let code = `If you want to override at least one field, create a ${schema.title}Show component with this content:\n`; code += `\n`; code += `import { ShowGuesser, FieldGuesser } from "@api-platform/admin";\n`; code += `\n`; code += `export const ${schema.title}Show = () => (\n`; code += ` \n`; fields.forEach((field) => { code += ` \n`; }); code += ` \n`; code += `);\n`; code += `\n`; code += `Then, update your main admin component:\n`; code += `\n`; code += `import { HydraAdmin, ResourceGuesser } from "@api-platform/admin";\n`; code += `import { ${schema.title}Show } from './${schema.title}Show';\n`; code += `\n`; code += `const App = () => (\n`; code += ` \n`; code += ` \n`; code += ` {/* ... */}\n`; code += ` \n`; code += `);\n`; return code; }; export const IntrospectedShowGuesser = ({ fields, readableFields, writableFields, schema, schemaAnalyzer, viewComponent, children, ...props }: IntrospectedShowGuesserProps) => { const { id: routeId } = useParams<'id'>(); const id = decodeURIComponent(routeId ?? ''); useMercureSubscription(props.resource, id); const displayOverrideCode = useDisplayOverrideCode(); let fieldChildren = children; if (!fieldChildren) { fieldChildren = readableFields.map((field) => ( )); displayOverrideCode(getOverrideCode(schema, readableFields)); } const hasTab = Array.isArray(fieldChildren) && fieldChildren.some( (child) => typeof child === 'object' && 'type' in child && child.type === Tab, ); const ShowLayout = hasTab ? TabbedShowLayout : SimpleShowLayout; return ( {fieldChildren} ); }; const ShowGuesser = (props: ShowGuesserProps) => { const resource = useResourceContext(props); if (!resource) { throw new Error('ShowGuesser must be used with a resource'); } return ( ); }; export default ShowGuesser;