import React from 'react'; import { ClientOnly } from 'remix-utils/client-only'; import { classNames } from '~/shared/utils/classNames'; import { PROVIDER_LIST } from '~/shared/utils/constants'; import { ModelSelector } from '~/chat/components/chatBox/ModelSelector'; import { APIKeyManager } from './APIKeyManager'; import { LOCAL_PROVIDERS } from '~/settings/stores/settings'; import FilePreview from './FilePreview'; import { ScreenshotStateManager } from './ScreenshotStateManager'; import { SendButton } from './SendButton.client'; import { IconButton } from '~/shared/components/ui/IconButton'; import { toast } from 'react-toastify'; import { SpeechRecognitionButton } from '~/chat/components/chatBox/SpeechRecognition'; import { SupabaseConnection } from './SupabaseConnection'; import { ExpoQrModal } from '~/shared/workbench/components/ui/ExpoQrModal'; import styles from '~/chat/components/BaseChat.module.scss'; import type { ProviderInfo } from '~/shared/types/model'; import { ColorSchemeDialog } from '~/shared/components/ui/ColorSchemeDialog'; import type { DesignScheme } from '~/shared/types/design-scheme'; import type { ElementInfo } from '~/shared/workbench/components/ui/Inspector'; interface ChatBoxProps { isModelSettingsCollapsed: boolean; setIsModelSettingsCollapsed: (collapsed: boolean) => void; provider: any; providerList: any[]; modelList: any[]; apiKeys: Record; isModelLoading: string | undefined; onApiKeysChange: (providerName: string, apiKey: string) => void; uploadedFiles: File[]; imageDataList: string[]; textareaRef: React.RefObject | undefined; input: string; handlePaste: (e: React.ClipboardEvent) => void; TEXTAREA_MIN_HEIGHT: number; TEXTAREA_MAX_HEIGHT: number; isStreaming: boolean; handleSendMessage: (event: React.UIEvent, messageInput?: string) => void; isListening: boolean; startListening: () => void; stopListening: () => void; chatStarted: boolean; exportChat?: () => void; qrModalOpen: boolean; setQrModalOpen: (open: boolean) => void; handleFileUpload: () => void; setProvider?: ((provider: ProviderInfo) => void) | undefined; model?: string | undefined; setModel?: ((model: string) => void) | undefined; setUploadedFiles?: ((files: File[]) => void) | undefined; setImageDataList?: ((dataList: string[]) => void) | undefined; handleInputChange?: ((event: React.ChangeEvent) => void) | undefined; handleStop?: (() => void) | undefined; enhancingPrompt?: boolean | undefined; enhancePrompt?: (() => void) | undefined; chatMode?: 'discuss' | 'build'; setChatMode?: (mode: 'discuss' | 'build') => void; designScheme?: DesignScheme; setDesignScheme?: (scheme: DesignScheme) => void; selectedElement?: ElementInfo | null; setSelectedElement?: ((element: ElementInfo | null) => void) | undefined; } export const ChatBox: React.FC = (props) => { return (
{() => (
{(props.providerList || []).length > 0 && props.provider && (!LOCAL_PROVIDERS.includes(props.provider.name) || 'OpenAILike') && ( { props.onApiKeysChange(props.provider.name, key); }} /> )}
)}
{ props.setUploadedFiles?.(props.uploadedFiles.filter((_, i) => i !== index)); props.setImageDataList?.(props.imageDataList.filter((_, i) => i !== index)); }} /> {() => ( )} {props.selectedElement && (
{props?.selectedElement?.tagName} selected for inspection
)}