import React, { useRef, useState, ReactNode } from 'react'; import { Box } from '@mui/material'; import { FormikProps, FormikValues } from 'formik'; import ToolOptions, { GetGroupsType } from '@components/options/ToolOptions'; import ToolInputAndResult from '@components/ToolInputAndResult'; import ToolInfo from '@components/ToolInfo'; import Separator from '@components/Separator'; import ToolExamples, { CardExampleType } from '@components/examples/ToolExamples'; import { ToolComponentProps } from '@tools/defineTool'; interface ToolContentPropsBase extends ToolComponentProps { // Input/Output components inputComponent: ReactNode; resultComponent: ReactNode; // Tool options initialValues: T; getGroups: GetGroupsType | null; // Computation function compute: (optionsValues: T, input: I) => void; // Tool info (optional) toolInfo?: { title: string; description: string; }; // Input value to pass to the compute function input: I; // Validation schema (optional) validationSchema?: any; } interface ToolContentPropsWithExamples extends ToolContentPropsBase { exampleCards: CardExampleType[]; setInput: React.Dispatch>; } interface ToolContentPropsWithoutExamples extends ToolContentPropsBase { exampleCards?: never; setInput?: never; } type ToolContentProps = | ToolContentPropsWithExamples | ToolContentPropsWithoutExamples; export default function ToolContent({ title, inputComponent, resultComponent, initialValues, getGroups, compute, toolInfo, exampleCards, input, setInput, validationSchema }: ToolContentProps) { const formRef = useRef>(null); return ( {toolInfo && ( )} {exampleCards && exampleCards.length > 0 && ( <> )} ); }