import { PermissionAction } from '@supabase/shared-types/out/constants'
import { IS_PLATFORM, useParams } from 'common'
import { Copy, Download, Edit, MoreHorizontal, Share, Trash } from 'lucide-react'
import { useRouter } from 'next/router'
import toast from 'react-hot-toast'
import {
Button,
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from 'ui'
import { createSqlSnippetSkeleton } from 'components/interfaces/SQLEditor/SQLEditor.utils'
import type { SqlSnippet } from 'data/content/sql-snippets-query'
import { useCheckPermissions } from 'hooks/misc/useCheckPermissions'
import { useSelectedProject } from 'hooks/misc/useSelectedProject'
import { uuidv4 } from 'lib/helpers'
import { useProfile } from 'lib/profile'
import { useSqlEditorStateSnapshot } from 'state/sql-editor'
interface QueryItemActionsProps {
tabInfo: SqlSnippet
open: boolean
setOpen: (value: boolean) => void
onSelectRenameQuery: () => void
onSelectDeleteQuery: () => void
onSelectShareQuery: () => void
onSelectDownloadQuery: () => void
}
export const QueryItemActions = ({
tabInfo,
open,
setOpen,
onSelectRenameQuery,
onSelectDeleteQuery,
onSelectShareQuery,
onSelectDownloadQuery,
}: QueryItemActionsProps) => {
const { ref } = useParams()
const router = useRouter()
const { profile } = useProfile()
const snap = useSqlEditorStateSnapshot()
const project = useSelectedProject()
const { id, name, visibility, content } = tabInfo || {}
const canCreateSQLSnippet = useCheckPermissions(PermissionAction.CREATE, 'user_content', {
resource: { type: 'sql', owner_id: profile?.id },
subject: { id: profile?.id },
})
const { id: snippetID } = tabInfo || {}
const snippet =
snippetID !== undefined && snap.snippets && snap.snippets[snippetID] !== undefined
? snap.snippets[snippetID]
: null
const isSnippetOwner = profile?.id === snippet?.snippet.owner_id
const onClickRename = (e: any) => {
e.stopPropagation()
onSelectRenameQuery()
}
const onClickShare = (e: any) => {
e.stopPropagation()
onSelectShareQuery()
}
const onClickDelete = (e: any) => {
e.stopPropagation()
onSelectDeleteQuery()
}
const createPersonalCopy = async () => {
if (!ref) return console.error('Project ref is required')
if (!id) return console.error('Snippet ID is required')
try {
const snippet = createSqlSnippetSkeleton({
id: uuidv4(),
name,
sql: content.sql,
owner_id: profile?.id,
project_id: project?.id,
})
snap.addSnippet(snippet as SqlSnippet, ref)
snap.addNeedsSaving(snippet.id!)
router.push(`/project/${ref}/sql/${snippet.id}`)
} catch (error: any) {
toast.error(`Failed to create a personal copy of this query: ${error.message}`)
}
}
return (
<>
{IS_PLATFORM ? (
}
onClick={(e) => e.preventDefault()}
/>
{isSnippetOwner && (
Rename query
)}
{visibility === 'user' && canCreateSQLSnippet && (
Share query
)}
{visibility === 'project' && canCreateSQLSnippet && (
Duplicate personal copy
)}
{IS_PLATFORM && (
onSelectDownloadQuery()} className="flex gap-2">
Download as migration file
)}
{isSnippetOwner && (
<>
Delete query
>
)}
) : (
)}
>
)
}