Skip to main content
Glama
flow-versions-card.tsx5.35 kB
import { DotsVerticalIcon } from '@radix-ui/react-icons'; import { t } from 'i18next'; import { Eye, EyeIcon, Pencil } from 'lucide-react'; import React, { useState } from 'react'; import { useBuilderStateContext } from '@/app/builder/builder-hooks'; import { CardListItem } from '@/components/custom/card-list'; import { useEmbedding } from '@/components/embed-provider'; import { Button } from '@/components/ui/button'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { Tooltip, TooltipContent, TooltipTrigger, } from '@/components/ui/tooltip'; import { UserAvatar } from '@/components/ui/user-avatar'; import { FlowVersionStateDot } from '@/features/flows/components/flow-version-state-dot'; import { flowHooks } from '@/features/flows/lib/flow-hooks'; import { useAuthorization } from '@/hooks/authorization-hooks'; import { formatUtils } from '@/lib/utils'; import { FlowVersionMetadata, FlowVersionState, Permission, } from '@activepieces/shared'; import { OverwriteDraftDialog } from './overwrite-draft-dialog'; const FlowVersionDetailsCard = React.memo( ({ flowVersion, selected, publishedVersionId, flowVersionNumber, }: FlowVersionDetailsCardProps) => { const { checkAccess } = useAuthorization(); const userHasPermissionToWriteFlow = checkAccess(Permission.WRITE_FLOW); const [setVersion, setReadonly] = useBuilderStateContext((state) => [ state.setVersion, state.setReadOnly, ]); const [dropdownMenuOpen, setDropdownMenuOpen] = useState(false); const { mutate: viewVersion, isPending } = flowHooks.useFetchFlowVersion({ onSuccess: (populatedFlowVersion) => { setVersion(populatedFlowVersion); setReadonly( populatedFlowVersion.state === FlowVersionState.LOCKED || !userHasPermissionToWriteFlow, ); }, }); const showAvatar = !useEmbedding().embedState.isEmbedded; return ( <CardListItem interactive={false} className="px-4"> {showAvatar && flowVersion.updatedByUser && ( <UserAvatar size={28} name={ flowVersion.updatedByUser.firstName + ' ' + flowVersion.updatedByUser.lastName } email={flowVersion.updatedByUser.email} /> )} <div className="grid gap-2"> <p className="text-sm font-medium leading-none select-none pointer-events-none"> {formatUtils.formatDateWithTime( new Date(flowVersion.created), true, )} </p> <p className="flex gap-1 text-xs text-muted-foreground"> {t('Version')} #{flowVersionNumber} </p> </div> <div className="grow"></div> <div className="flex font-medium gap-2 justify-center items-center"> {selected && ( <Tooltip> <TooltipTrigger asChild> <div className="size-10 flex justify-center items-center"> <EyeIcon className="w-5 h-5 "></EyeIcon> </div> </TooltipTrigger> <TooltipContent>{t('Viewing')}</TooltipContent> </Tooltip> )} <FlowVersionStateDot state={flowVersion.state} versionId={flowVersion.id} publishedVersionId={publishedVersionId} ></FlowVersionStateDot> <DropdownMenu onOpenChange={(open) => setDropdownMenuOpen(open)} open={dropdownMenuOpen} > <DropdownMenuTrigger asChild> <Button variant="ghost" disabled={isPending} size={'icon'}> <DotsVerticalIcon /> </Button> </DropdownMenuTrigger> <DropdownMenuContent className="w-40"> <DropdownMenuItem onClick={() => viewVersion(flowVersion)} className="w-full" > <Eye className="mr-2 h-4 w-4" /> <span>{t('View')}</span> </DropdownMenuItem> {flowVersion.state !== FlowVersionState.DRAFT && ( <OverwriteDraftDialog versionNumber={flowVersionNumber.toString()} versionId={flowVersion.id} onConfirm={() => { setDropdownMenuOpen(false); }} > <DropdownMenuItem className="w-full" onSelect={(e) => { e.preventDefault(); }} disabled={!userHasPermissionToWriteFlow} > <Pencil className="mr-2 h-4 w-4" /> <span>{t('Use as Draft')}</span> </DropdownMenuItem> </OverwriteDraftDialog> )} </DropdownMenuContent> </DropdownMenu> </div> </CardListItem> ); }, ); FlowVersionDetailsCard.displayName = 'FlowVersionDetailsCard'; export { FlowVersionDetailsCard }; type FlowVersionDetailsCardProps = { flowVersion: FlowVersionMetadata; selected: boolean; publishedVersionId: string | undefined | null; flowVersionNumber: number; };

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/activepieces/activepieces'

If you have feedback or need assistance with the MCP directory API, please join our Discord server