import { PermissionAction } from '@supabase/shared-types/out/constants' import { useDebounce } from '@uidotdev/usehooks' import { LOCAL_STORAGE_KEYS, useParams } from 'common' import { FilePlus, FolderPlus, Plus, X } from 'lucide-react' import { useRouter } from 'next/router' import { useEffect, useState } from 'react' import { toast } from 'sonner' import { Button, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, Tooltip, TooltipContent, TooltipTrigger, } from 'ui' import { InnerSideBarFilters, InnerSideBarFilterSearchInput, InnerSideBarFilterSortDropdown, InnerSideBarFilterSortDropdownItem, } from 'ui-patterns/InnerSideMenu' import { SearchList } from './SQLEditorNavV2/SearchList' import { SQLEditorNav } from './SQLEditorNavV2/SQLEditorNav' import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' import { useLocalStorage } from '@/hooks/misc/useLocalStorage' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' import { useProfile } from '@/lib/profile' import { getAppStateSnapshot } from '@/state/app-state' import { useSqlEditorV2StateSnapshot } from '@/state/sql-editor-v2' export const SQLEditorMenu = () => { const router = useRouter() const { ref } = useParams() const { profile } = useProfile() const { data: project } = useSelectedProjectQuery() const snapV2 = useSqlEditorV2StateSnapshot() const [search, setSearch] = useState('') const [showSearch, setShowSearch] = useState(false) const [sort, setSort] = useLocalStorage<'name' | 'inserted_at'>( LOCAL_STORAGE_KEYS.SQL_EDITOR_SORT(ref ?? ''), 'inserted_at' ) const appState = getAppStateSnapshot() const debouncedSearch = useDebounce(search, 500) const { can: canCreateSQLSnippet } = useAsyncCheckPermissions( PermissionAction.CREATE, 'user_content', { resource: { type: 'sql', owner_id: profile?.id }, subject: { id: profile?.id }, } ) const createNewFolder = () => { if (!ref) return console.error('Project ref is required') setSearch('') setShowSearch(false) snapV2.addNewFolder({ projectRef: ref }) } const handleNewQuery = async () => { 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 { router.push(`/project/${ref}/sql/new?skip=true`) setSearch('') setShowSearch(false) } catch (error: any) { toast.error(`Failed to create new query: ${error.message}`) } } useEffect(() => { setShowSearch(debouncedSearch.length > 0) }, [debouncedSearch]) return (