// @ts-nocheck import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' import { partition } from 'lodash' import { Table2 } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' import { toast } from 'sonner' import { Badge, Button, Card, CardContent, CardHeader, CardTitle, cn, SQL_ICON, Tabs_Shadcn_, TabsContent_Shadcn_, TabsList_Shadcn_, TabsTrigger_Shadcn_, } from 'ui' import { useEditorType } from '../editors/EditorsLayout.hooks' import { ActionCard } from './ActionCard' import { RecentItems } from './RecentItems' import { SQL_TEMPLATES } from '@/components/interfaces/SQLEditor/SQLEditor.queries' import { createSqlSnippetSkeletonV2 } from '@/components/interfaces/SQLEditor/SQLEditor.utils' import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' import { useQuerySchemaState } from '@/hooks/misc/useSchemaQueryState' import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' import { useIsProtectedSchema } from '@/hooks/useProtectedSchemas' import { useProfile } from '@/lib/profile' import { useImpersonatedAAL, useImpersonatedExternalAuth, useImpersonatedUser, useIsImpersonatingAnon, useRoleImpersonationStateSnapshot, } from '@/state/role-impersonation-state' import { useSqlEditorV2StateSnapshot } from '@/state/sql-editor-v2' import { useTableEditorStateSnapshot } from '@/state/table-editor' import { createTabId, useTabsStateSnapshot } from '@/state/tabs' import { type ResponseError } from '@/types' export function NewTab() { const router = useRouter() const { ref } = useParams() const editor = useEditorType() const { profile } = useProfile() const { data: org } = useSelectedOrganizationQuery() const { data: project } = useSelectedProjectQuery() const { selectedSchema } = useQuerySchemaState() const { isSchemaLocked } = useIsProtectedSchema({ schema: selectedSchema }) const snap = useTableEditorStateSnapshot() const snapV2 = useSqlEditorV2StateSnapshot() const tabs = useTabsStateSnapshot() const [templates] = partition(SQL_TEMPLATES, { type: 'template' }) const [quickstarts] = partition(SQL_TEMPLATES, { type: 'quickstart' }) const roleState = useRoleImpersonationStateSnapshot() const impersonatingAnon = useIsImpersonatingAnon() const impersonatedUser = useImpersonatedUser() const impersonatedExternalUser = useImpersonatedExternalAuth() const impersonatedAAL = useImpersonatedAAL() const { mutate: sendEvent } = useSendEventMutation() const { can: canCreateSQLSnippet } = useAsyncCheckPermissions( PermissionAction.CREATE, 'user_content', { resource: { type: 'sql', owner_id: profile?.id }, subject: { id: profile?.id }, } ) const tableEditorActions = isSchemaLocked ? [] : [ { icon: , title: 'Create a table', description: 'Design and create a new database table', bgColor: 'bg-blue-500', isBeta: false, onClick: () => snap.onAddTable(), }, ] const sqlEditorActions = [ { icon: , title: 'New SQL Snippet', description: 'Execute SQL queries', bgColor: 'bg-green-500', isBeta: false, onClick: () => router.push(`/project/${ref}/sql/new`), }, ] const actions = editor === 'sql' ? sqlEditorActions : tableEditorActions const handleNewQuery = async (sql: string, name: string) => { if (!ref) return console.error('Project ref is required') if (!project) return console.error('Project is required') if (!profile) return console.error('Profile is required') if (!canCreateSQLSnippet) { return toast('Your queries will not be saved as you do not have sufficient permissions') } try { const snippet = createSqlSnippetSkeletonV2({ name, sql, owner_id: profile?.id, project_id: project?.id, }) snapV2.addSnippet({ projectRef: ref, snippet }) snapV2.addNeedsSaving(snippet.id) const tabId = createTabId('sql', { id: snippet.id }) tabs.addTab({ id: tabId, type: 'sql', label: name, metadata: { sqlId: snippet.id }, }) router.push(`/project/${ref}/sql/${snippet.id}`) } catch (error) { toast.error(`Failed to create new query: ${(error as ResponseError).message}`) } } return (
{(!!impersonatedUser || !!impersonatedExternalUser || impersonatingAnon) && ( Currently impersonating as
{impersonatingAnon ? (

Anonymous

) : (

{impersonatedUser?.email ?? impersonatedExternalUser}

)} {impersonatedAAL && {impersonatedAAL.toUpperCase()}}
{impersonatingAnon &&

Not logged-in

} {!!impersonatedUser && (

ID: {impersonatedUser.id}

)}
)}
{actions.map((item, i) => ( ))}
{editor === 'sql' && (
Templates Quickstarts
{templates.slice(0, 9).map((item, i) => ( { handleNewQuery(item.sql, item.title) sendEvent({ action: 'sql_editor_template_clicked', properties: { templateName: item.title }, groups: { project: ref ?? 'Unknown', organization: org?.slug ?? 'Unknown' }, }) }} bgColor="bg-alternative border" key={`action-card-${i}`} {...item} icon={ } /> ))}
{quickstarts.map((item, i) => ( { handleNewQuery(item.sql, item.title) sendEvent({ action: 'sql_editor_quickstart_clicked', properties: { quickstartName: item.title }, groups: { project: ref ?? 'Unknown', organization: org?.slug ?? 'Unknown' }, }) }} bgColor="bg-alternative border" key={`action-card-${i}`} {...item} icon={ } /> ))}
)}
) }