import { TooltipContent } from '@radix-ui/react-tooltip' import { PermissionAction } from '@supabase/shared-types/out/constants' import { MoreVertical, TrashIcon } from 'lucide-react' import { useState } from 'react' import { toast } from 'sonner' import { useParams } from 'common' import { useIsProjectActive } from 'components/layouts/ProjectLayout/ProjectContext' import Table from 'components/to-be-cleaned/Table' import CopyButton from 'components/ui/CopyButton' import { FormHeader } from 'components/ui/Forms/FormHeader' import NoPermission from 'components/ui/NoPermission' import { ProjectPausedAlert } from 'components/ui/ProjectPausedAlert' import { useCreateWarehouseAccessToken } from 'data/analytics/warehouse-access-tokens-create-mutation' import { useDeleteWarehouseAccessToken } from 'data/analytics/warehouse-access-tokens-delete-mutation' import { useWarehouseAccessTokensQuery } from 'data/analytics/warehouse-access-tokens-query' import { useCheckPermissions } from 'hooks/misc/useCheckPermissions' import { Button, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, Input, TooltipTrigger_Shadcn_, Tooltip_Shadcn_, cn, } from 'ui' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import CreateWarehouseAccessToken from './CreateWarehouseAccessToken' const AccessTokenItem = ({ token, id, description, onDeleteClick, inserted_at, }: { token: string id: number description: string inserted_at: string onDeleteClick: (id: number) => void }) => { const formattedInsertedAt = new Date(inserted_at).toLocaleString() const canDeleteAccessTokens = useCheckPermissions(PermissionAction.ANALYTICS_WRITE, 'logflare') return ( {description} {formattedInsertedAt}
{ if (canDeleteAccessTokens) { e.preventDefault() onDeleteClick(id) } }} > Revoke token {!canDeleteAccessTokens && ( You need additional permissions to delete access tokens )}
) } export const WarehouseAccessTokens = () => { const isProjectActive = useIsProjectActive() const params = useParams() const projectRef = params.ref as string const [open, setOpen] = useState(false) const canReadAccessTokens = useCheckPermissions(PermissionAction.ANALYTICS_WRITE, 'logflare') const accessTokensQuery = useWarehouseAccessTokensQuery( { projectRef }, { enabled: canReadAccessTokens } ) const hasAccessTokens = accessTokensQuery.isSuccess && accessTokensQuery.data.data.length > 0 const [tokenToDelete, setTokenToDelete] = useState(null) const [showDeleteDialog, setShowDeleteDialog] = useState(false) const { mutate: deleteWarehouseAccessToken, isLoading: deleteLoading } = useDeleteWarehouseAccessToken({ onSuccess: () => { toast.success('Access token revoked') }, onError: () => { toast.error('Failed to revoke access token') }, }) const { mutate: createWarehouseAccessToken, isLoading: createLoading } = useCreateWarehouseAccessToken({ onSuccess: () => { toast.success('Access token created') setOpen(false) }, }) const isLoading = deleteLoading || createLoading return (
{ createWarehouseAccessToken({ ref: projectRef, description: description, }) }} /> } /> {!canReadAccessTokens ? ( ) : (
{!isProjectActive ? ( ) : ( <> {accessTokensQuery.isLoading ? (
) : (
Description, Created at, Token, , ]} body={ hasAccessTokens ? ( accessTokensQuery.data.data.map((accessToken) => ( { setShowDeleteDialog(true) setTokenToDelete(accessToken.token) }} /> )) ) : (

No access tokens created

There are no access tokens associated with your project yet

) } /> )} )} )} Revoke warehouse access token This action is irreversible and requests made with these access tokens will stop working. ) } export default WarehouseAccessTokens