import { useParams } from 'common' import { useEffect, useState } from 'react' import { toast } from 'sonner' import { AiIconAnimation, Button, Dialog, DialogContent, DialogFooter, DialogHeader, DialogSection, DialogSectionSeparator, DialogTitle, Input, Label, } from 'ui' import { subscriptionHasHipaaAddon } from '@/components/interfaces/Billing/Subscription/Subscription.utils' import { generateSnippetTitle } from '@/components/interfaces/SQLEditor/SQLEditor.constants' import { ButtonTooltip } from '@/components/ui/ButtonTooltip' import { useCheckOpenAIKeyQuery } from '@/data/ai/check-api-key-query' import { useSqlTitleGenerateMutation } from '@/data/ai/sql-title-mutation' import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query' import { useOrgSubscriptionQuery } from '@/data/subscriptions/org-subscription-query' import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' interface SaveSnippetDialogProps { open: boolean sql: string onOpenChange: (open: boolean) => void onSave: (name: string) => void } export const SaveSnippetDialog = ({ open, sql, onOpenChange, onSave }: SaveSnippetDialogProps) => { const { ref } = useParams() const { data: organization } = useSelectedOrganizationQuery() const { data: subscription } = useOrgSubscriptionQuery( { orgSlug: organization?.slug }, { enabled: open } ) const { data: projectSettings } = useProjectSettingsV2Query({ projectRef: ref }) const { data: check } = useCheckOpenAIKeyQuery() const [name, setName] = useState(generateSnippetTitle()) const isApiKeySet = !!check?.hasKey const hasHipaaAddon = subscriptionHasHipaaAddon(subscription) && projectSettings?.is_sensitive const { mutate: generateTitle, isPending: isGenerating } = useSqlTitleGenerateMutation({ onSuccess: ({ title }) => setName(title), onError: (error) => toast.error(`Failed to generate title: ${error.message}`), }) // Reset the name each time the dialog opens useEffect(() => { if (open) setName(generateSnippetTitle()) }, [open]) const handleSave = () => { const trimmed = name.trim() if (!trimmed) return onSave(trimmed) onOpenChange(false) } return ( Save snippet
setName(e.target.value)} onKeyDown={(e) => { if (e.key === 'Enter') handleSave() }} />
{!hasHipaaAddon && (
generateTitle({ sql })} tooltip={{ content: { side: 'bottom', text: isApiKeySet ? undefined : 'Add your "OPENAI_API_KEY" to your environment variables to use this feature.', }, }} >
Generate with AI
)}
) }