import { VStack, Tag, Text, Tooltip, useColorModeValue, theme, } from '@chakra-ui/react' import { useGroupsCoordinates } from '../../providers' import { useTypebot } from '@/features/editor' import { useWorkspace } from '@/features/workspace' import React, { useMemo } from 'react' import { byId, isDefined } from '@typebot.io/lib' import { isProPlan } from '@/features/billing' import { AnswersCount } from '@/features/analytics' import { computeSourceCoordinates, computeDropOffPath } from '../../utils' import { useEndpoints } from '../../providers/EndpointsProvider' type Props = { groupId: string answersCounts: AnswersCount[] onUnlockProPlanClick?: () => void } export const DropOffEdge = ({ answersCounts, groupId, onUnlockProPlanClick, }: Props) => { const dropOffColor = useColorModeValue( theme.colors.red[500], theme.colors.red[400] ) const { workspace } = useWorkspace() const { groupsCoordinates } = useGroupsCoordinates() const { sourceEndpointYOffsets: sourceEndpoints } = useEndpoints() const { publishedTypebot } = useTypebot() const isWorkspaceProPlan = isProPlan(workspace) const totalAnswers = useMemo( () => answersCounts.find((a) => a.groupId === groupId)?.totalAnswers, [answersCounts, groupId] ) const { totalDroppedUser, dropOffRate } = useMemo(() => { if (!publishedTypebot || totalAnswers === undefined) return { previousTotal: undefined, dropOffRate: undefined } const previousGroupIds = publishedTypebot.edges .map((edge) => edge.to.groupId === groupId ? edge.from.groupId : undefined ) .filter(isDefined) const previousTotal = answersCounts .filter((a) => previousGroupIds.includes(a.groupId)) .reduce((prev, acc) => acc.totalAnswers + prev, 0) if (previousTotal === 0) return { previousTotal: undefined, dropOffRate: undefined } const totalDroppedUser = previousTotal - totalAnswers return { totalDroppedUser, dropOffRate: Math.round((totalDroppedUser / previousTotal) * 100), } }, [answersCounts, groupId, totalAnswers, publishedTypebot]) const group = publishedTypebot?.groups.find(byId(groupId)) const sourceTop = useMemo(() => { const endpointId = group?.blocks[group.blocks.length - 1].id return endpointId ? sourceEndpoints.get(endpointId)?.y : undefined }, [group?.blocks, sourceEndpoints]) const labelCoordinates = useMemo(() => { if (!groupsCoordinates[groupId]) return return computeSourceCoordinates(groupsCoordinates[groupId], sourceTop ?? 0) }, [groupsCoordinates, groupId, sourceTop]) if (!labelCoordinates) return <> return ( <> {isWorkspaceProPlan ? ( dropOffRate ) : ( X )} % {isWorkspaceProPlan ? ( totalDroppedUser ) : ( NN )}{' '} users ) }