import React, { createContext, useContext, useMemo, useRef } from 'react'; import { Text, Stack, Box, Flex, Divider } from '@mantine/core'; import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; import ChevronRightIcon from '@mui/icons-material/ChevronRight'; import { Tooltip } from '../../shared/Tooltip'; import { TooltipTip } from '../../shared/tooltip/TooltipContent'; import { createFilesToolStep, FilesToolStepProps } from './FilesToolStep'; import { createReviewToolStep, ReviewToolStepProps } from './ReviewToolStep'; interface ToolStepContextType { visibleStepCount: number; } const ToolStepContext = createContext(null); export interface ToolStepProps { title: string; isVisible?: boolean; isCollapsed?: boolean; onCollapsedClick?: () => void; children?: React.ReactNode; helpText?: string; showNumber?: boolean; _stepNumber?: number; // Internal prop set by ToolStepContainer _excludeFromCount?: boolean; // Internal prop to exclude from visible count calculation _noPadding?: boolean; // Internal prop to exclude from default left padding tooltip?: { content?: React.ReactNode; tips?: TooltipTip[]; header?: { title: string; logo?: React.ReactNode; }; }; } const renderTooltipTitle = ( title: string, tooltip: ToolStepProps['tooltip'], isCollapsed: boolean ) => { if (tooltip && !isCollapsed) { return ( e.stopPropagation()}> {title} gpp_maybe ); } return ( {title} ); }; const ToolStep = ({ title, isVisible = true, isCollapsed = false, onCollapsedClick, children, helpText, showNumber, _stepNumber, _noPadding, tooltip }: ToolStepProps) => { if (!isVisible) return null; const parent = useContext(ToolStepContext); // Auto-detect if we should show numbers based on sibling count const shouldShowNumber = useMemo(() => { if (showNumber !== undefined) return showNumber; return parent ? parent.visibleStepCount >= 3 : false; }, [showNumber, parent]); const stepNumber = _stepNumber; return (
{/* Chevron icon to collapse/expand the step */} {shouldShowNumber && ( {stepNumber} )} {renderTooltipTitle(title, tooltip, isCollapsed)} {isCollapsed ? ( ) : ( )} {!isCollapsed && ( {helpText && ( {helpText} )} {children} )}
); } // ToolStepFactory for creating numbered steps export function createToolSteps() { let stepNumber = 1; const steps: React.ReactElement[] = []; const create = ( title: string, props: Omit = {}, children?: React.ReactNode ): React.ReactElement => { const isVisible = props.isVisible !== false; const currentStepNumber = isVisible ? stepNumber++ : undefined; const step = React.createElement(ToolStep, { ...props, title, _stepNumber: currentStepNumber, children, key: `step-${title.toLowerCase().replace(/\s+/g, '-')}` }); steps.push(step); return step; }; const createFilesStep = (props: FilesToolStepProps): React.ReactElement => { return createFilesToolStep(create, props); }; const createReviewStep = (props: ReviewToolStepProps): React.ReactElement => { return createReviewToolStep(create, props); }; const getVisibleCount = () => { return steps.filter(step => { const props = step.props as ToolStepProps; const isVisible = props.isVisible !== false; const excludeFromCount = props._excludeFromCount === true; return isVisible && !excludeFromCount; }).length; }; return { create, createFilesStep, createReviewStep, getVisibleCount, steps }; } // Context provider wrapper for tools using the factory export function ToolStepProvider({ children }: { children: React.ReactNode }) { // Count visible steps from children that are ToolStep elements const visibleStepCount = useMemo(() => { let count = 0; React.Children.forEach(children, (child) => { if (React.isValidElement(child) && child.type === ToolStep) { const props = child.props as ToolStepProps; const isVisible = props.isVisible !== false; const excludeFromCount = props._excludeFromCount === true; if (isVisible && !excludeFromCount) count++; } }); return count; }, [children]); const contextValue = useMemo(() => ({ visibleStepCount }), [visibleStepCount]); return ( {children} ); } export type { FilesToolStepProps } from './FilesToolStep'; export type { ReviewToolStepProps } from './ReviewToolStep'; export default ToolStep;