import React, { Children, isValidElement, cloneElement, type ReactNode, type ComponentProps, } from 'react'; import { Modal, ModalBackdrop, ModalContent, ModalHeader, ModalCloseButton, ModalBody, } from '../modal'; import { X } from 'lucide-react-native'; import { Pressable, Text, View, TextInput, ScrollView } from 'react-native'; // Context const ModelSelectorContext = React.createContext<{ open: boolean; onOpenChange: (open: boolean) => void; } | null>(null); const useModelSelector = () => { const ctx = React.useContext(ModelSelectorContext); if (!ctx) throw new Error( 'ModelSelector sub-components must be used inside ' ); return ctx; }; // ───────────────────────────────────────────────────────────── // Root // ───────────────────────────────────────────────────────────── export type ModelSelectorProps = { open: boolean; onOpenChange: (open: boolean) => void; size?: 'xs' | 'sm' | 'md' | 'lg' | 'full'; children: ReactNode; }; export const ModelSelector = ({ open, onOpenChange, size = 'md', children, }: ModelSelectorProps) => { const childrenArray = Children.toArray(children); const triggerChildren: ReactNode[] = []; let contentElement: React.ReactElement | null = null; childrenArray.forEach((child) => { if (isValidElement(child) && child.type === ModelSelectorContent) { contentElement = child; } else { triggerChildren.push(child); } }); return ( {triggerChildren} onOpenChange(false)} size={size}> {contentElement} ); }; // ───────────────────────────────────────────────────────────── // Trigger (asChild support) // ───────────────────────────────────────────────────────────── export type ModelSelectorTriggerProps = { asChild?: boolean; } & ComponentProps; export const ModelSelectorTrigger = ({ asChild = false, className, children, onPress: userOnPress, ...props }: ModelSelectorTriggerProps) => { const { onOpenChange } = useModelSelector(); const handlePress = () => { onOpenChange(true); userOnPress?.(); }; if (asChild && isValidElement(children)) { return cloneElement(children, { ...props, onPress: handlePress, className: `${children.props.className || ''} ${className || ''}`, } as any); } return ( {children} ); }; // ───────────────────────────────────────────────────────────── // Content — NOW passes size to ModalContent (this fixes the crash) // ───────────────────────────────────────────────────────────── export type ModelSelectorContentProps = ComponentProps & { title?: ReactNode; size?: 'xs' | 'sm' | 'md' | 'lg' | 'full'; // ← added }; export const ModelSelectorContent = ({ title = 'Model Selector', children, className, size, // ← receive from root ...props }: ModelSelectorContentProps) => ( {title} {children} ); // Rest of the components (unchanged) export const ModelSelectorInput = ({ className, ...props }: ComponentProps) => ( ); export const ModelSelectorList = ({ className, ...props }: ComponentProps) => ( ); export const ModelSelectorEmpty = ({ className, ...props }: ComponentProps) => ( No models found. ); export const ModelSelectorGroup = ({ heading, children, className, ...props }: ComponentProps & { heading?: string }) => ( {heading && ( {heading} )} {children} ); export const ModelSelectorItem = ({ isSelected = false, children, className, ...props }: ComponentProps & { isSelected?: boolean }) => { console.log(children); return ( {children} ); }; export const ModelSelectorShortcut = ({ className, ...props }: ComponentProps) => ( ); export const ModelSelectorSeparator = ({ className, }: { className?: string; }) => ; export const ModelSelectorLogo = ({ provider }: { provider: string }) => ( {provider.slice(0, 2).toUpperCase()} ); export const ModelSelectorLogoGroup = ({ children, className, }: { children: ReactNode; className?: string; }) => ( {children} ); export const ModelSelectorName = ({ children, className, }: { children: ReactNode; className?: string; }) => ( {children} );