import { useParams } from 'common' import { Loader2, SquareCode } from 'lucide-react' import { useRouter } from 'next/router' import { useContext, useEffect, useState } from 'react' import { Button } from 'ui' import { QueryEditor, type ExplorerQueryModel } from './QueryEditor' import { type QueryResult } from './types' import { toQuerySourceBinding } from '@/data/query-sources/query-source-registry' import { explorerQueryState, useExplorerQueryStateSnapshot } from '@/state/explorer-query' import { createTabId, TabsStateContext } from '@/state/tabs' const QUERY_ROW_LIMIT = 100 /** Query-tab lifecycle adapter around the shared QueryEditor. */ export const QueryTab = () => { const { id, ref } = useParams() const router = useRouter() const tabs = useContext(TabsStateContext) const querySnap = useExplorerQueryStateSnapshot() const [restoredQueryKey, setRestoredQueryKey] = useState() const stateDraft = id ? querySnap.drafts[id] : undefined const draft = stateDraft?.projectRef === ref ? stateDraft : undefined const result = draft && id ? querySnap.results[id] : undefined const queryKey = id && ref ? `${ref}:${id}` : undefined useEffect(() => { if (!id || !ref) return const restored = explorerQueryState.restoreDraft({ id, projectRef: ref }) const restoredDraft = explorerQueryState.drafts[id] if (restored && restoredDraft) { tabs.addTab({ id: createTabId('query', { id }), type: 'query', label: restoredDraft.name, metadata: { queryId: id }, isPreview: false, }) } setRestoredQueryKey(`${ref}:${id}`) }, [id, ref, tabs]) if (!queryKey || restoredQueryKey !== queryKey) { return (
) } if (!id || !draft) { return (

Query draft not found

This local draft may have been closed or cleared from this browser.

) } const handleResultChange = (nextResult: QueryResult) => { explorerQueryState.setResult({ id, result: { ...nextResult, executedAt: Date.now() }, }) } const query: ExplorerQueryModel = draft._tag === 'logs' ? { ...toQuerySourceBinding(draft), uncheckedSql: draft.uncheckedSql } : { ...toQuerySourceBinding(draft), uncheckedSql: draft.uncheckedSql, rowLimit: QUERY_ROW_LIMIT, } return ( { const name = value.trim() || 'Untitled query' explorerQueryState.updateDraft({ id, name }) tabs.updateTab(createTabId('query', { id }), { label: name }) }} onSqlChange={(sql) => explorerQueryState.updateDraft({ id, sql })} onSourceChange={(source) => explorerQueryState.updateDraft({ id, source })} onResultChange={handleResultChange} /> ) }