import { HelpCircle } from 'lucide-react' import Link from 'next/link' import { cn, HoverCard, HoverCardContent, HoverCardTrigger, Table, TableBody, TableCell, TableRow, } from 'ui' import { InfoTooltip } from 'ui-patterns/info-tooltip' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import AlertError from '@/components/ui/AlertError' import { type OrganizationBillingSubscriptionPreviewQueryResult } from '@/data/organizations/organization-billing-subscription-preview' import { DOCS_URL } from '@/lib/constants' import { formatCurrency } from '@/lib/helpers' const CELL_CLASSNAME = 'py-2 px-0' interface InvoiceEstimateTooltipProps { subscriptionPreviewQueryResult: OrganizationBillingSubscriptionPreviewQueryResult } export const InvoiceEstimateTooltip = ({ subscriptionPreviewQueryResult, }: InvoiceEstimateTooltipProps) => { const { data: subscriptionPreview, error: subscriptionPreviewError, isPending: subscriptionPreviewIsLoading, isSuccess: subscriptionPreviewInitialized, } = subscriptionPreviewQueryResult return (

Your new monthly invoice

First project included. Additional projects cost $10+/month regardless of activity.{' '} Learn more .

{subscriptionPreviewError && ( )} {subscriptionPreviewIsLoading && (
Estimating monthly costs...
)} {subscriptionPreviewInitialized && (
{/* Non-compute items and Projects list */} {(() => { // Combine all compute-related projects const computeItems = subscriptionPreview?.breakdown?.filter( (item) => item.description?.toLowerCase().includes('compute') && item.breakdown && item.breakdown.length > 0 ) || [] const computeCreditsItem = subscriptionPreview?.breakdown?.find((item) => item.description?.startsWith('Compute Credits') ) ?? null const planItem = subscriptionPreview?.breakdown?.find((item) => item.description?.toLowerCase().includes('plan') ) const allProjects = computeItems.flatMap((item) => (item.breakdown || []).map((project) => ({ ...project, computeType: item.description, computeCosts: Math.round(item.total_price / item.breakdown!.length), })) ) const otherItems = subscriptionPreview?.breakdown?.filter( (item) => !item.description?.toLowerCase().includes('compute') && !item.description?.toLowerCase().includes('plan') ) || [] const content = ( <> {planItem && ( {planItem.description} {formatCurrency(planItem.total_price)} )} {/* Combined projects section */} {allProjects.length > 0 && ( <> Compute {formatCurrency( computeItems.reduce( (sum: number, item) => sum + item.total_price, 0 ) + (computeCreditsItem?.total_price ?? 0) )} {allProjects.map((project) => (

{project.project_name} ({project.computeType})

{formatCurrency(project.computeCosts)}
))} {computeCreditsItem && ( Compute Credits {formatCurrency(computeCreditsItem.total_price)} )} )} {/* Non-compute items */} {otherItems.map((item) => (
{item.description ?? 'Unknown'} {item.breakdown && item.breakdown.length > 0 && (

Projects using {item.description}:

    {item.breakdown.map((breakdown) => (
  • {breakdown.project_name}
  • ))}
)}
{formatCurrency(item.total_price)}
))} ) return content })()} Total per month (excluding other usage) {formatCurrency( subscriptionPreview?.breakdown?.reduce( (prev, cur) => prev + cur.total_price, 0 ) ?? 0 )}
)}
) }