import React, { useEffect } from 'react'; import { Resource, useResourceDefinition, useResourceDefinitionContext, } from 'react-admin'; import type { ResourceDefinition, ResourceProps } from 'react-admin'; import ListGuesser from '../list/ListGuesser.js'; import CreateGuesser from '../create/CreateGuesser.js'; import EditGuesser from '../edit/EditGuesser.js'; import ShowGuesser from '../show/ShowGuesser.js'; import Introspecter from '../introspection/Introspecter.js'; import type { IntrospectedResourceGuesserProps, ResourceGuesserProps, } from '../types.js'; export const IntrospectedResourceGuesser = ({ resource, schema, schemaAnalyzer, list = ListGuesser, edit = EditGuesser, create = CreateGuesser, show = ShowGuesser, ...props }: IntrospectedResourceGuesserProps) => { const { register } = useResourceDefinitionContext(); const registeredDefinition = useResourceDefinition({ resource }); let hasList = false; let hasEdit = false; let hasCreate = false; let hasShow = false; schema.operations?.forEach((operation) => { if (operation.type === 'list') { hasList = true; } if (operation.type === 'edit') { hasEdit = true; } if (operation.type === 'create') { hasCreate = true; } if (operation.type === 'show') { hasShow = true; } }); useEffect(() => { if ( registeredDefinition.hasList !== hasList || registeredDefinition.hasEdit !== hasEdit || registeredDefinition.hasCreate !== hasCreate || registeredDefinition.hasShow !== hasShow ) { register({ name: resource, icon: props.icon, options: props.options, recordRepresentation: props.recordRepresentation, hasList, hasEdit, hasCreate, hasShow, }); } }, [ register, resource, props.icon, props.options, props.recordRepresentation, hasList, hasEdit, hasCreate, hasShow, registeredDefinition, ]); return ( ); }; const ResourceGuesser = ({ name, ...props }: ResourceGuesserProps) => ( ); ResourceGuesser.raName = 'Resource'; ResourceGuesser.registerResource = ( props: ResourceProps, ): ResourceDefinition => ({ name: props.name, icon: props.icon, options: props.options, recordRepresentation: props.recordRepresentation, hasList: true, hasEdit: true, hasCreate: true, hasShow: true, }); export default ResourceGuesser;