import * as React from 'react'; import { ReactNode } from 'react'; import { useCreateController, CreateControllerProps, CreateControllerResult, } from './useCreateController'; import { CreateContextProvider } from './CreateContextProvider'; import { Identifier, RaRecord } from '../../types'; import { OptionalResourceContextProvider } from '../../core'; import { useIsAuthPending } from '../../auth'; /** * Call useCreateController and put the value in a CreateContext * * Base class for components, without UI. * * Accepts any props accepted by useCreateController: * - id: The record identifier * - resource: The resource * * @example // Custom edit layout * * const PostCreate = () => ( * * * * * ... * * * * Create instructions... * * *
* Post related links... *
*
* ); */ export const CreateBase = < RecordType extends Omit = any, ResultRecordType extends RaRecord = RecordType & { id: Identifier }, MutationOptionsError = Error, >({ children, render, loading, authLoading = loading, ...props }: CreateBaseProps) => { const controllerProps = useCreateController< RecordType, MutationOptionsError, ResultRecordType >(props); const isAuthPending = useIsAuthPending({ resource: controllerProps.resource, action: 'create', }); if (!render && !children) { throw new Error( ' requires either a `render` prop or `children` prop' ); } const showAuthLoading = isAuthPending && !props.disableAuthentication && authLoading !== false && authLoading !== undefined; return ( // We pass props.resource here as we don't need to create a new ResourceContext if the props is not provided {showAuthLoading ? authLoading : render ? render(controllerProps) : children} ); }; export interface CreateBaseProps< RecordType extends Omit = any, ResultRecordType extends RaRecord = RecordType & { id: Identifier }, MutationOptionsError = Error, > extends CreateControllerProps< RecordType, MutationOptionsError, ResultRecordType > { children?: ReactNode; render?: (props: CreateControllerResult) => ReactNode; authLoading?: ReactNode; /** * @deprecated use authLoading instead */ loading?: ReactNode; }