import { useChat } from 'ai/react' import { useEffect, useState } from 'react' import { Markdown } from 'components/interfaces/Markdown' import { onErrorChat } from 'components/ui/AIAssistantPanel/AIAssistant.utils' import { useSendEventMutation } from 'data/telemetry/send-event-mutation' import { BASE_PATH } from 'lib/constants' import { AiIconAnimation, Button, Label_Shadcn_, Textarea } from 'ui' interface SupabaseService { name: 'Auth' | 'Storage' | 'Database' | 'Edge Function' | 'Cron' | 'Queues' | 'Vector' reason: string } interface SchemaGeneratorProps { step: 'initial' | 'second' onSqlGenerated: (sql: string) => void onReset?: () => void onServicesUpdated: (services: SupabaseService[]) => void onTitleUpdated: (title: string) => void isOneOff?: boolean } export const SchemaGenerator = ({ step, onSqlGenerated, onServicesUpdated, onTitleUpdated, onReset, isOneOff = false, }: SchemaGeneratorProps) => { const [input, setInput] = useState('') const [hasSql, setHasSql] = useState(false) const [promptIntendSent, setPromptIntendSent] = useState(false) const { mutate: sendEvent } = useSendEventMutation() const { messages, setMessages, handleInputChange, append, isLoading: isMessagesLoading, } = useChat({ api: `${BASE_PATH}/api/ai/onboarding/design`, id: 'schema-generator', maxSteps: 7, onError: onErrorChat, onFinish: () => { setInput('') }, async onToolCall({ toolCall }) { if (toolCall.toolName === 'executeSql') { try { const sql = (toolCall.args as { sql: string }).sql setHasSql(true) onSqlGenerated(sql) return { success: true, message: 'Database successfully updated. Respond with next steps.', } } catch (error) { console.error('Failed to execute SQL:', error) return { success: false, error: `SQL execution failed: ${error instanceof Error ? error.message : String(error)}`, } } } if (toolCall.toolName === 'reset') { try { setHasSql(false) onSqlGenerated('') if (onReset) { onReset() } return { success: true, message: 'Database successfully reset', } } catch (error) { console.error('Failed to reset the database', error) return { success: false, error: `Resetting the database failed: ${error instanceof Error ? error.message : String(error)}`, } } } if (toolCall.toolName === 'setServices') { const newServices = (toolCall.args as { services: SupabaseService[] }).services onServicesUpdated(newServices) return 'Services updated successfully' } if (toolCall.toolName === 'setTitle') { const newTitle = (toolCall.args as { title: string }).title onTitleUpdated(newTitle) return 'Title updated successfully' } }, }) useEffect(() => { if (isOneOff) { setMessages([]) setInput('') } }, [isOneOff, setMessages, setInput]) return (